Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
5 #include <ctype.h>
6 #include <bio.h>
7 #include "imagefile.h"
9 void
10 usage(void)
11 {
12 fprint(2, "usage: toppm [-c 'comment'] [file]\n");
13 exits("usage");
14 }
16 void
17 main(int argc, char *argv[])
18 {
19 Biobuf bout;
20 Memimage *i, *ni;
21 int fd;
22 char buf[256];
23 char *err, *comment;
25 comment = nil;
26 ARGBEGIN{
27 case 'c':
28 comment = ARGF();
29 if(comment == nil)
30 usage();
31 if(strchr(comment, '\n') != nil){
32 fprint(2, "ppm: comment cannot contain newlines\n");
33 usage();
34 }
35 break;
36 default:
37 usage();
38 }ARGEND
40 if(argc > 1)
41 usage();
43 if(Binit(&bout, 1, OWRITE) < 0)
44 sysfatal("Binit failed: %r");
46 memimageinit();
48 err = nil;
50 if(argc == 0){
51 i = readmemimage(0);
52 if(i == nil)
53 sysfatal("reading input: %r");
54 ni = memmultichan(i);
55 if(ni == nil)
56 sysfatal("converting image to RGBV: %r");
57 if(i != ni){
58 freememimage(i);
59 i = ni;
60 }
61 if(err == nil)
62 err = memwriteppm(&bout, i, comment);
63 }else{
64 fd = open(argv[0], OREAD);
65 if(fd < 0)
66 sysfatal("can't open %s: %r", argv[0]);
67 i = readmemimage(fd);
68 if(i == nil)
69 sysfatal("can't readimage %s: %r", argv[0]);
70 close(fd);
71 ni = memmultichan(i);
72 if(ni == nil)
73 sysfatal("converting image to RGBV: %r");
74 if(i != ni){
75 freememimage(i);
76 i = ni;
77 }
78 if(comment)
79 err = memwriteppm(&bout, i, comment);
80 else{
81 snprint(buf, sizeof buf, "Converted by Plan 9 from %s", argv[0]);
82 err = memwriteppm(&bout, i, buf);
83 }
84 freememimage(i);
85 }
87 if(err != nil)
88 fprint(2, "toppm: %s\n", err);
89 exits(err);
90 }