diff options
Diffstat (limited to 'src/cmd/jpg/toppm.c')
-rw-r--r-- | src/cmd/jpg/toppm.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/cmd/jpg/toppm.c b/src/cmd/jpg/toppm.c new file mode 100644 index 00000000..e3094655 --- /dev/null +++ b/src/cmd/jpg/toppm.c @@ -0,0 +1,90 @@ +#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); +} |