xref: /plan9-contrib/sys/src/cmd/iconv.c (revision 6a9fc400c33447ef5e1cda7185cb4de2c8e8010e)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <memdraw.h>
57dd7cddfSDavid du Colombier 
67dd7cddfSDavid du Colombier void
usage(void)77dd7cddfSDavid du Colombier usage(void)
87dd7cddfSDavid du Colombier {
97dd7cddfSDavid du Colombier 	fprint(2, "usage: iconv [-u] [-c chanstr] [file]\n");
107dd7cddfSDavid du Colombier 	exits("usage");
117dd7cddfSDavid du Colombier }
127dd7cddfSDavid du Colombier 
137dd7cddfSDavid du Colombier void
writeuncompressed(int fd,Memimage * m)147dd7cddfSDavid du Colombier writeuncompressed(int fd, Memimage *m)
157dd7cddfSDavid du Colombier {
167dd7cddfSDavid du Colombier 	char chanstr[32];
177dd7cddfSDavid du Colombier 	int bpl, y, j;
187dd7cddfSDavid du Colombier 	uchar *buf;
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier 	if(chantostr(chanstr, m->chan) == nil)
217dd7cddfSDavid du Colombier 		sysfatal("can't convert channel descriptor: %r");
227dd7cddfSDavid du Colombier 	fprint(fd, "%11s %11d %11d %11d %11d ",
237dd7cddfSDavid du Colombier 		chanstr, m->r.min.x, m->r.min.y, m->r.max.x, m->r.max.y);
247dd7cddfSDavid du Colombier 
257dd7cddfSDavid du Colombier 	bpl = bytesperline(m->r, m->depth);
267dd7cddfSDavid du Colombier 	buf = malloc(bpl);
277dd7cddfSDavid du Colombier 	if(buf == nil)
287dd7cddfSDavid du Colombier 		sysfatal("malloc failed: %r");
297dd7cddfSDavid du Colombier 	for(y=m->r.min.y; y<m->r.max.y; y++){
307dd7cddfSDavid du Colombier 		j = unloadmemimage(m, Rect(m->r.min.x, y, m->r.max.x, y+1), buf, bpl);
317dd7cddfSDavid du Colombier 		if(j != bpl)
327dd7cddfSDavid du Colombier 			sysfatal("image unload failed: %r");
337dd7cddfSDavid du Colombier 		if(write(fd, buf, bpl) != bpl)
347dd7cddfSDavid du Colombier 			sysfatal("write failed: %r");
357dd7cddfSDavid du Colombier 	}
367dd7cddfSDavid du Colombier 	free(buf);
377dd7cddfSDavid du Colombier }
387dd7cddfSDavid du Colombier 
397dd7cddfSDavid du Colombier void
main(int argc,char * argv[])407dd7cddfSDavid du Colombier main(int argc, char *argv[])
417dd7cddfSDavid du Colombier {
427dd7cddfSDavid du Colombier 	char *tostr, *file;
437dd7cddfSDavid du Colombier 	int fd, uncompressed;
447dd7cddfSDavid du Colombier 	ulong tochan;
457dd7cddfSDavid du Colombier 	Memimage *m, *n;
467dd7cddfSDavid du Colombier 
477dd7cddfSDavid du Colombier 	tostr = nil;
487dd7cddfSDavid du Colombier 	uncompressed = 0;
497dd7cddfSDavid du Colombier 	ARGBEGIN{
507dd7cddfSDavid du Colombier 	case 'c':
5159cc4ca5SDavid du Colombier 		tostr = EARGF(usage());
527dd7cddfSDavid du Colombier 		break;
537dd7cddfSDavid du Colombier 	case 'u':
547dd7cddfSDavid du Colombier 		uncompressed = 1;
557dd7cddfSDavid du Colombier 		break;
567dd7cddfSDavid du Colombier 	default:
577dd7cddfSDavid du Colombier 		usage();
587dd7cddfSDavid du Colombier 	}ARGEND
597dd7cddfSDavid du Colombier 
607dd7cddfSDavid du Colombier 	memimageinit();
617dd7cddfSDavid du Colombier 
627dd7cddfSDavid du Colombier 	file = "<stdin>";
637dd7cddfSDavid du Colombier 	m = nil;
647dd7cddfSDavid du Colombier 
657dd7cddfSDavid du Colombier 	switch(argc){
667dd7cddfSDavid du Colombier 	case 0:
677dd7cddfSDavid du Colombier 		m = readmemimage(0);
687dd7cddfSDavid du Colombier 		break;
697dd7cddfSDavid du Colombier 	case 1:
707dd7cddfSDavid du Colombier 		file = argv[0];
717dd7cddfSDavid du Colombier 		fd = open(file, OREAD);
727dd7cddfSDavid du Colombier 		if(fd < 0)
737dd7cddfSDavid du Colombier 			sysfatal("can't open %s: %r", file);
747dd7cddfSDavid du Colombier 		m = readmemimage(fd);
757dd7cddfSDavid du Colombier 		close(fd);
767dd7cddfSDavid du Colombier 		break;
777dd7cddfSDavid du Colombier 	default:
787dd7cddfSDavid du Colombier 		usage();
797dd7cddfSDavid du Colombier 	}
807dd7cddfSDavid du Colombier 
817dd7cddfSDavid du Colombier 	if(m == nil)
827dd7cddfSDavid du Colombier 		sysfatal("can't read %s: %r", file);
837dd7cddfSDavid du Colombier 
847dd7cddfSDavid du Colombier 	if(tostr == nil)
857dd7cddfSDavid du Colombier 		tochan = m->chan;
867dd7cddfSDavid du Colombier 	else{
877dd7cddfSDavid du Colombier 		tochan = strtochan(tostr);
887dd7cddfSDavid du Colombier 		if(tochan == 0)
897dd7cddfSDavid du Colombier 			sysfatal("bad channel descriptor '%s'", tostr);
907dd7cddfSDavid du Colombier 	}
917dd7cddfSDavid du Colombier 
927dd7cddfSDavid du Colombier 	n = allocmemimage(m->r, tochan);
937dd7cddfSDavid du Colombier 	if(n == nil)
947dd7cddfSDavid du Colombier 		sysfatal("can't allocate new image: %r");
957dd7cddfSDavid du Colombier 
96*6a9fc400SDavid du Colombier 	memimagedraw(n, n->r, m, m->r.min, nil, ZP, S);
977dd7cddfSDavid du Colombier 	if(uncompressed)
987dd7cddfSDavid du Colombier 		writeuncompressed(1, n);
997dd7cddfSDavid du Colombier 	else
1007dd7cddfSDavid du Colombier 		writememimage(1, n);
1017dd7cddfSDavid du Colombier 	exits(nil);
1027dd7cddfSDavid du Colombier }
103