xref: /plan9/sys/src/cmd/jpg/toppm.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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