toppm.c (1571B)
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" 8 9 void 10 usage(void) 11 { 12 fprint(2, "usage: toppm [-c 'comment'] [file]\n"); 13 exits("usage"); 14 } 15 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; 24 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 39 40 if(argc > 1) 41 usage(); 42 43 if(Binit(&bout, 1, OWRITE) < 0) 44 sysfatal("Binit failed: %r"); 45 46 memimageinit(); 47 48 err = nil; 49 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 } 86 87 if(err != nil) 88 fprint(2, "toppm: %s\n", err); 89 exits(err); 90 }