#include #include #include #include #include #include #include "imagefile.h" void usage(void) { fprint(2, "usage: toppm [-c 'comment'] [file]\n"); exits("usage"); } void main(int argc, char *argv[]) { Biobuf bout; Memimage *i, *ni; int fd; char buf[256]; char *err, *comment; comment = nil; ARGBEGIN{ case 'c': comment = ARGF(); if(comment == nil) usage(); if(strchr(comment, '\n') != nil){ fprint(2, "ppm: comment cannot contain newlines\n"); usage(); } break; default: usage(); }ARGEND if(argc > 1) usage(); if(Binit(&bout, 1, OWRITE) < 0) sysfatal("Binit failed: %r"); memimageinit(); err = nil; if(argc == 0){ i = readmemimage(0); if(i == nil) sysfatal("reading input: %r"); ni = memmultichan(i); if(ni == nil) sysfatal("converting image to RGBV: %r"); if(i != ni){ freememimage(i); i = ni; } if(err == nil) err = memwriteppm(&bout, i, comment); }else{ fd = open(argv[0], OREAD); if(fd < 0) sysfatal("can't open %s: %r", argv[0]); i = readmemimage(fd); if(i == nil) sysfatal("can't readimage %s: %r", argv[0]); close(fd); ni = memmultichan(i); if(ni == nil) sysfatal("converting image to RGBV: %r"); if(i != ni){ freememimage(i); i = ni; } if(comment) err = memwriteppm(&bout, i, comment); else{ snprint(buf, sizeof buf, "Converted by Plan 9 from %s", argv[0]); err = memwriteppm(&bout, i, buf); } freememimage(i); } if(err != nil) fprint(2, "toppm: %s\n", err); exits(err); }