| #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); |
| } |