Blame


1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
3 bc7cb1a1 2003-11-23 devnull
4 bc7cb1a1 2003-11-23 devnull #define BIG 2147483647
5 bc7cb1a1 2003-11-23 devnull #define LCASE (1<<0)
6 bc7cb1a1 2003-11-23 devnull #define UCASE (1<<1)
7 bc7cb1a1 2003-11-23 devnull #define SWAB (1<<2)
8 bc7cb1a1 2003-11-23 devnull #define NERR (1<<3)
9 bc7cb1a1 2003-11-23 devnull #define SYNC (1<<4)
10 bc7cb1a1 2003-11-23 devnull int cflag;
11 bc7cb1a1 2003-11-23 devnull int fflag;
12 bc7cb1a1 2003-11-23 devnull char *string;
13 bc7cb1a1 2003-11-23 devnull char *ifile;
14 bc7cb1a1 2003-11-23 devnull char *ofile;
15 bc7cb1a1 2003-11-23 devnull char *ibuf;
16 bc7cb1a1 2003-11-23 devnull char *obuf;
17 bc7cb1a1 2003-11-23 devnull vlong skip;
18 bc7cb1a1 2003-11-23 devnull vlong oseekn;
19 bc7cb1a1 2003-11-23 devnull vlong iseekn;
20 bc7cb1a1 2003-11-23 devnull vlong count;
21 bc7cb1a1 2003-11-23 devnull long files = 1;
22 bc7cb1a1 2003-11-23 devnull long ibs = 512;
23 bc7cb1a1 2003-11-23 devnull long obs = 512;
24 bc7cb1a1 2003-11-23 devnull long bs;
25 bc7cb1a1 2003-11-23 devnull long cbs;
26 bc7cb1a1 2003-11-23 devnull long ibc;
27 bc7cb1a1 2003-11-23 devnull long obc;
28 bc7cb1a1 2003-11-23 devnull long cbc;
29 bc7cb1a1 2003-11-23 devnull long nifr;
30 bc7cb1a1 2003-11-23 devnull long nipr;
31 bc7cb1a1 2003-11-23 devnull long nofr;
32 bc7cb1a1 2003-11-23 devnull long nopr;
33 bc7cb1a1 2003-11-23 devnull long ntrunc;
34 bc7cb1a1 2003-11-23 devnull int dotrunc = 1;
35 bc7cb1a1 2003-11-23 devnull int ibf;
36 bc7cb1a1 2003-11-23 devnull int obf;
37 bc7cb1a1 2003-11-23 devnull char *op;
38 bc7cb1a1 2003-11-23 devnull int nspace;
39 bc7cb1a1 2003-11-23 devnull uchar etoa[256];
40 bc7cb1a1 2003-11-23 devnull uchar atoe[256];
41 bc7cb1a1 2003-11-23 devnull uchar atoibm[256];
42 bc7cb1a1 2003-11-23 devnull
43 bc7cb1a1 2003-11-23 devnull void flsh(void);
44 bc7cb1a1 2003-11-23 devnull int match(char *s);
45 bc7cb1a1 2003-11-23 devnull vlong number(long big);
46 bc7cb1a1 2003-11-23 devnull void cnull(int cc);
47 bc7cb1a1 2003-11-23 devnull void null(int c);
48 bc7cb1a1 2003-11-23 devnull void ascii(int cc);
49 bc7cb1a1 2003-11-23 devnull void unblock(int cc);
50 bc7cb1a1 2003-11-23 devnull void ebcdic(int cc);
51 bc7cb1a1 2003-11-23 devnull void ibm(int cc);
52 bc7cb1a1 2003-11-23 devnull void block(int cc);
53 bc7cb1a1 2003-11-23 devnull void term(void);
54 bc7cb1a1 2003-11-23 devnull void stats(void);
55 bc7cb1a1 2003-11-23 devnull
56 bc7cb1a1 2003-11-23 devnull #define iskey(s) ((key[0] == '-') && (strcmp(key+1, s) == 0))
57 bc7cb1a1 2003-11-23 devnull
58 bc7cb1a1 2003-11-23 devnull void
59 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
60 bc7cb1a1 2003-11-23 devnull {
61 bc7cb1a1 2003-11-23 devnull void (*conv)(int);
62 bc7cb1a1 2003-11-23 devnull char *ip;
63 bc7cb1a1 2003-11-23 devnull char *key;
64 bc7cb1a1 2003-11-23 devnull int a, c;
65 bc7cb1a1 2003-11-23 devnull
66 bc7cb1a1 2003-11-23 devnull conv = null;
67 bc7cb1a1 2003-11-23 devnull for(c=1; c<argc; c++) {
68 bc7cb1a1 2003-11-23 devnull key = argv[c++];
69 bc7cb1a1 2003-11-23 devnull if(c >= argc){
70 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: arg %s needs a value\n", key);
71 bc7cb1a1 2003-11-23 devnull exits("arg");
72 bc7cb1a1 2003-11-23 devnull }
73 bc7cb1a1 2003-11-23 devnull string = argv[c];
74 bc7cb1a1 2003-11-23 devnull if(iskey("ibs")) {
75 bc7cb1a1 2003-11-23 devnull ibs = number(BIG);
76 bc7cb1a1 2003-11-23 devnull continue;
77 bc7cb1a1 2003-11-23 devnull }
78 bc7cb1a1 2003-11-23 devnull if(iskey("obs")) {
79 bc7cb1a1 2003-11-23 devnull obs = number(BIG);
80 bc7cb1a1 2003-11-23 devnull continue;
81 bc7cb1a1 2003-11-23 devnull }
82 bc7cb1a1 2003-11-23 devnull if(iskey("cbs")) {
83 bc7cb1a1 2003-11-23 devnull cbs = number(BIG);
84 bc7cb1a1 2003-11-23 devnull continue;
85 bc7cb1a1 2003-11-23 devnull }
86 bc7cb1a1 2003-11-23 devnull if(iskey("bs")) {
87 bc7cb1a1 2003-11-23 devnull bs = number(BIG);
88 bc7cb1a1 2003-11-23 devnull continue;
89 bc7cb1a1 2003-11-23 devnull }
90 bc7cb1a1 2003-11-23 devnull if(iskey("if")) {
91 bc7cb1a1 2003-11-23 devnull ifile = string;
92 bc7cb1a1 2003-11-23 devnull continue;
93 bc7cb1a1 2003-11-23 devnull }
94 bc7cb1a1 2003-11-23 devnull if(iskey("of")) {
95 bc7cb1a1 2003-11-23 devnull ofile = string;
96 bc7cb1a1 2003-11-23 devnull continue;
97 bc7cb1a1 2003-11-23 devnull }
98 bc7cb1a1 2003-11-23 devnull if(iskey("trunc")) {
99 bc7cb1a1 2003-11-23 devnull dotrunc = number(BIG);
100 bc7cb1a1 2003-11-23 devnull continue;
101 bc7cb1a1 2003-11-23 devnull }
102 bc7cb1a1 2003-11-23 devnull if(iskey("skip")) {
103 bc7cb1a1 2003-11-23 devnull skip = number(BIG);
104 bc7cb1a1 2003-11-23 devnull continue;
105 bc7cb1a1 2003-11-23 devnull }
106 bc7cb1a1 2003-11-23 devnull if(iskey("seek") || iskey("oseek")) {
107 bc7cb1a1 2003-11-23 devnull oseekn = number(BIG);
108 bc7cb1a1 2003-11-23 devnull continue;
109 bc7cb1a1 2003-11-23 devnull }
110 bc7cb1a1 2003-11-23 devnull if(iskey("iseek")) {
111 bc7cb1a1 2003-11-23 devnull iseekn = number(BIG);
112 bc7cb1a1 2003-11-23 devnull continue;
113 bc7cb1a1 2003-11-23 devnull }
114 bc7cb1a1 2003-11-23 devnull if(iskey("count")) {
115 bc7cb1a1 2003-11-23 devnull count = number(BIG);
116 bc7cb1a1 2003-11-23 devnull continue;
117 bc7cb1a1 2003-11-23 devnull }
118 bc7cb1a1 2003-11-23 devnull if(iskey("files")) {
119 bc7cb1a1 2003-11-23 devnull files = number(BIG);
120 bc7cb1a1 2003-11-23 devnull continue;
121 bc7cb1a1 2003-11-23 devnull }
122 bc7cb1a1 2003-11-23 devnull if(iskey("conv")) {
123 bc7cb1a1 2003-11-23 devnull cloop:
124 bc7cb1a1 2003-11-23 devnull if(match(","))
125 bc7cb1a1 2003-11-23 devnull goto cloop;
126 bc7cb1a1 2003-11-23 devnull if(*string == '\0')
127 bc7cb1a1 2003-11-23 devnull continue;
128 bc7cb1a1 2003-11-23 devnull if(match("ebcdic")) {
129 bc7cb1a1 2003-11-23 devnull conv = ebcdic;
130 bc7cb1a1 2003-11-23 devnull goto cloop;
131 bc7cb1a1 2003-11-23 devnull }
132 bc7cb1a1 2003-11-23 devnull if(match("ibm")) {
133 bc7cb1a1 2003-11-23 devnull conv = ibm;
134 bc7cb1a1 2003-11-23 devnull goto cloop;
135 bc7cb1a1 2003-11-23 devnull }
136 bc7cb1a1 2003-11-23 devnull if(match("ascii")) {
137 bc7cb1a1 2003-11-23 devnull conv = ascii;
138 bc7cb1a1 2003-11-23 devnull goto cloop;
139 bc7cb1a1 2003-11-23 devnull }
140 bc7cb1a1 2003-11-23 devnull if(match("block")) {
141 bc7cb1a1 2003-11-23 devnull conv = block;
142 bc7cb1a1 2003-11-23 devnull goto cloop;
143 bc7cb1a1 2003-11-23 devnull }
144 bc7cb1a1 2003-11-23 devnull if(match("unblock")) {
145 bc7cb1a1 2003-11-23 devnull conv = unblock;
146 bc7cb1a1 2003-11-23 devnull goto cloop;
147 bc7cb1a1 2003-11-23 devnull }
148 bc7cb1a1 2003-11-23 devnull if(match("lcase")) {
149 bc7cb1a1 2003-11-23 devnull cflag |= LCASE;
150 bc7cb1a1 2003-11-23 devnull goto cloop;
151 bc7cb1a1 2003-11-23 devnull }
152 bc7cb1a1 2003-11-23 devnull if(match("ucase")) {
153 bc7cb1a1 2003-11-23 devnull cflag |= UCASE;
154 bc7cb1a1 2003-11-23 devnull goto cloop;
155 bc7cb1a1 2003-11-23 devnull }
156 bc7cb1a1 2003-11-23 devnull if(match("swab")) {
157 bc7cb1a1 2003-11-23 devnull cflag |= SWAB;
158 bc7cb1a1 2003-11-23 devnull goto cloop;
159 bc7cb1a1 2003-11-23 devnull }
160 bc7cb1a1 2003-11-23 devnull if(match("noerror")) {
161 bc7cb1a1 2003-11-23 devnull cflag |= NERR;
162 bc7cb1a1 2003-11-23 devnull goto cloop;
163 bc7cb1a1 2003-11-23 devnull }
164 bc7cb1a1 2003-11-23 devnull if(match("sync")) {
165 bc7cb1a1 2003-11-23 devnull cflag |= SYNC;
166 bc7cb1a1 2003-11-23 devnull goto cloop;
167 bc7cb1a1 2003-11-23 devnull }
168 bc7cb1a1 2003-11-23 devnull }
169 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: bad arg: %s\n", key);
170 bc7cb1a1 2003-11-23 devnull exits("arg");
171 bc7cb1a1 2003-11-23 devnull }
172 bc7cb1a1 2003-11-23 devnull if(conv == null && cflag&(LCASE|UCASE))
173 bc7cb1a1 2003-11-23 devnull conv = cnull;
174 bc7cb1a1 2003-11-23 devnull if(ifile)
175 bc7cb1a1 2003-11-23 devnull ibf = open(ifile, 0);
176 bc7cb1a1 2003-11-23 devnull else
177 bc7cb1a1 2003-11-23 devnull ibf = dup(0, -1);
178 bc7cb1a1 2003-11-23 devnull if(ibf < 0) {
179 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: open %s: %r\n", ifile);
180 bc7cb1a1 2003-11-23 devnull exits("open");
181 bc7cb1a1 2003-11-23 devnull }
182 bc7cb1a1 2003-11-23 devnull if(ofile){
183 bc7cb1a1 2003-11-23 devnull if(dotrunc)
184 bc7cb1a1 2003-11-23 devnull obf = create(ofile, 1, 0664);
185 bc7cb1a1 2003-11-23 devnull else
186 bc7cb1a1 2003-11-23 devnull obf = open(ofile, 1);
187 bc7cb1a1 2003-11-23 devnull if(obf < 0) {
188 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: create %s: %r\n", ofile);
189 bc7cb1a1 2003-11-23 devnull exits("create");
190 bc7cb1a1 2003-11-23 devnull }
191 bc7cb1a1 2003-11-23 devnull }else{
192 bc7cb1a1 2003-11-23 devnull obf = dup(1, -1);
193 bc7cb1a1 2003-11-23 devnull if(obf < 0) {
194 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: can't dup file descriptor: %s: %r\n", ofile);
195 bc7cb1a1 2003-11-23 devnull exits("dup");
196 bc7cb1a1 2003-11-23 devnull }
197 bc7cb1a1 2003-11-23 devnull }
198 bc7cb1a1 2003-11-23 devnull if(bs)
199 bc7cb1a1 2003-11-23 devnull ibs = obs = bs;
200 bc7cb1a1 2003-11-23 devnull if(ibs == obs && conv == null)
201 bc7cb1a1 2003-11-23 devnull fflag++;
202 bc7cb1a1 2003-11-23 devnull if(ibs == 0 || obs == 0) {
203 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: counts: cannot be zero\n");
204 bc7cb1a1 2003-11-23 devnull exits("counts");
205 bc7cb1a1 2003-11-23 devnull }
206 bc7cb1a1 2003-11-23 devnull ibuf = sbrk(ibs);
207 bc7cb1a1 2003-11-23 devnull if(fflag)
208 bc7cb1a1 2003-11-23 devnull obuf = ibuf;
209 bc7cb1a1 2003-11-23 devnull else
210 bc7cb1a1 2003-11-23 devnull obuf = sbrk(obs);
211 bc7cb1a1 2003-11-23 devnull sbrk(64); /* For good measure */
212 bc7cb1a1 2003-11-23 devnull if(ibuf == (char *)-1 || obuf == (char *)-1) {
213 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: not enough memory: %r\n");
214 bc7cb1a1 2003-11-23 devnull exits("memory");
215 bc7cb1a1 2003-11-23 devnull }
216 bc7cb1a1 2003-11-23 devnull ibc = 0;
217 bc7cb1a1 2003-11-23 devnull obc = 0;
218 bc7cb1a1 2003-11-23 devnull cbc = 0;
219 bc7cb1a1 2003-11-23 devnull op = obuf;
220 bc7cb1a1 2003-11-23 devnull
221 bc7cb1a1 2003-11-23 devnull /*
222 bc7cb1a1 2003-11-23 devnull if(signal(SIGINT, SIG_IGN) != SIG_IGN)
223 bc7cb1a1 2003-11-23 devnull signal(SIGINT, term);
224 bc7cb1a1 2003-11-23 devnull */
225 bc7cb1a1 2003-11-23 devnull seek(obf, obs*oseekn, 1);
226 bc7cb1a1 2003-11-23 devnull seek(ibf, ibs*iseekn, 1);
227 bc7cb1a1 2003-11-23 devnull while(skip) {
228 bc7cb1a1 2003-11-23 devnull read(ibf, ibuf, ibs);
229 bc7cb1a1 2003-11-23 devnull skip--;
230 bc7cb1a1 2003-11-23 devnull }
231 bc7cb1a1 2003-11-23 devnull
232 bc7cb1a1 2003-11-23 devnull ip = 0;
233 bc7cb1a1 2003-11-23 devnull loop:
234 bc7cb1a1 2003-11-23 devnull if(ibc-- == 0) {
235 bc7cb1a1 2003-11-23 devnull ibc = 0;
236 bc7cb1a1 2003-11-23 devnull if(count==0 || nifr+nipr!=count) {
237 bc7cb1a1 2003-11-23 devnull if(cflag&(NERR|SYNC))
238 bc7cb1a1 2003-11-23 devnull for(ip=ibuf+ibs; ip>ibuf;)
239 bc7cb1a1 2003-11-23 devnull *--ip = 0;
240 bc7cb1a1 2003-11-23 devnull ibc = read(ibf, ibuf, ibs);
241 bc7cb1a1 2003-11-23 devnull }
242 bc7cb1a1 2003-11-23 devnull if(ibc == -1) {
243 bc7cb1a1 2003-11-23 devnull perror("read");
244 bc7cb1a1 2003-11-23 devnull if((cflag&NERR) == 0) {
245 bc7cb1a1 2003-11-23 devnull flsh();
246 bc7cb1a1 2003-11-23 devnull term();
247 bc7cb1a1 2003-11-23 devnull }
248 bc7cb1a1 2003-11-23 devnull ibc = 0;
249 bc7cb1a1 2003-11-23 devnull for(c=0; c<ibs; c++)
250 bc7cb1a1 2003-11-23 devnull if(ibuf[c] != 0)
251 bc7cb1a1 2003-11-23 devnull ibc = c;
252 bc7cb1a1 2003-11-23 devnull stats();
253 bc7cb1a1 2003-11-23 devnull }
254 bc7cb1a1 2003-11-23 devnull if(ibc == 0 && --files<=0) {
255 bc7cb1a1 2003-11-23 devnull flsh();
256 bc7cb1a1 2003-11-23 devnull term();
257 bc7cb1a1 2003-11-23 devnull }
258 bc7cb1a1 2003-11-23 devnull if(ibc != ibs) {
259 bc7cb1a1 2003-11-23 devnull nipr++;
260 bc7cb1a1 2003-11-23 devnull if(cflag&SYNC)
261 bc7cb1a1 2003-11-23 devnull ibc = ibs;
262 bc7cb1a1 2003-11-23 devnull } else
263 bc7cb1a1 2003-11-23 devnull nifr++;
264 bc7cb1a1 2003-11-23 devnull ip = ibuf;
265 bc7cb1a1 2003-11-23 devnull c = (ibc>>1) & ~1;
266 bc7cb1a1 2003-11-23 devnull if(cflag&SWAB && c)
267 bc7cb1a1 2003-11-23 devnull do {
268 bc7cb1a1 2003-11-23 devnull a = *ip++;
269 bc7cb1a1 2003-11-23 devnull ip[-1] = *ip;
270 bc7cb1a1 2003-11-23 devnull *ip++ = a;
271 bc7cb1a1 2003-11-23 devnull } while(--c);
272 bc7cb1a1 2003-11-23 devnull ip = ibuf;
273 bc7cb1a1 2003-11-23 devnull if(fflag) {
274 bc7cb1a1 2003-11-23 devnull obc = ibc;
275 bc7cb1a1 2003-11-23 devnull flsh();
276 bc7cb1a1 2003-11-23 devnull ibc = 0;
277 bc7cb1a1 2003-11-23 devnull }
278 bc7cb1a1 2003-11-23 devnull goto loop;
279 bc7cb1a1 2003-11-23 devnull }
280 bc7cb1a1 2003-11-23 devnull c = 0;
281 bc7cb1a1 2003-11-23 devnull c |= *ip++;
282 bc7cb1a1 2003-11-23 devnull c &= 0377;
283 bc7cb1a1 2003-11-23 devnull (*conv)(c);
284 bc7cb1a1 2003-11-23 devnull goto loop;
285 bc7cb1a1 2003-11-23 devnull }
286 bc7cb1a1 2003-11-23 devnull
287 bc7cb1a1 2003-11-23 devnull void
288 bc7cb1a1 2003-11-23 devnull flsh(void)
289 bc7cb1a1 2003-11-23 devnull {
290 bc7cb1a1 2003-11-23 devnull int c;
291 bc7cb1a1 2003-11-23 devnull
292 bc7cb1a1 2003-11-23 devnull if(obc) {
293 bc7cb1a1 2003-11-23 devnull c = write(obf, obuf, obc);
294 bc7cb1a1 2003-11-23 devnull if(c != obc) {
295 bc7cb1a1 2003-11-23 devnull if(c > 0)
296 bc7cb1a1 2003-11-23 devnull ++nopr;
297 bc7cb1a1 2003-11-23 devnull perror("write");
298 bc7cb1a1 2003-11-23 devnull term();
299 bc7cb1a1 2003-11-23 devnull }
300 bc7cb1a1 2003-11-23 devnull if(obc == obs)
301 bc7cb1a1 2003-11-23 devnull nofr++;
302 bc7cb1a1 2003-11-23 devnull else
303 bc7cb1a1 2003-11-23 devnull nopr++;
304 bc7cb1a1 2003-11-23 devnull obc = 0;
305 bc7cb1a1 2003-11-23 devnull }
306 bc7cb1a1 2003-11-23 devnull }
307 bc7cb1a1 2003-11-23 devnull
308 bc7cb1a1 2003-11-23 devnull int
309 bc7cb1a1 2003-11-23 devnull match(char *s)
310 bc7cb1a1 2003-11-23 devnull {
311 bc7cb1a1 2003-11-23 devnull char *cs;
312 bc7cb1a1 2003-11-23 devnull
313 bc7cb1a1 2003-11-23 devnull cs = string;
314 bc7cb1a1 2003-11-23 devnull while(*cs++ == *s)
315 bc7cb1a1 2003-11-23 devnull if(*s++ == '\0')
316 bc7cb1a1 2003-11-23 devnull goto true;
317 bc7cb1a1 2003-11-23 devnull if(*s != '\0')
318 bc7cb1a1 2003-11-23 devnull return 0;
319 bc7cb1a1 2003-11-23 devnull
320 bc7cb1a1 2003-11-23 devnull true:
321 bc7cb1a1 2003-11-23 devnull cs--;
322 bc7cb1a1 2003-11-23 devnull string = cs;
323 bc7cb1a1 2003-11-23 devnull return 1;
324 bc7cb1a1 2003-11-23 devnull }
325 bc7cb1a1 2003-11-23 devnull
326 bc7cb1a1 2003-11-23 devnull vlong
327 bc7cb1a1 2003-11-23 devnull number(long big)
328 bc7cb1a1 2003-11-23 devnull {
329 bc7cb1a1 2003-11-23 devnull char *cs;
330 bc7cb1a1 2003-11-23 devnull vlong n;
331 bc7cb1a1 2003-11-23 devnull
332 bc7cb1a1 2003-11-23 devnull cs = string;
333 bc7cb1a1 2003-11-23 devnull n = 0;
334 bc7cb1a1 2003-11-23 devnull while(*cs >= '0' && *cs <= '9')
335 bc7cb1a1 2003-11-23 devnull n = n*10 + *cs++ - '0';
336 bc7cb1a1 2003-11-23 devnull for(;;)
337 bc7cb1a1 2003-11-23 devnull switch(*cs++) {
338 bc7cb1a1 2003-11-23 devnull
339 bc7cb1a1 2003-11-23 devnull case 'k':
340 bc7cb1a1 2003-11-23 devnull n *= 1024;
341 bc7cb1a1 2003-11-23 devnull continue;
342 bc7cb1a1 2003-11-23 devnull
343 bc7cb1a1 2003-11-23 devnull /* case 'w':
344 bc7cb1a1 2003-11-23 devnull n *= sizeof(int);
345 bc7cb1a1 2003-11-23 devnull continue;
346 bc7cb1a1 2003-11-23 devnull */
347 bc7cb1a1 2003-11-23 devnull
348 bc7cb1a1 2003-11-23 devnull case 'b':
349 bc7cb1a1 2003-11-23 devnull n *= 512;
350 bc7cb1a1 2003-11-23 devnull continue;
351 bc7cb1a1 2003-11-23 devnull
352 bc7cb1a1 2003-11-23 devnull /* case '*':*/
353 bc7cb1a1 2003-11-23 devnull case 'x':
354 bc7cb1a1 2003-11-23 devnull string = cs;
355 bc7cb1a1 2003-11-23 devnull n *= number(BIG);
356 bc7cb1a1 2003-11-23 devnull
357 bc7cb1a1 2003-11-23 devnull case '\0':
358 bc7cb1a1 2003-11-23 devnull if(n>=big || n<0) {
359 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: argument %lld out of range\n", n);
360 bc7cb1a1 2003-11-23 devnull exits("range");
361 bc7cb1a1 2003-11-23 devnull }
362 bc7cb1a1 2003-11-23 devnull return n;
363 bc7cb1a1 2003-11-23 devnull }
364 bc7cb1a1 2003-11-23 devnull /* never gets here */
365 bc7cb1a1 2003-11-23 devnull }
366 bc7cb1a1 2003-11-23 devnull
367 bc7cb1a1 2003-11-23 devnull void
368 bc7cb1a1 2003-11-23 devnull cnull(int cc)
369 bc7cb1a1 2003-11-23 devnull {
370 bc7cb1a1 2003-11-23 devnull int c;
371 bc7cb1a1 2003-11-23 devnull
372 bc7cb1a1 2003-11-23 devnull c = cc;
373 bc7cb1a1 2003-11-23 devnull if((cflag&UCASE) && c>='a' && c<='z')
374 bc7cb1a1 2003-11-23 devnull c += 'A'-'a';
375 bc7cb1a1 2003-11-23 devnull if((cflag&LCASE) && c>='A' && c<='Z')
376 bc7cb1a1 2003-11-23 devnull c += 'a'-'A';
377 bc7cb1a1 2003-11-23 devnull null(c);
378 bc7cb1a1 2003-11-23 devnull }
379 bc7cb1a1 2003-11-23 devnull
380 bc7cb1a1 2003-11-23 devnull void
381 bc7cb1a1 2003-11-23 devnull null(int c)
382 bc7cb1a1 2003-11-23 devnull {
383 bc7cb1a1 2003-11-23 devnull
384 bc7cb1a1 2003-11-23 devnull *op = c;
385 bc7cb1a1 2003-11-23 devnull op++;
386 bc7cb1a1 2003-11-23 devnull if(++obc >= obs) {
387 bc7cb1a1 2003-11-23 devnull flsh();
388 bc7cb1a1 2003-11-23 devnull op = obuf;
389 bc7cb1a1 2003-11-23 devnull }
390 bc7cb1a1 2003-11-23 devnull }
391 bc7cb1a1 2003-11-23 devnull
392 bc7cb1a1 2003-11-23 devnull void
393 bc7cb1a1 2003-11-23 devnull ascii(int cc)
394 bc7cb1a1 2003-11-23 devnull {
395 bc7cb1a1 2003-11-23 devnull int c;
396 bc7cb1a1 2003-11-23 devnull
397 bc7cb1a1 2003-11-23 devnull c = etoa[cc];
398 bc7cb1a1 2003-11-23 devnull if(cbs == 0) {
399 bc7cb1a1 2003-11-23 devnull cnull(c);
400 bc7cb1a1 2003-11-23 devnull return;
401 bc7cb1a1 2003-11-23 devnull }
402 bc7cb1a1 2003-11-23 devnull if(c == ' ') {
403 bc7cb1a1 2003-11-23 devnull nspace++;
404 bc7cb1a1 2003-11-23 devnull goto out;
405 bc7cb1a1 2003-11-23 devnull }
406 bc7cb1a1 2003-11-23 devnull while(nspace > 0) {
407 bc7cb1a1 2003-11-23 devnull null(' ');
408 bc7cb1a1 2003-11-23 devnull nspace--;
409 bc7cb1a1 2003-11-23 devnull }
410 bc7cb1a1 2003-11-23 devnull cnull(c);
411 bc7cb1a1 2003-11-23 devnull
412 bc7cb1a1 2003-11-23 devnull out:
413 bc7cb1a1 2003-11-23 devnull if(++cbc >= cbs) {
414 bc7cb1a1 2003-11-23 devnull null('\n');
415 bc7cb1a1 2003-11-23 devnull cbc = 0;
416 bc7cb1a1 2003-11-23 devnull nspace = 0;
417 bc7cb1a1 2003-11-23 devnull }
418 bc7cb1a1 2003-11-23 devnull }
419 bc7cb1a1 2003-11-23 devnull
420 bc7cb1a1 2003-11-23 devnull void
421 bc7cb1a1 2003-11-23 devnull unblock(int cc)
422 bc7cb1a1 2003-11-23 devnull {
423 bc7cb1a1 2003-11-23 devnull int c;
424 bc7cb1a1 2003-11-23 devnull
425 bc7cb1a1 2003-11-23 devnull c = cc & 0377;
426 bc7cb1a1 2003-11-23 devnull if(cbs == 0) {
427 bc7cb1a1 2003-11-23 devnull cnull(c);
428 bc7cb1a1 2003-11-23 devnull return;
429 bc7cb1a1 2003-11-23 devnull }
430 bc7cb1a1 2003-11-23 devnull if(c == ' ') {
431 bc7cb1a1 2003-11-23 devnull nspace++;
432 bc7cb1a1 2003-11-23 devnull goto out;
433 bc7cb1a1 2003-11-23 devnull }
434 bc7cb1a1 2003-11-23 devnull while(nspace > 0) {
435 bc7cb1a1 2003-11-23 devnull null(' ');
436 bc7cb1a1 2003-11-23 devnull nspace--;
437 bc7cb1a1 2003-11-23 devnull }
438 bc7cb1a1 2003-11-23 devnull cnull(c);
439 bc7cb1a1 2003-11-23 devnull
440 bc7cb1a1 2003-11-23 devnull out:
441 bc7cb1a1 2003-11-23 devnull if(++cbc >= cbs) {
442 bc7cb1a1 2003-11-23 devnull null('\n');
443 bc7cb1a1 2003-11-23 devnull cbc = 0;
444 bc7cb1a1 2003-11-23 devnull nspace = 0;
445 bc7cb1a1 2003-11-23 devnull }
446 bc7cb1a1 2003-11-23 devnull }
447 bc7cb1a1 2003-11-23 devnull
448 bc7cb1a1 2003-11-23 devnull void
449 bc7cb1a1 2003-11-23 devnull ebcdic(int cc)
450 bc7cb1a1 2003-11-23 devnull {
451 bc7cb1a1 2003-11-23 devnull int c;
452 bc7cb1a1 2003-11-23 devnull
453 bc7cb1a1 2003-11-23 devnull c = cc;
454 bc7cb1a1 2003-11-23 devnull if(cflag&UCASE && c>='a' && c<='z')
455 bc7cb1a1 2003-11-23 devnull c += 'A'-'a';
456 bc7cb1a1 2003-11-23 devnull if(cflag&LCASE && c>='A' && c<='Z')
457 bc7cb1a1 2003-11-23 devnull c += 'a'-'A';
458 bc7cb1a1 2003-11-23 devnull c = atoe[c];
459 bc7cb1a1 2003-11-23 devnull if(cbs == 0) {
460 bc7cb1a1 2003-11-23 devnull null(c);
461 bc7cb1a1 2003-11-23 devnull return;
462 bc7cb1a1 2003-11-23 devnull }
463 bc7cb1a1 2003-11-23 devnull if(cc == '\n') {
464 bc7cb1a1 2003-11-23 devnull while(cbc < cbs) {
465 bc7cb1a1 2003-11-23 devnull null(atoe[' ']);
466 bc7cb1a1 2003-11-23 devnull cbc++;
467 bc7cb1a1 2003-11-23 devnull }
468 bc7cb1a1 2003-11-23 devnull cbc = 0;
469 bc7cb1a1 2003-11-23 devnull return;
470 bc7cb1a1 2003-11-23 devnull }
471 bc7cb1a1 2003-11-23 devnull if(cbc == cbs)
472 bc7cb1a1 2003-11-23 devnull ntrunc++;
473 bc7cb1a1 2003-11-23 devnull cbc++;
474 bc7cb1a1 2003-11-23 devnull if(cbc <= cbs)
475 bc7cb1a1 2003-11-23 devnull null(c);
476 bc7cb1a1 2003-11-23 devnull }
477 bc7cb1a1 2003-11-23 devnull
478 bc7cb1a1 2003-11-23 devnull void
479 bc7cb1a1 2003-11-23 devnull ibm(int cc)
480 bc7cb1a1 2003-11-23 devnull {
481 bc7cb1a1 2003-11-23 devnull int c;
482 bc7cb1a1 2003-11-23 devnull
483 bc7cb1a1 2003-11-23 devnull c = cc;
484 bc7cb1a1 2003-11-23 devnull if(cflag&UCASE && c>='a' && c<='z')
485 bc7cb1a1 2003-11-23 devnull c += 'A'-'a';
486 bc7cb1a1 2003-11-23 devnull if(cflag&LCASE && c>='A' && c<='Z')
487 bc7cb1a1 2003-11-23 devnull c += 'a'-'A';
488 bc7cb1a1 2003-11-23 devnull c = atoibm[c] & 0377;
489 bc7cb1a1 2003-11-23 devnull if(cbs == 0) {
490 bc7cb1a1 2003-11-23 devnull null(c);
491 bc7cb1a1 2003-11-23 devnull return;
492 bc7cb1a1 2003-11-23 devnull }
493 bc7cb1a1 2003-11-23 devnull if(cc == '\n') {
494 bc7cb1a1 2003-11-23 devnull while(cbc < cbs) {
495 bc7cb1a1 2003-11-23 devnull null(atoibm[' ']);
496 bc7cb1a1 2003-11-23 devnull cbc++;
497 bc7cb1a1 2003-11-23 devnull }
498 bc7cb1a1 2003-11-23 devnull cbc = 0;
499 bc7cb1a1 2003-11-23 devnull return;
500 bc7cb1a1 2003-11-23 devnull }
501 bc7cb1a1 2003-11-23 devnull if(cbc == cbs)
502 bc7cb1a1 2003-11-23 devnull ntrunc++;
503 bc7cb1a1 2003-11-23 devnull cbc++;
504 bc7cb1a1 2003-11-23 devnull if(cbc <= cbs)
505 bc7cb1a1 2003-11-23 devnull null(c);
506 bc7cb1a1 2003-11-23 devnull }
507 bc7cb1a1 2003-11-23 devnull
508 bc7cb1a1 2003-11-23 devnull void
509 bc7cb1a1 2003-11-23 devnull block(int cc)
510 bc7cb1a1 2003-11-23 devnull {
511 bc7cb1a1 2003-11-23 devnull int c;
512 bc7cb1a1 2003-11-23 devnull
513 bc7cb1a1 2003-11-23 devnull c = cc;
514 bc7cb1a1 2003-11-23 devnull if(cflag&UCASE && c>='a' && c<='z')
515 bc7cb1a1 2003-11-23 devnull c += 'A'-'a';
516 bc7cb1a1 2003-11-23 devnull if(cflag&LCASE && c>='A' && c<='Z')
517 bc7cb1a1 2003-11-23 devnull c += 'a'-'A';
518 bc7cb1a1 2003-11-23 devnull c &= 0377;
519 bc7cb1a1 2003-11-23 devnull if(cbs == 0) {
520 bc7cb1a1 2003-11-23 devnull null(c);
521 bc7cb1a1 2003-11-23 devnull return;
522 bc7cb1a1 2003-11-23 devnull }
523 bc7cb1a1 2003-11-23 devnull if(cc == '\n') {
524 bc7cb1a1 2003-11-23 devnull while(cbc < cbs) {
525 bc7cb1a1 2003-11-23 devnull null(' ');
526 bc7cb1a1 2003-11-23 devnull cbc++;
527 bc7cb1a1 2003-11-23 devnull }
528 bc7cb1a1 2003-11-23 devnull cbc = 0;
529 bc7cb1a1 2003-11-23 devnull return;
530 bc7cb1a1 2003-11-23 devnull }
531 bc7cb1a1 2003-11-23 devnull if(cbc == cbs)
532 bc7cb1a1 2003-11-23 devnull ntrunc++;
533 bc7cb1a1 2003-11-23 devnull cbc++;
534 bc7cb1a1 2003-11-23 devnull if(cbc <= cbs)
535 bc7cb1a1 2003-11-23 devnull null(c);
536 bc7cb1a1 2003-11-23 devnull }
537 bc7cb1a1 2003-11-23 devnull
538 bc7cb1a1 2003-11-23 devnull void
539 bc7cb1a1 2003-11-23 devnull term(void)
540 bc7cb1a1 2003-11-23 devnull {
541 bc7cb1a1 2003-11-23 devnull
542 bc7cb1a1 2003-11-23 devnull stats();
543 bc7cb1a1 2003-11-23 devnull exits(0);
544 bc7cb1a1 2003-11-23 devnull }
545 bc7cb1a1 2003-11-23 devnull
546 bc7cb1a1 2003-11-23 devnull void
547 bc7cb1a1 2003-11-23 devnull stats(void)
548 bc7cb1a1 2003-11-23 devnull {
549 bc7cb1a1 2003-11-23 devnull
550 bc7cb1a1 2003-11-23 devnull fprint(2, "%lud+%lud records in\n", nifr, nipr);
551 bc7cb1a1 2003-11-23 devnull fprint(2, "%lud+%lud records out\n", nofr, nopr);
552 bc7cb1a1 2003-11-23 devnull if(ntrunc)
553 bc7cb1a1 2003-11-23 devnull fprint(2, "%lud truncated records\n", ntrunc);
554 bc7cb1a1 2003-11-23 devnull }
555 bc7cb1a1 2003-11-23 devnull
556 bc7cb1a1 2003-11-23 devnull uchar etoa[] =
557 bc7cb1a1 2003-11-23 devnull {
558 bc7cb1a1 2003-11-23 devnull 0000,0001,0002,0003,0234,0011,0206,0177,
559 bc7cb1a1 2003-11-23 devnull 0227,0215,0216,0013,0014,0015,0016,0017,
560 bc7cb1a1 2003-11-23 devnull 0020,0021,0022,0023,0235,0205,0010,0207,
561 bc7cb1a1 2003-11-23 devnull 0030,0031,0222,0217,0034,0035,0036,0037,
562 bc7cb1a1 2003-11-23 devnull 0200,0201,0202,0203,0204,0012,0027,0033,
563 bc7cb1a1 2003-11-23 devnull 0210,0211,0212,0213,0214,0005,0006,0007,
564 bc7cb1a1 2003-11-23 devnull 0220,0221,0026,0223,0224,0225,0226,0004,
565 bc7cb1a1 2003-11-23 devnull 0230,0231,0232,0233,0024,0025,0236,0032,
566 bc7cb1a1 2003-11-23 devnull 0040,0240,0241,0242,0243,0244,0245,0246,
567 bc7cb1a1 2003-11-23 devnull 0247,0250,0133,0056,0074,0050,0053,0041,
568 bc7cb1a1 2003-11-23 devnull 0046,0251,0252,0253,0254,0255,0256,0257,
569 bc7cb1a1 2003-11-23 devnull 0260,0261,0135,0044,0052,0051,0073,0136,
570 bc7cb1a1 2003-11-23 devnull 0055,0057,0262,0263,0264,0265,0266,0267,
571 bc7cb1a1 2003-11-23 devnull 0270,0271,0174,0054,0045,0137,0076,0077,
572 bc7cb1a1 2003-11-23 devnull 0272,0273,0274,0275,0276,0277,0300,0301,
573 bc7cb1a1 2003-11-23 devnull 0302,0140,0072,0043,0100,0047,0075,0042,
574 bc7cb1a1 2003-11-23 devnull 0303,0141,0142,0143,0144,0145,0146,0147,
575 bc7cb1a1 2003-11-23 devnull 0150,0151,0304,0305,0306,0307,0310,0311,
576 bc7cb1a1 2003-11-23 devnull 0312,0152,0153,0154,0155,0156,0157,0160,
577 bc7cb1a1 2003-11-23 devnull 0161,0162,0313,0314,0315,0316,0317,0320,
578 bc7cb1a1 2003-11-23 devnull 0321,0176,0163,0164,0165,0166,0167,0170,
579 bc7cb1a1 2003-11-23 devnull 0171,0172,0322,0323,0324,0325,0326,0327,
580 bc7cb1a1 2003-11-23 devnull 0330,0331,0332,0333,0334,0335,0336,0337,
581 bc7cb1a1 2003-11-23 devnull 0340,0341,0342,0343,0344,0345,0346,0347,
582 bc7cb1a1 2003-11-23 devnull 0173,0101,0102,0103,0104,0105,0106,0107,
583 bc7cb1a1 2003-11-23 devnull 0110,0111,0350,0351,0352,0353,0354,0355,
584 bc7cb1a1 2003-11-23 devnull 0175,0112,0113,0114,0115,0116,0117,0120,
585 bc7cb1a1 2003-11-23 devnull 0121,0122,0356,0357,0360,0361,0362,0363,
586 bc7cb1a1 2003-11-23 devnull 0134,0237,0123,0124,0125,0126,0127,0130,
587 bc7cb1a1 2003-11-23 devnull 0131,0132,0364,0365,0366,0367,0370,0371,
588 bc7cb1a1 2003-11-23 devnull 0060,0061,0062,0063,0064,0065,0066,0067,
589 bc7cb1a1 2003-11-23 devnull 0070,0071,0372,0373,0374,0375,0376,0377,
590 bc7cb1a1 2003-11-23 devnull };
591 bc7cb1a1 2003-11-23 devnull uchar atoe[] =
592 bc7cb1a1 2003-11-23 devnull {
593 bc7cb1a1 2003-11-23 devnull 0000,0001,0002,0003,0067,0055,0056,0057,
594 bc7cb1a1 2003-11-23 devnull 0026,0005,0045,0013,0014,0015,0016,0017,
595 bc7cb1a1 2003-11-23 devnull 0020,0021,0022,0023,0074,0075,0062,0046,
596 bc7cb1a1 2003-11-23 devnull 0030,0031,0077,0047,0034,0035,0036,0037,
597 bc7cb1a1 2003-11-23 devnull 0100,0117,0177,0173,0133,0154,0120,0175,
598 bc7cb1a1 2003-11-23 devnull 0115,0135,0134,0116,0153,0140,0113,0141,
599 bc7cb1a1 2003-11-23 devnull 0360,0361,0362,0363,0364,0365,0366,0367,
600 bc7cb1a1 2003-11-23 devnull 0370,0371,0172,0136,0114,0176,0156,0157,
601 bc7cb1a1 2003-11-23 devnull 0174,0301,0302,0303,0304,0305,0306,0307,
602 bc7cb1a1 2003-11-23 devnull 0310,0311,0321,0322,0323,0324,0325,0326,
603 bc7cb1a1 2003-11-23 devnull 0327,0330,0331,0342,0343,0344,0345,0346,
604 bc7cb1a1 2003-11-23 devnull 0347,0350,0351,0112,0340,0132,0137,0155,
605 bc7cb1a1 2003-11-23 devnull 0171,0201,0202,0203,0204,0205,0206,0207,
606 bc7cb1a1 2003-11-23 devnull 0210,0211,0221,0222,0223,0224,0225,0226,
607 bc7cb1a1 2003-11-23 devnull 0227,0230,0231,0242,0243,0244,0245,0246,
608 bc7cb1a1 2003-11-23 devnull 0247,0250,0251,0300,0152,0320,0241,0007,
609 bc7cb1a1 2003-11-23 devnull 0040,0041,0042,0043,0044,0025,0006,0027,
610 bc7cb1a1 2003-11-23 devnull 0050,0051,0052,0053,0054,0011,0012,0033,
611 bc7cb1a1 2003-11-23 devnull 0060,0061,0032,0063,0064,0065,0066,0010,
612 bc7cb1a1 2003-11-23 devnull 0070,0071,0072,0073,0004,0024,0076,0341,
613 bc7cb1a1 2003-11-23 devnull 0101,0102,0103,0104,0105,0106,0107,0110,
614 bc7cb1a1 2003-11-23 devnull 0111,0121,0122,0123,0124,0125,0126,0127,
615 bc7cb1a1 2003-11-23 devnull 0130,0131,0142,0143,0144,0145,0146,0147,
616 bc7cb1a1 2003-11-23 devnull 0150,0151,0160,0161,0162,0163,0164,0165,
617 bc7cb1a1 2003-11-23 devnull 0166,0167,0170,0200,0212,0213,0214,0215,
618 bc7cb1a1 2003-11-23 devnull 0216,0217,0220,0232,0233,0234,0235,0236,
619 bc7cb1a1 2003-11-23 devnull 0237,0240,0252,0253,0254,0255,0256,0257,
620 bc7cb1a1 2003-11-23 devnull 0260,0261,0262,0263,0264,0265,0266,0267,
621 bc7cb1a1 2003-11-23 devnull 0270,0271,0272,0273,0274,0275,0276,0277,
622 bc7cb1a1 2003-11-23 devnull 0312,0313,0314,0315,0316,0317,0332,0333,
623 bc7cb1a1 2003-11-23 devnull 0334,0335,0336,0337,0352,0353,0354,0355,
624 bc7cb1a1 2003-11-23 devnull 0356,0357,0372,0373,0374,0375,0376,0377,
625 bc7cb1a1 2003-11-23 devnull };
626 bc7cb1a1 2003-11-23 devnull uchar atoibm[] =
627 bc7cb1a1 2003-11-23 devnull {
628 bc7cb1a1 2003-11-23 devnull 0000,0001,0002,0003,0067,0055,0056,0057,
629 bc7cb1a1 2003-11-23 devnull 0026,0005,0045,0013,0014,0015,0016,0017,
630 bc7cb1a1 2003-11-23 devnull 0020,0021,0022,0023,0074,0075,0062,0046,
631 bc7cb1a1 2003-11-23 devnull 0030,0031,0077,0047,0034,0035,0036,0037,
632 bc7cb1a1 2003-11-23 devnull 0100,0132,0177,0173,0133,0154,0120,0175,
633 bc7cb1a1 2003-11-23 devnull 0115,0135,0134,0116,0153,0140,0113,0141,
634 bc7cb1a1 2003-11-23 devnull 0360,0361,0362,0363,0364,0365,0366,0367,
635 bc7cb1a1 2003-11-23 devnull 0370,0371,0172,0136,0114,0176,0156,0157,
636 bc7cb1a1 2003-11-23 devnull 0174,0301,0302,0303,0304,0305,0306,0307,
637 bc7cb1a1 2003-11-23 devnull 0310,0311,0321,0322,0323,0324,0325,0326,
638 bc7cb1a1 2003-11-23 devnull 0327,0330,0331,0342,0343,0344,0345,0346,
639 bc7cb1a1 2003-11-23 devnull 0347,0350,0351,0255,0340,0275,0137,0155,
640 bc7cb1a1 2003-11-23 devnull 0171,0201,0202,0203,0204,0205,0206,0207,
641 bc7cb1a1 2003-11-23 devnull 0210,0211,0221,0222,0223,0224,0225,0226,
642 bc7cb1a1 2003-11-23 devnull 0227,0230,0231,0242,0243,0244,0245,0246,
643 bc7cb1a1 2003-11-23 devnull 0247,0250,0251,0300,0117,0320,0241,0007,
644 bc7cb1a1 2003-11-23 devnull 0040,0041,0042,0043,0044,0025,0006,0027,
645 bc7cb1a1 2003-11-23 devnull 0050,0051,0052,0053,0054,0011,0012,0033,
646 bc7cb1a1 2003-11-23 devnull 0060,0061,0032,0063,0064,0065,0066,0010,
647 bc7cb1a1 2003-11-23 devnull 0070,0071,0072,0073,0004,0024,0076,0341,
648 bc7cb1a1 2003-11-23 devnull 0101,0102,0103,0104,0105,0106,0107,0110,
649 bc7cb1a1 2003-11-23 devnull 0111,0121,0122,0123,0124,0125,0126,0127,
650 bc7cb1a1 2003-11-23 devnull 0130,0131,0142,0143,0144,0145,0146,0147,
651 bc7cb1a1 2003-11-23 devnull 0150,0151,0160,0161,0162,0163,0164,0165,
652 bc7cb1a1 2003-11-23 devnull 0166,0167,0170,0200,0212,0213,0214,0215,
653 bc7cb1a1 2003-11-23 devnull 0216,0217,0220,0232,0233,0234,0235,0236,
654 bc7cb1a1 2003-11-23 devnull 0237,0240,0252,0253,0254,0255,0256,0257,
655 bc7cb1a1 2003-11-23 devnull 0260,0261,0262,0263,0264,0265,0266,0267,
656 bc7cb1a1 2003-11-23 devnull 0270,0271,0272,0273,0274,0275,0276,0277,
657 bc7cb1a1 2003-11-23 devnull 0312,0313,0314,0315,0316,0317,0332,0333,
658 bc7cb1a1 2003-11-23 devnull 0334,0335,0336,0337,0352,0353,0354,0355,
659 bc7cb1a1 2003-11-23 devnull 0356,0357,0372,0373,0374,0375,0376,0377,
660 bc7cb1a1 2003-11-23 devnull };