Blame


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>
5 c8b6342d 2005-01-13 devnull
6 c8b6342d 2005-01-13 devnull void
7 c8b6342d 2005-01-13 devnull usage(void)
8 c8b6342d 2005-01-13 devnull {
9 c8b6342d 2005-01-13 devnull fprint(2, "usage: iconv [-u] [-c chanstr] [file]\n");
10 c8b6342d 2005-01-13 devnull exits("usage");
11 c8b6342d 2005-01-13 devnull }
12 c8b6342d 2005-01-13 devnull
13 c8b6342d 2005-01-13 devnull void
14 c8b6342d 2005-01-13 devnull writeuncompressed(int fd, Memimage *m)
15 c8b6342d 2005-01-13 devnull {
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;
19 c8b6342d 2005-01-13 devnull
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);
24 c8b6342d 2005-01-13 devnull
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");
35 c8b6342d 2005-01-13 devnull }
36 c8b6342d 2005-01-13 devnull free(buf);
37 c8b6342d 2005-01-13 devnull }
38 c8b6342d 2005-01-13 devnull
39 c8b6342d 2005-01-13 devnull void
40 c8b6342d 2005-01-13 devnull main(int argc, char *argv[])
41 c8b6342d 2005-01-13 devnull {
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;
46 c8b6342d 2005-01-13 devnull
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());
52 c8b6342d 2005-01-13 devnull break;
53 c8b6342d 2005-01-13 devnull case 'u':
54 c8b6342d 2005-01-13 devnull uncompressed = 1;
55 c8b6342d 2005-01-13 devnull break;
56 c8b6342d 2005-01-13 devnull default:
57 c8b6342d 2005-01-13 devnull usage();
58 c8b6342d 2005-01-13 devnull }ARGEND
59 c8b6342d 2005-01-13 devnull
60 c8b6342d 2005-01-13 devnull memimageinit();
61 c8b6342d 2005-01-13 devnull
62 c8b6342d 2005-01-13 devnull file = "<stdin>";
63 c8b6342d 2005-01-13 devnull m = nil;
64 c8b6342d 2005-01-13 devnull
65 c8b6342d 2005-01-13 devnull switch(argc){
66 c8b6342d 2005-01-13 devnull case 0:
67 c8b6342d 2005-01-13 devnull m = readmemimage(0);
68 c8b6342d 2005-01-13 devnull break;
69 c8b6342d 2005-01-13 devnull case 1:
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);
76 c8b6342d 2005-01-13 devnull break;
77 c8b6342d 2005-01-13 devnull default:
78 c8b6342d 2005-01-13 devnull usage();
79 c8b6342d 2005-01-13 devnull }
80 c8b6342d 2005-01-13 devnull
81 c8b6342d 2005-01-13 devnull if(m == nil)
82 c8b6342d 2005-01-13 devnull sysfatal("can't read %s: %r", file);
83 c8b6342d 2005-01-13 devnull
84 c8b6342d 2005-01-13 devnull if(tostr == nil)
85 c8b6342d 2005-01-13 devnull tochan = m->chan;
86 c8b6342d 2005-01-13 devnull else{
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);
90 c8b6342d 2005-01-13 devnull }
91 c8b6342d 2005-01-13 devnull
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");
95 c8b6342d 2005-01-13 devnull
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);
99 c8b6342d 2005-01-13 devnull else
100 c8b6342d 2005-01-13 devnull writememimage(1, n);
101 c8b6342d 2005-01-13 devnull exits(nil);
102 c8b6342d 2005-01-13 devnull }