xref: /plan9/sys/src/cmd/iconv.c (revision 6a9fc400c33447ef5e1cda7185cb4de2c8e8010e)
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
5 
6 void
usage(void)7 usage(void)
8 {
9 	fprint(2, "usage: iconv [-u] [-c chanstr] [file]\n");
10 	exits("usage");
11 }
12 
13 void
writeuncompressed(int fd,Memimage * m)14 writeuncompressed(int fd, Memimage *m)
15 {
16 	char chanstr[32];
17 	int bpl, y, j;
18 	uchar *buf;
19 
20 	if(chantostr(chanstr, m->chan) == nil)
21 		sysfatal("can't convert channel descriptor: %r");
22 	fprint(fd, "%11s %11d %11d %11d %11d ",
23 		chanstr, m->r.min.x, m->r.min.y, m->r.max.x, m->r.max.y);
24 
25 	bpl = bytesperline(m->r, m->depth);
26 	buf = malloc(bpl);
27 	if(buf == nil)
28 		sysfatal("malloc failed: %r");
29 	for(y=m->r.min.y; y<m->r.max.y; y++){
30 		j = unloadmemimage(m, Rect(m->r.min.x, y, m->r.max.x, y+1), buf, bpl);
31 		if(j != bpl)
32 			sysfatal("image unload failed: %r");
33 		if(write(fd, buf, bpl) != bpl)
34 			sysfatal("write failed: %r");
35 	}
36 	free(buf);
37 }
38 
39 void
main(int argc,char * argv[])40 main(int argc, char *argv[])
41 {
42 	char *tostr, *file;
43 	int fd, uncompressed;
44 	ulong tochan;
45 	Memimage *m, *n;
46 
47 	tostr = nil;
48 	uncompressed = 0;
49 	ARGBEGIN{
50 	case 'c':
51 		tostr = EARGF(usage());
52 		break;
53 	case 'u':
54 		uncompressed = 1;
55 		break;
56 	default:
57 		usage();
58 	}ARGEND
59 
60 	memimageinit();
61 
62 	file = "<stdin>";
63 	m = nil;
64 
65 	switch(argc){
66 	case 0:
67 		m = readmemimage(0);
68 		break;
69 	case 1:
70 		file = argv[0];
71 		fd = open(file, OREAD);
72 		if(fd < 0)
73 			sysfatal("can't open %s: %r", file);
74 		m = readmemimage(fd);
75 		close(fd);
76 		break;
77 	default:
78 		usage();
79 	}
80 
81 	if(m == nil)
82 		sysfatal("can't read %s: %r", file);
83 
84 	if(tostr == nil)
85 		tochan = m->chan;
86 	else{
87 		tochan = strtochan(tostr);
88 		if(tochan == 0)
89 			sysfatal("bad channel descriptor '%s'", tostr);
90 	}
91 
92 	n = allocmemimage(m->r, tochan);
93 	if(n == nil)
94 		sysfatal("can't allocate new image: %r");
95 
96 	memimagedraw(n, n->r, m, m->r.min, nil, ZP, S);
97 	if(uncompressed)
98 		writeuncompressed(1, n);
99 	else
100 		writememimage(1, n);
101 	exits(nil);
102 }
103