1 c8b6342d 2005-01-13 devnull #include <u.h>
2 c8b6342d 2005-01-13 devnull #include <libc.h>
3 c8b6342d 2005-01-13 devnull #include <draw.h>
4 c8b6342d 2005-01-13 devnull #include <memdraw.h>
7 c8b6342d 2005-01-13 devnull usage(void)
9 c8b6342d 2005-01-13 devnull fprint(2, "usage: iconv [-u] [-c chanstr] [file]\n");
10 c8b6342d 2005-01-13 devnull exits("usage");
14 c8b6342d 2005-01-13 devnull writeuncompressed(int fd, Memimage *m)
16 c8b6342d 2005-01-13 devnull char chanstr[32];
17 c8b6342d 2005-01-13 devnull int bpl, y, j;
18 c8b6342d 2005-01-13 devnull uchar *buf;
20 c8b6342d 2005-01-13 devnull if(chantostr(chanstr, m->chan) == nil)
21 c8b6342d 2005-01-13 devnull sysfatal("can't convert channel descriptor: %r");
22 c8b6342d 2005-01-13 devnull fprint(fd, "%11s %11d %11d %11d %11d ",
23 c8b6342d 2005-01-13 devnull chanstr, m->r.min.x, m->r.min.y, m->r.max.x, m->r.max.y);
25 c8b6342d 2005-01-13 devnull bpl = bytesperline(m->r, m->depth);
26 c8b6342d 2005-01-13 devnull buf = malloc(bpl);
27 c8b6342d 2005-01-13 devnull if(buf == nil)
28 c8b6342d 2005-01-13 devnull sysfatal("malloc failed: %r");
29 c8b6342d 2005-01-13 devnull for(y=m->r.min.y; y<m->r.max.y; y++){
30 c8b6342d 2005-01-13 devnull j = unloadmemimage(m, Rect(m->r.min.x, y, m->r.max.x, y+1), buf, bpl);
31 c8b6342d 2005-01-13 devnull if(j != bpl)
32 c8b6342d 2005-01-13 devnull sysfatal("image unload failed: %r");
33 c8b6342d 2005-01-13 devnull if(write(fd, buf, bpl) != bpl)
34 c8b6342d 2005-01-13 devnull sysfatal("write failed: %r");
36 c8b6342d 2005-01-13 devnull free(buf);
40 c8b6342d 2005-01-13 devnull main(int argc, char *argv[])
42 c8b6342d 2005-01-13 devnull char *tostr, *file;
43 c8b6342d 2005-01-13 devnull int fd, uncompressed;
44 c8b6342d 2005-01-13 devnull ulong tochan;
45 c8b6342d 2005-01-13 devnull Memimage *m, *n;
47 c8b6342d 2005-01-13 devnull tostr = nil;
48 c8b6342d 2005-01-13 devnull uncompressed = 0;
49 c8b6342d 2005-01-13 devnull ARGBEGIN{
50 c8b6342d 2005-01-13 devnull case 'c':
51 c8b6342d 2005-01-13 devnull tostr = EARGF(usage());
53 c8b6342d 2005-01-13 devnull case 'u':
54 c8b6342d 2005-01-13 devnull uncompressed = 1;
60 c8b6342d 2005-01-13 devnull memimageinit();
62 c8b6342d 2005-01-13 devnull file = "<stdin>";
65 c8b6342d 2005-01-13 devnull switch(argc){
67 c8b6342d 2005-01-13 devnull m = readmemimage(0);
70 c8b6342d 2005-01-13 devnull file = argv[0];
71 c8b6342d 2005-01-13 devnull fd = open(file, OREAD);
72 c8b6342d 2005-01-13 devnull if(fd < 0)
73 c8b6342d 2005-01-13 devnull sysfatal("can't open %s: %r", file);
74 c8b6342d 2005-01-13 devnull m = readmemimage(fd);
75 c8b6342d 2005-01-13 devnull close(fd);
81 c8b6342d 2005-01-13 devnull if(m == nil)
82 c8b6342d 2005-01-13 devnull sysfatal("can't read %s: %r", file);
84 c8b6342d 2005-01-13 devnull if(tostr == nil)
85 c8b6342d 2005-01-13 devnull tochan = m->chan;
87 c8b6342d 2005-01-13 devnull tochan = strtochan(tostr);
88 c8b6342d 2005-01-13 devnull if(tochan == 0)
89 c8b6342d 2005-01-13 devnull sysfatal("bad channel descriptor '%s'", tostr);
92 c8b6342d 2005-01-13 devnull n = allocmemimage(m->r, tochan);
93 c8b6342d 2005-01-13 devnull if(n == nil)
94 c8b6342d 2005-01-13 devnull sysfatal("can't allocate new image: %r");
96 c8b6342d 2005-01-13 devnull memimagedraw(n, n->r, m, m->r.min, nil, ZP, S);
97 c8b6342d 2005-01-13 devnull if(uncompressed)
98 c8b6342d 2005-01-13 devnull writeuncompressed(1, n);
100 c8b6342d 2005-01-13 devnull writememimage(1, n);
101 c8b6342d 2005-01-13 devnull exits(nil);