1*7dd7cddfSDavid du Colombier #include <u.h>
2*7dd7cddfSDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <draw.h>
4*7dd7cddfSDavid du Colombier #include <memdraw.h>
5*7dd7cddfSDavid du Colombier #include <ctype.h>
6*7dd7cddfSDavid du Colombier #include <bio.h>
7*7dd7cddfSDavid du Colombier #include "imagefile.h"
8*7dd7cddfSDavid du Colombier
9*7dd7cddfSDavid du Colombier void
usage(void)10*7dd7cddfSDavid du Colombier usage(void)
11*7dd7cddfSDavid du Colombier {
12*7dd7cddfSDavid du Colombier fprint(2, "usage: toppm [-c 'comment'] [file]\n");
13*7dd7cddfSDavid du Colombier exits("usage");
14*7dd7cddfSDavid du Colombier }
15*7dd7cddfSDavid du Colombier
16*7dd7cddfSDavid du Colombier void
main(int argc,char * argv[])17*7dd7cddfSDavid du Colombier main(int argc, char *argv[])
18*7dd7cddfSDavid du Colombier {
19*7dd7cddfSDavid du Colombier Biobuf bout;
20*7dd7cddfSDavid du Colombier Memimage *i, *ni;
21*7dd7cddfSDavid du Colombier int fd;
22*7dd7cddfSDavid du Colombier char buf[256];
23*7dd7cddfSDavid du Colombier char *err, *comment;
24*7dd7cddfSDavid du Colombier
25*7dd7cddfSDavid du Colombier comment = nil;
26*7dd7cddfSDavid du Colombier ARGBEGIN{
27*7dd7cddfSDavid du Colombier case 'c':
28*7dd7cddfSDavid du Colombier comment = ARGF();
29*7dd7cddfSDavid du Colombier if(comment == nil)
30*7dd7cddfSDavid du Colombier usage();
31*7dd7cddfSDavid du Colombier if(strchr(comment, '\n') != nil){
32*7dd7cddfSDavid du Colombier fprint(2, "ppm: comment cannot contain newlines\n");
33*7dd7cddfSDavid du Colombier usage();
34*7dd7cddfSDavid du Colombier }
35*7dd7cddfSDavid du Colombier break;
36*7dd7cddfSDavid du Colombier default:
37*7dd7cddfSDavid du Colombier usage();
38*7dd7cddfSDavid du Colombier }ARGEND
39*7dd7cddfSDavid du Colombier
40*7dd7cddfSDavid du Colombier if(argc > 1)
41*7dd7cddfSDavid du Colombier usage();
42*7dd7cddfSDavid du Colombier
43*7dd7cddfSDavid du Colombier if(Binit(&bout, 1, OWRITE) < 0)
44*7dd7cddfSDavid du Colombier sysfatal("Binit failed: %r");
45*7dd7cddfSDavid du Colombier
46*7dd7cddfSDavid du Colombier memimageinit();
47*7dd7cddfSDavid du Colombier
48*7dd7cddfSDavid du Colombier err = nil;
49*7dd7cddfSDavid du Colombier
50*7dd7cddfSDavid du Colombier if(argc == 0){
51*7dd7cddfSDavid du Colombier i = readmemimage(0);
52*7dd7cddfSDavid du Colombier if(i == nil)
53*7dd7cddfSDavid du Colombier sysfatal("reading input: %r");
54*7dd7cddfSDavid du Colombier ni = memmultichan(i);
55*7dd7cddfSDavid du Colombier if(ni == nil)
56*7dd7cddfSDavid du Colombier sysfatal("converting image to RGBV: %r");
57*7dd7cddfSDavid du Colombier if(i != ni){
58*7dd7cddfSDavid du Colombier freememimage(i);
59*7dd7cddfSDavid du Colombier i = ni;
60*7dd7cddfSDavid du Colombier }
61*7dd7cddfSDavid du Colombier if(err == nil)
62*7dd7cddfSDavid du Colombier err = memwriteppm(&bout, i, comment);
63*7dd7cddfSDavid du Colombier }else{
64*7dd7cddfSDavid du Colombier fd = open(argv[0], OREAD);
65*7dd7cddfSDavid du Colombier if(fd < 0)
66*7dd7cddfSDavid du Colombier sysfatal("can't open %s: %r", argv[0]);
67*7dd7cddfSDavid du Colombier i = readmemimage(fd);
68*7dd7cddfSDavid du Colombier if(i == nil)
69*7dd7cddfSDavid du Colombier sysfatal("can't readimage %s: %r", argv[0]);
70*7dd7cddfSDavid du Colombier close(fd);
71*7dd7cddfSDavid du Colombier ni = memmultichan(i);
72*7dd7cddfSDavid du Colombier if(ni == nil)
73*7dd7cddfSDavid du Colombier sysfatal("converting image to RGBV: %r");
74*7dd7cddfSDavid du Colombier if(i != ni){
75*7dd7cddfSDavid du Colombier freememimage(i);
76*7dd7cddfSDavid du Colombier i = ni;
77*7dd7cddfSDavid du Colombier }
78*7dd7cddfSDavid du Colombier if(comment)
79*7dd7cddfSDavid du Colombier err = memwriteppm(&bout, i, comment);
80*7dd7cddfSDavid du Colombier else{
81*7dd7cddfSDavid du Colombier snprint(buf, sizeof buf, "Converted by Plan 9 from %s", argv[0]);
82*7dd7cddfSDavid du Colombier err = memwriteppm(&bout, i, buf);
83*7dd7cddfSDavid du Colombier }
84*7dd7cddfSDavid du Colombier freememimage(i);
85*7dd7cddfSDavid du Colombier }
86*7dd7cddfSDavid du Colombier
87*7dd7cddfSDavid du Colombier if(err != nil)
88*7dd7cddfSDavid du Colombier fprint(2, "toppm: %s\n", err);
89*7dd7cddfSDavid du Colombier exits(err);
90*7dd7cddfSDavid du Colombier }
91