1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
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;
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;
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];
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);
56 bc7cb1a1 2003-11-23 devnull #define iskey(s) ((key[0] == '-') && (strcmp(key+1, s) == 0))
59 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
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;
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");
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;
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;
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;
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;
90 bc7cb1a1 2003-11-23 devnull if(iskey("if")) {
91 bc7cb1a1 2003-11-23 devnull ifile = string;
92 bc7cb1a1 2003-11-23 devnull continue;
94 bc7cb1a1 2003-11-23 devnull if(iskey("of")) {
95 bc7cb1a1 2003-11-23 devnull ofile = string;
96 bc7cb1a1 2003-11-23 devnull continue;
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;
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;
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;
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;
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;
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;
122 bc7cb1a1 2003-11-23 devnull if(iskey("conv")) {
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
169 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: bad arg: %s\n", key);
170 bc7cb1a1 2003-11-23 devnull exits("arg");
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);
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");
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);
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");
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");
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");
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;
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");
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;
222 bc7cb1a1 2003-11-23 devnull if(signal(SIGINT, SIG_IGN) != SIG_IGN)
223 bc7cb1a1 2003-11-23 devnull signal(SIGINT, term);
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);
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);
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) {
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();
254 bc7cb1a1 2003-11-23 devnull if(ibc == 0 && --files<=0) {
258 bc7cb1a1 2003-11-23 devnull if(ibc != ibs) {
260 bc7cb1a1 2003-11-23 devnull if(cflag&SYNC)
261 bc7cb1a1 2003-11-23 devnull ibc = ibs;
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)
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;
276 bc7cb1a1 2003-11-23 devnull ibc = 0;
278 bc7cb1a1 2003-11-23 devnull goto loop;
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;
288 bc7cb1a1 2003-11-23 devnull flsh(void)
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)
297 bc7cb1a1 2003-11-23 devnull perror("write");
300 bc7cb1a1 2003-11-23 devnull if(obc == obs)
304 bc7cb1a1 2003-11-23 devnull obc = 0;
309 bc7cb1a1 2003-11-23 devnull match(char *s)
311 bc7cb1a1 2003-11-23 devnull char *cs;
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;
322 bc7cb1a1 2003-11-23 devnull string = cs;
323 bc7cb1a1 2003-11-23 devnull return 1;
327 bc7cb1a1 2003-11-23 devnull number(long big)
329 bc7cb1a1 2003-11-23 devnull char *cs;
330 bc7cb1a1 2003-11-23 devnull vlong n;
332 bc7cb1a1 2003-11-23 devnull cs = string;
334 bc7cb1a1 2003-11-23 devnull while(*cs >= '0' && *cs <= '9')
335 bc7cb1a1 2003-11-23 devnull n = n*10 + *cs++ - '0';
337 bc7cb1a1 2003-11-23 devnull switch(*cs++) {
339 bc7cb1a1 2003-11-23 devnull case 'k':
340 bc7cb1a1 2003-11-23 devnull n *= 1024;
341 bc7cb1a1 2003-11-23 devnull continue;
343 bc7cb1a1 2003-11-23 devnull /* case 'w':
344 bc7cb1a1 2003-11-23 devnull n *= sizeof(int);
345 bc7cb1a1 2003-11-23 devnull continue;
348 bc7cb1a1 2003-11-23 devnull case 'b':
349 bc7cb1a1 2003-11-23 devnull n *= 512;
350 bc7cb1a1 2003-11-23 devnull continue;
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);
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");
362 bc7cb1a1 2003-11-23 devnull return n;
364 bc7cb1a1 2003-11-23 devnull /* never gets here */
368 bc7cb1a1 2003-11-23 devnull cnull(int 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);
381 bc7cb1a1 2003-11-23 devnull null(int c)
384 bc7cb1a1 2003-11-23 devnull *op = c;
386 bc7cb1a1 2003-11-23 devnull if(++obc >= obs) {
388 bc7cb1a1 2003-11-23 devnull op = obuf;
393 bc7cb1a1 2003-11-23 devnull ascii(int cc)
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);
402 bc7cb1a1 2003-11-23 devnull if(c == ' ') {
403 bc7cb1a1 2003-11-23 devnull nspace++;
404 bc7cb1a1 2003-11-23 devnull goto out;
406 bc7cb1a1 2003-11-23 devnull while(nspace > 0) {
407 bc7cb1a1 2003-11-23 devnull null(' ');
408 bc7cb1a1 2003-11-23 devnull nspace--;
410 bc7cb1a1 2003-11-23 devnull cnull(c);
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;
421 bc7cb1a1 2003-11-23 devnull unblock(int cc)
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);
430 bc7cb1a1 2003-11-23 devnull if(c == ' ') {
431 bc7cb1a1 2003-11-23 devnull nspace++;
432 bc7cb1a1 2003-11-23 devnull goto out;
434 bc7cb1a1 2003-11-23 devnull while(nspace > 0) {
435 bc7cb1a1 2003-11-23 devnull null(' ');
436 bc7cb1a1 2003-11-23 devnull nspace--;
438 bc7cb1a1 2003-11-23 devnull cnull(c);
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;
449 bc7cb1a1 2003-11-23 devnull ebcdic(int 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);
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[' ']);
468 bc7cb1a1 2003-11-23 devnull cbc = 0;
471 bc7cb1a1 2003-11-23 devnull if(cbc == cbs)
472 bc7cb1a1 2003-11-23 devnull ntrunc++;
474 bc7cb1a1 2003-11-23 devnull if(cbc <= cbs)
475 bc7cb1a1 2003-11-23 devnull null(c);
479 bc7cb1a1 2003-11-23 devnull ibm(int 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);
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[' ']);
498 bc7cb1a1 2003-11-23 devnull cbc = 0;
501 bc7cb1a1 2003-11-23 devnull if(cbc == cbs)
502 bc7cb1a1 2003-11-23 devnull ntrunc++;
504 bc7cb1a1 2003-11-23 devnull if(cbc <= cbs)
505 bc7cb1a1 2003-11-23 devnull null(c);
509 bc7cb1a1 2003-11-23 devnull block(int 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);
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(' ');
528 bc7cb1a1 2003-11-23 devnull cbc = 0;
531 bc7cb1a1 2003-11-23 devnull if(cbc == cbs)
532 bc7cb1a1 2003-11-23 devnull ntrunc++;
534 bc7cb1a1 2003-11-23 devnull if(cbc <= cbs)
535 bc7cb1a1 2003-11-23 devnull null(c);
539 bc7cb1a1 2003-11-23 devnull term(void)
542 bc7cb1a1 2003-11-23 devnull stats();
543 bc7cb1a1 2003-11-23 devnull exits(0);
547 bc7cb1a1 2003-11-23 devnull stats(void)
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);
556 bc7cb1a1 2003-11-23 devnull uchar etoa[] =
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,
591 bc7cb1a1 2003-11-23 devnull uchar atoe[] =
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,
626 bc7cb1a1 2003-11-23 devnull uchar atoibm[] =
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,