xref: /plan9-contrib/sys/src/cmd/jpg/toppm.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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"
8 
9 void
usage(void)10 usage(void)
11 {
12 	fprint(2, "usage: toppm [-c 'comment'] [file]\n");
13 	exits("usage");
14 }
15 
16 void
main(int argc,char * argv[])17 main(int argc, char *argv[])
18 {
19 	Biobuf bout;
20 	Memimage *i, *ni;
21 	int fd;
22 	char buf[256];
23 	char *err, *comment;
24 
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 	}ARGEND
39 
40 	if(argc > 1)
41 		usage();
42 
43 	if(Binit(&bout, 1, OWRITE) < 0)
44 		sysfatal("Binit failed: %r");
45 
46 	memimageinit();
47 
48 	err = nil;
49 
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 	}
86 
87 	if(err != nil)
88 		fprint(2, "toppm: %s\n", err);
89 	exits(err);
90 }
91