|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <draw.h> | 
|  | #include <memdraw.h> | 
|  | #include <ctype.h> | 
|  | #include <bio.h> | 
|  | #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); | 
|  | } |