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 void10 usage(void)11 {12 fprint(2, "usage: toppm [-c 'comment'] [file]\n");13 exits("usage");14 }16 void17 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 }ARGEND40 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 }