1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
4 11a3ce57 2011-08-16 rsc #define BIG ((1UL<<31)-1)
5 11a3ce57 2011-08-16 rsc #define VBIG ((1ULL<<63)-1)
6 bc7cb1a1 2003-11-23 devnull #define LCASE (1<<0)
7 bc7cb1a1 2003-11-23 devnull #define UCASE (1<<1)
8 bc7cb1a1 2003-11-23 devnull #define SWAB (1<<2)
9 bc7cb1a1 2003-11-23 devnull #define NERR (1<<3)
10 bc7cb1a1 2003-11-23 devnull #define SYNC (1<<4)
12 bc7cb1a1 2003-11-23 devnull int cflag;
13 bc7cb1a1 2003-11-23 devnull int fflag;
15 bc7cb1a1 2003-11-23 devnull char *string;
16 bc7cb1a1 2003-11-23 devnull char *ifile;
17 bc7cb1a1 2003-11-23 devnull char *ofile;
18 bc7cb1a1 2003-11-23 devnull char *ibuf;
19 bc7cb1a1 2003-11-23 devnull char *obuf;
21 bc7cb1a1 2003-11-23 devnull vlong skip;
22 bc7cb1a1 2003-11-23 devnull vlong oseekn;
23 bc7cb1a1 2003-11-23 devnull vlong iseekn;
24 bc7cb1a1 2003-11-23 devnull vlong count;
26 bc7cb1a1 2003-11-23 devnull long files = 1;
27 bc7cb1a1 2003-11-23 devnull long ibs = 512;
28 bc7cb1a1 2003-11-23 devnull long obs = 512;
30 bc7cb1a1 2003-11-23 devnull long cbs;
31 bc7cb1a1 2003-11-23 devnull long ibc;
32 bc7cb1a1 2003-11-23 devnull long obc;
33 bc7cb1a1 2003-11-23 devnull long cbc;
34 bc7cb1a1 2003-11-23 devnull long nifr;
35 bc7cb1a1 2003-11-23 devnull long nipr;
36 bc7cb1a1 2003-11-23 devnull long nofr;
37 bc7cb1a1 2003-11-23 devnull long nopr;
38 bc7cb1a1 2003-11-23 devnull long ntrunc;
40 bc7cb1a1 2003-11-23 devnull int dotrunc = 1;
44 bc7cb1a1 2003-11-23 devnull char *op;
45 bc7cb1a1 2003-11-23 devnull int nspace;
47 bc7cb1a1 2003-11-23 devnull uchar etoa[256];
48 bc7cb1a1 2003-11-23 devnull uchar atoe[256];
49 bc7cb1a1 2003-11-23 devnull uchar atoibm[256];
53 bc7cb1a1 2003-11-23 devnull void flsh(void);
54 bc7cb1a1 2003-11-23 devnull int match(char *s);
55 11a3ce57 2011-08-16 rsc vlong number(vlong big);
56 bc7cb1a1 2003-11-23 devnull void cnull(int cc);
57 bc7cb1a1 2003-11-23 devnull void null(int c);
58 bc7cb1a1 2003-11-23 devnull void ascii(int cc);
59 bc7cb1a1 2003-11-23 devnull void unblock(int cc);
60 bc7cb1a1 2003-11-23 devnull void ebcdic(int cc);
61 bc7cb1a1 2003-11-23 devnull void ibm(int cc);
62 bc7cb1a1 2003-11-23 devnull void block(int cc);
63 11a3ce57 2011-08-16 rsc void term(char*);
64 bc7cb1a1 2003-11-23 devnull void stats(void);
66 bc7cb1a1 2003-11-23 devnull #define iskey(s) ((key[0] == '-') && (strcmp(key+1, s) == 0))
69 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
71 bc7cb1a1 2003-11-23 devnull void (*conv)(int);
72 bc7cb1a1 2003-11-23 devnull char *ip;
73 bc7cb1a1 2003-11-23 devnull char *key;
74 bc7cb1a1 2003-11-23 devnull int a, c;
76 bc7cb1a1 2003-11-23 devnull conv = null;
77 bc7cb1a1 2003-11-23 devnull for(c=1; c<argc; c++) {
78 bc7cb1a1 2003-11-23 devnull key = argv[c++];
79 bc7cb1a1 2003-11-23 devnull if(c >= argc){
80 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: arg %s needs a value\n", key);
81 bc7cb1a1 2003-11-23 devnull exits("arg");
83 bc7cb1a1 2003-11-23 devnull string = argv[c];
84 bc7cb1a1 2003-11-23 devnull if(iskey("ibs")) {
85 bc7cb1a1 2003-11-23 devnull ibs = number(BIG);
86 bc7cb1a1 2003-11-23 devnull continue;
88 bc7cb1a1 2003-11-23 devnull if(iskey("obs")) {
89 bc7cb1a1 2003-11-23 devnull obs = number(BIG);
90 bc7cb1a1 2003-11-23 devnull continue;
92 bc7cb1a1 2003-11-23 devnull if(iskey("cbs")) {
93 bc7cb1a1 2003-11-23 devnull cbs = number(BIG);
94 bc7cb1a1 2003-11-23 devnull continue;
96 bc7cb1a1 2003-11-23 devnull if(iskey("bs")) {
97 bc7cb1a1 2003-11-23 devnull bs = number(BIG);
98 bc7cb1a1 2003-11-23 devnull continue;
100 bc7cb1a1 2003-11-23 devnull if(iskey("if")) {
101 bc7cb1a1 2003-11-23 devnull ifile = string;
102 bc7cb1a1 2003-11-23 devnull continue;
104 bc7cb1a1 2003-11-23 devnull if(iskey("of")) {
105 bc7cb1a1 2003-11-23 devnull ofile = string;
106 bc7cb1a1 2003-11-23 devnull continue;
108 bc7cb1a1 2003-11-23 devnull if(iskey("trunc")) {
109 bc7cb1a1 2003-11-23 devnull dotrunc = number(BIG);
110 bc7cb1a1 2003-11-23 devnull continue;
112 11a3ce57 2011-08-16 rsc if(iskey("quiet")) {
113 11a3ce57 2011-08-16 rsc quiet = number(BIG);
116 bc7cb1a1 2003-11-23 devnull if(iskey("skip")) {
117 11a3ce57 2011-08-16 rsc skip = number(VBIG);
118 bc7cb1a1 2003-11-23 devnull continue;
120 bc7cb1a1 2003-11-23 devnull if(iskey("seek") || iskey("oseek")) {
121 11a3ce57 2011-08-16 rsc oseekn = number(VBIG);
122 bc7cb1a1 2003-11-23 devnull continue;
124 bc7cb1a1 2003-11-23 devnull if(iskey("iseek")) {
125 11a3ce57 2011-08-16 rsc iseekn = number(VBIG);
126 bc7cb1a1 2003-11-23 devnull continue;
128 bc7cb1a1 2003-11-23 devnull if(iskey("count")) {
129 11a3ce57 2011-08-16 rsc count = number(VBIG);
130 bc7cb1a1 2003-11-23 devnull continue;
132 bc7cb1a1 2003-11-23 devnull if(iskey("files")) {
133 bc7cb1a1 2003-11-23 devnull files = number(BIG);
134 bc7cb1a1 2003-11-23 devnull continue;
136 bc7cb1a1 2003-11-23 devnull if(iskey("conv")) {
138 bc7cb1a1 2003-11-23 devnull if(match(","))
139 bc7cb1a1 2003-11-23 devnull goto cloop;
140 bc7cb1a1 2003-11-23 devnull if(*string == '\0')
141 bc7cb1a1 2003-11-23 devnull continue;
142 bc7cb1a1 2003-11-23 devnull if(match("ebcdic")) {
143 bc7cb1a1 2003-11-23 devnull conv = ebcdic;
144 bc7cb1a1 2003-11-23 devnull goto cloop;
146 bc7cb1a1 2003-11-23 devnull if(match("ibm")) {
147 bc7cb1a1 2003-11-23 devnull conv = ibm;
148 bc7cb1a1 2003-11-23 devnull goto cloop;
150 bc7cb1a1 2003-11-23 devnull if(match("ascii")) {
151 bc7cb1a1 2003-11-23 devnull conv = ascii;
152 bc7cb1a1 2003-11-23 devnull goto cloop;
154 bc7cb1a1 2003-11-23 devnull if(match("block")) {
155 bc7cb1a1 2003-11-23 devnull conv = block;
156 bc7cb1a1 2003-11-23 devnull goto cloop;
158 bc7cb1a1 2003-11-23 devnull if(match("unblock")) {
159 bc7cb1a1 2003-11-23 devnull conv = unblock;
160 bc7cb1a1 2003-11-23 devnull goto cloop;
162 bc7cb1a1 2003-11-23 devnull if(match("lcase")) {
163 bc7cb1a1 2003-11-23 devnull cflag |= LCASE;
164 bc7cb1a1 2003-11-23 devnull goto cloop;
166 bc7cb1a1 2003-11-23 devnull if(match("ucase")) {
167 bc7cb1a1 2003-11-23 devnull cflag |= UCASE;
168 bc7cb1a1 2003-11-23 devnull goto cloop;
170 bc7cb1a1 2003-11-23 devnull if(match("swab")) {
171 bc7cb1a1 2003-11-23 devnull cflag |= SWAB;
172 bc7cb1a1 2003-11-23 devnull goto cloop;
174 bc7cb1a1 2003-11-23 devnull if(match("noerror")) {
175 bc7cb1a1 2003-11-23 devnull cflag |= NERR;
176 bc7cb1a1 2003-11-23 devnull goto cloop;
178 bc7cb1a1 2003-11-23 devnull if(match("sync")) {
179 bc7cb1a1 2003-11-23 devnull cflag |= SYNC;
180 bc7cb1a1 2003-11-23 devnull goto cloop;
182 11a3ce57 2011-08-16 rsc fprint(2, "dd: bad conv %s\n", argv[c]);
183 11a3ce57 2011-08-16 rsc exits("arg");
185 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: bad arg: %s\n", key);
186 bc7cb1a1 2003-11-23 devnull exits("arg");
188 bc7cb1a1 2003-11-23 devnull if(conv == null && cflag&(LCASE|UCASE))
189 bc7cb1a1 2003-11-23 devnull conv = cnull;
190 bc7cb1a1 2003-11-23 devnull if(ifile)
191 bc7cb1a1 2003-11-23 devnull ibf = open(ifile, 0);
193 bc7cb1a1 2003-11-23 devnull ibf = dup(0, -1);
194 bc7cb1a1 2003-11-23 devnull if(ibf < 0) {
195 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: open %s: %r\n", ifile);
196 bc7cb1a1 2003-11-23 devnull exits("open");
198 bc7cb1a1 2003-11-23 devnull if(ofile){
199 bc7cb1a1 2003-11-23 devnull if(dotrunc)
200 bc7cb1a1 2003-11-23 devnull obf = create(ofile, 1, 0664);
202 bc7cb1a1 2003-11-23 devnull obf = open(ofile, 1);
203 bc7cb1a1 2003-11-23 devnull if(obf < 0) {
204 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: create %s: %r\n", ofile);
205 bc7cb1a1 2003-11-23 devnull exits("create");
208 bc7cb1a1 2003-11-23 devnull obf = dup(1, -1);
209 bc7cb1a1 2003-11-23 devnull if(obf < 0) {
210 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: can't dup file descriptor: %s: %r\n", ofile);
211 bc7cb1a1 2003-11-23 devnull exits("dup");
215 bc7cb1a1 2003-11-23 devnull ibs = obs = bs;
216 bc7cb1a1 2003-11-23 devnull if(ibs == obs && conv == null)
217 bc7cb1a1 2003-11-23 devnull fflag++;
218 bc7cb1a1 2003-11-23 devnull if(ibs == 0 || obs == 0) {
219 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: counts: cannot be zero\n");
220 bc7cb1a1 2003-11-23 devnull exits("counts");
222 310ae033 2017-01-06 rsc ibuf = malloc(ibs);
223 bc7cb1a1 2003-11-23 devnull if(fflag)
224 bc7cb1a1 2003-11-23 devnull obuf = ibuf;
226 310ae033 2017-01-06 rsc obuf = malloc(obs);
227 310ae033 2017-01-06 rsc if(ibuf == (char *)0 || obuf == (char *)0) {
228 bc7cb1a1 2003-11-23 devnull fprint(2, "dd: not enough memory: %r\n");
229 bc7cb1a1 2003-11-23 devnull exits("memory");
231 bc7cb1a1 2003-11-23 devnull ibc = 0;
232 bc7cb1a1 2003-11-23 devnull obc = 0;
233 bc7cb1a1 2003-11-23 devnull cbc = 0;
234 bc7cb1a1 2003-11-23 devnull op = obuf;
237 bc7cb1a1 2003-11-23 devnull if(signal(SIGINT, SIG_IGN) != SIG_IGN)
238 bc7cb1a1 2003-11-23 devnull signal(SIGINT, term);
240 bc7cb1a1 2003-11-23 devnull seek(obf, obs*oseekn, 1);
241 bc7cb1a1 2003-11-23 devnull seek(ibf, ibs*iseekn, 1);
242 bc7cb1a1 2003-11-23 devnull while(skip) {
243 bc7cb1a1 2003-11-23 devnull read(ibf, ibuf, ibs);
249 bc7cb1a1 2003-11-23 devnull if(ibc-- == 0) {
250 bc7cb1a1 2003-11-23 devnull ibc = 0;
251 bc7cb1a1 2003-11-23 devnull if(count==0 || nifr+nipr!=count) {
252 bc7cb1a1 2003-11-23 devnull if(cflag&(NERR|SYNC))
253 bc7cb1a1 2003-11-23 devnull for(ip=ibuf+ibs; ip>ibuf;)
254 bc7cb1a1 2003-11-23 devnull *--ip = 0;
255 bc7cb1a1 2003-11-23 devnull ibc = read(ibf, ibuf, ibs);
257 bc7cb1a1 2003-11-23 devnull if(ibc == -1) {
258 bc7cb1a1 2003-11-23 devnull perror("read");
259 bc7cb1a1 2003-11-23 devnull if((cflag&NERR) == 0) {
261 11a3ce57 2011-08-16 rsc term("errors");
263 bc7cb1a1 2003-11-23 devnull ibc = 0;
264 bc7cb1a1 2003-11-23 devnull for(c=0; c<ibs; c++)
265 bc7cb1a1 2003-11-23 devnull if(ibuf[c] != 0)
267 11a3ce57 2011-08-16 rsc seek(ibf, ibs, 1);
269 11a3ce57 2011-08-16 rsc }else if(ibc == 0 && --files<=0) {
273 bc7cb1a1 2003-11-23 devnull if(ibc != ibs) {
275 bc7cb1a1 2003-11-23 devnull if(cflag&SYNC)
276 bc7cb1a1 2003-11-23 devnull ibc = ibs;
279 bc7cb1a1 2003-11-23 devnull ip = ibuf;
280 bc7cb1a1 2003-11-23 devnull c = (ibc>>1) & ~1;
281 bc7cb1a1 2003-11-23 devnull if(cflag&SWAB && c)
283 bc7cb1a1 2003-11-23 devnull a = *ip++;
284 bc7cb1a1 2003-11-23 devnull ip[-1] = *ip;
285 bc7cb1a1 2003-11-23 devnull *ip++ = a;
286 bc7cb1a1 2003-11-23 devnull } while(--c);
287 bc7cb1a1 2003-11-23 devnull ip = ibuf;
288 bc7cb1a1 2003-11-23 devnull if(fflag) {
289 bc7cb1a1 2003-11-23 devnull obc = ibc;
291 bc7cb1a1 2003-11-23 devnull ibc = 0;
293 bc7cb1a1 2003-11-23 devnull goto loop;
296 bc7cb1a1 2003-11-23 devnull c |= *ip++;
297 bc7cb1a1 2003-11-23 devnull c &= 0377;
298 bc7cb1a1 2003-11-23 devnull (*conv)(c);
299 bc7cb1a1 2003-11-23 devnull goto loop;
301 a59b2ede 2011-09-19 rsc return 0; // shut up apple gcc
305 bc7cb1a1 2003-11-23 devnull flsh(void)
309 bc7cb1a1 2003-11-23 devnull if(obc) {
310 11a3ce57 2011-08-16 rsc /* don't perror dregs of previous errors on a short write */
311 11a3ce57 2011-08-16 rsc werrstr("");
312 bc7cb1a1 2003-11-23 devnull c = write(obf, obuf, obc);
313 bc7cb1a1 2003-11-23 devnull if(c != obc) {
314 bc7cb1a1 2003-11-23 devnull if(c > 0)
316 bc7cb1a1 2003-11-23 devnull perror("write");
317 11a3ce57 2011-08-16 rsc term("errors");
319 bc7cb1a1 2003-11-23 devnull if(obc == obs)
323 bc7cb1a1 2003-11-23 devnull obc = 0;
328 bc7cb1a1 2003-11-23 devnull match(char *s)
330 bc7cb1a1 2003-11-23 devnull char *cs;
332 bc7cb1a1 2003-11-23 devnull cs = string;
333 bc7cb1a1 2003-11-23 devnull while(*cs++ == *s)
334 bc7cb1a1 2003-11-23 devnull if(*s++ == '\0')
335 bc7cb1a1 2003-11-23 devnull goto true;
336 bc7cb1a1 2003-11-23 devnull if(*s != '\0')
337 bc7cb1a1 2003-11-23 devnull return 0;
341 bc7cb1a1 2003-11-23 devnull string = cs;
342 bc7cb1a1 2003-11-23 devnull return 1;
346 11a3ce57 2011-08-16 rsc number(vlong big)
348 bc7cb1a1 2003-11-23 devnull char *cs;
351 bc7cb1a1 2003-11-23 devnull cs = string;
353 bc7cb1a1 2003-11-23 devnull while(*cs >= '0' && *cs <= '9')
354 bc7cb1a1 2003-11-23 devnull n = n*10 + *cs++ - '0';
356 bc7cb1a1 2003-11-23 devnull switch(*cs++) {
358 bc7cb1a1 2003-11-23 devnull case 'k':
359 bc7cb1a1 2003-11-23 devnull n *= 1024;
360 bc7cb1a1 2003-11-23 devnull continue;
362 bc7cb1a1 2003-11-23 devnull case 'b':
363 bc7cb1a1 2003-11-23 devnull n *= 512;
364 bc7cb1a1 2003-11-23 devnull continue;
366 bc7cb1a1 2003-11-23 devnull /* case '*':*/
367 bc7cb1a1 2003-11-23 devnull case 'x':
368 bc7cb1a1 2003-11-23 devnull string = cs;
369 11a3ce57 2011-08-16 rsc n *= number(VBIG);
371 bc7cb1a1 2003-11-23 devnull case '\0':
372 11a3ce57 2011-08-16 rsc if(n > big) {
373 11a3ce57 2011-08-16 rsc fprint(2, "dd: argument %llud out of range\n", n);
374 bc7cb1a1 2003-11-23 devnull exits("range");
376 bc7cb1a1 2003-11-23 devnull return n;
378 bc7cb1a1 2003-11-23 devnull /* never gets here */
382 bc7cb1a1 2003-11-23 devnull cnull(int cc)
387 bc7cb1a1 2003-11-23 devnull if((cflag&UCASE) && c>='a' && c<='z')
388 bc7cb1a1 2003-11-23 devnull c += 'A'-'a';
389 bc7cb1a1 2003-11-23 devnull if((cflag&LCASE) && c>='A' && c<='Z')
390 bc7cb1a1 2003-11-23 devnull c += 'a'-'A';
391 bc7cb1a1 2003-11-23 devnull null(c);
395 bc7cb1a1 2003-11-23 devnull null(int c)
398 bc7cb1a1 2003-11-23 devnull *op = c;
400 bc7cb1a1 2003-11-23 devnull if(++obc >= obs) {
402 bc7cb1a1 2003-11-23 devnull op = obuf;
407 bc7cb1a1 2003-11-23 devnull ascii(int cc)
411 bc7cb1a1 2003-11-23 devnull c = etoa[cc];
412 bc7cb1a1 2003-11-23 devnull if(cbs == 0) {
413 bc7cb1a1 2003-11-23 devnull cnull(c);
416 bc7cb1a1 2003-11-23 devnull if(c == ' ') {
417 bc7cb1a1 2003-11-23 devnull nspace++;
418 bc7cb1a1 2003-11-23 devnull goto out;
420 bc7cb1a1 2003-11-23 devnull while(nspace > 0) {
421 bc7cb1a1 2003-11-23 devnull null(' ');
422 bc7cb1a1 2003-11-23 devnull nspace--;
424 bc7cb1a1 2003-11-23 devnull cnull(c);
427 bc7cb1a1 2003-11-23 devnull if(++cbc >= cbs) {
428 bc7cb1a1 2003-11-23 devnull null('\n');
429 bc7cb1a1 2003-11-23 devnull cbc = 0;
430 bc7cb1a1 2003-11-23 devnull nspace = 0;
435 bc7cb1a1 2003-11-23 devnull unblock(int cc)
439 bc7cb1a1 2003-11-23 devnull c = cc & 0377;
440 bc7cb1a1 2003-11-23 devnull if(cbs == 0) {
441 bc7cb1a1 2003-11-23 devnull cnull(c);
444 bc7cb1a1 2003-11-23 devnull if(c == ' ') {
445 bc7cb1a1 2003-11-23 devnull nspace++;
446 bc7cb1a1 2003-11-23 devnull goto out;
448 bc7cb1a1 2003-11-23 devnull while(nspace > 0) {
449 bc7cb1a1 2003-11-23 devnull null(' ');
450 bc7cb1a1 2003-11-23 devnull nspace--;
452 bc7cb1a1 2003-11-23 devnull cnull(c);
455 bc7cb1a1 2003-11-23 devnull if(++cbc >= cbs) {
456 bc7cb1a1 2003-11-23 devnull null('\n');
457 bc7cb1a1 2003-11-23 devnull cbc = 0;
458 bc7cb1a1 2003-11-23 devnull nspace = 0;
463 bc7cb1a1 2003-11-23 devnull ebcdic(int cc)
468 bc7cb1a1 2003-11-23 devnull if(cflag&UCASE && c>='a' && c<='z')
469 bc7cb1a1 2003-11-23 devnull c += 'A'-'a';
470 bc7cb1a1 2003-11-23 devnull if(cflag&LCASE && c>='A' && c<='Z')
471 bc7cb1a1 2003-11-23 devnull c += 'a'-'A';
472 bc7cb1a1 2003-11-23 devnull c = atoe[c];
473 bc7cb1a1 2003-11-23 devnull if(cbs == 0) {
474 bc7cb1a1 2003-11-23 devnull null(c);
477 bc7cb1a1 2003-11-23 devnull if(cc == '\n') {
478 bc7cb1a1 2003-11-23 devnull while(cbc < cbs) {
479 bc7cb1a1 2003-11-23 devnull null(atoe[' ']);
482 bc7cb1a1 2003-11-23 devnull cbc = 0;
485 bc7cb1a1 2003-11-23 devnull if(cbc == cbs)
486 bc7cb1a1 2003-11-23 devnull ntrunc++;
488 bc7cb1a1 2003-11-23 devnull if(cbc <= cbs)
489 bc7cb1a1 2003-11-23 devnull null(c);
493 bc7cb1a1 2003-11-23 devnull ibm(int cc)
498 bc7cb1a1 2003-11-23 devnull if(cflag&UCASE && c>='a' && c<='z')
499 bc7cb1a1 2003-11-23 devnull c += 'A'-'a';
500 bc7cb1a1 2003-11-23 devnull if(cflag&LCASE && c>='A' && c<='Z')
501 bc7cb1a1 2003-11-23 devnull c += 'a'-'A';
502 bc7cb1a1 2003-11-23 devnull c = atoibm[c] & 0377;
503 bc7cb1a1 2003-11-23 devnull if(cbs == 0) {
504 bc7cb1a1 2003-11-23 devnull null(c);
507 bc7cb1a1 2003-11-23 devnull if(cc == '\n') {
508 bc7cb1a1 2003-11-23 devnull while(cbc < cbs) {
509 bc7cb1a1 2003-11-23 devnull null(atoibm[' ']);
512 bc7cb1a1 2003-11-23 devnull cbc = 0;
515 bc7cb1a1 2003-11-23 devnull if(cbc == cbs)
516 bc7cb1a1 2003-11-23 devnull ntrunc++;
518 bc7cb1a1 2003-11-23 devnull if(cbc <= cbs)
519 bc7cb1a1 2003-11-23 devnull null(c);
523 bc7cb1a1 2003-11-23 devnull block(int cc)
528 bc7cb1a1 2003-11-23 devnull if(cflag&UCASE && c>='a' && c<='z')
529 bc7cb1a1 2003-11-23 devnull c += 'A'-'a';
530 bc7cb1a1 2003-11-23 devnull if(cflag&LCASE && c>='A' && c<='Z')
531 bc7cb1a1 2003-11-23 devnull c += 'a'-'A';
532 bc7cb1a1 2003-11-23 devnull c &= 0377;
533 bc7cb1a1 2003-11-23 devnull if(cbs == 0) {
534 bc7cb1a1 2003-11-23 devnull null(c);
537 bc7cb1a1 2003-11-23 devnull if(cc == '\n') {
538 bc7cb1a1 2003-11-23 devnull while(cbc < cbs) {
539 bc7cb1a1 2003-11-23 devnull null(' ');
542 bc7cb1a1 2003-11-23 devnull cbc = 0;
545 bc7cb1a1 2003-11-23 devnull if(cbc == cbs)
546 bc7cb1a1 2003-11-23 devnull ntrunc++;
548 bc7cb1a1 2003-11-23 devnull if(cbc <= cbs)
549 bc7cb1a1 2003-11-23 devnull null(c);
553 11a3ce57 2011-08-16 rsc term(char *status)
555 bc7cb1a1 2003-11-23 devnull stats();
556 11a3ce57 2011-08-16 rsc exits(status);
560 bc7cb1a1 2003-11-23 devnull stats(void)
564 bc7cb1a1 2003-11-23 devnull fprint(2, "%lud+%lud records in\n", nifr, nipr);
565 bc7cb1a1 2003-11-23 devnull fprint(2, "%lud+%lud records out\n", nofr, nopr);
566 bc7cb1a1 2003-11-23 devnull if(ntrunc)
567 bc7cb1a1 2003-11-23 devnull fprint(2, "%lud truncated records\n", ntrunc);
570 bc7cb1a1 2003-11-23 devnull uchar etoa[] =
572 bc7cb1a1 2003-11-23 devnull 0000,0001,0002,0003,0234,0011,0206,0177,
573 bc7cb1a1 2003-11-23 devnull 0227,0215,0216,0013,0014,0015,0016,0017,
574 bc7cb1a1 2003-11-23 devnull 0020,0021,0022,0023,0235,0205,0010,0207,
575 bc7cb1a1 2003-11-23 devnull 0030,0031,0222,0217,0034,0035,0036,0037,
576 bc7cb1a1 2003-11-23 devnull 0200,0201,0202,0203,0204,0012,0027,0033,
577 bc7cb1a1 2003-11-23 devnull 0210,0211,0212,0213,0214,0005,0006,0007,
578 bc7cb1a1 2003-11-23 devnull 0220,0221,0026,0223,0224,0225,0226,0004,
579 bc7cb1a1 2003-11-23 devnull 0230,0231,0232,0233,0024,0025,0236,0032,
580 bc7cb1a1 2003-11-23 devnull 0040,0240,0241,0242,0243,0244,0245,0246,
581 bc7cb1a1 2003-11-23 devnull 0247,0250,0133,0056,0074,0050,0053,0041,
582 bc7cb1a1 2003-11-23 devnull 0046,0251,0252,0253,0254,0255,0256,0257,
583 bc7cb1a1 2003-11-23 devnull 0260,0261,0135,0044,0052,0051,0073,0136,
584 bc7cb1a1 2003-11-23 devnull 0055,0057,0262,0263,0264,0265,0266,0267,
585 bc7cb1a1 2003-11-23 devnull 0270,0271,0174,0054,0045,0137,0076,0077,
586 bc7cb1a1 2003-11-23 devnull 0272,0273,0274,0275,0276,0277,0300,0301,
587 bc7cb1a1 2003-11-23 devnull 0302,0140,0072,0043,0100,0047,0075,0042,
588 bc7cb1a1 2003-11-23 devnull 0303,0141,0142,0143,0144,0145,0146,0147,
589 bc7cb1a1 2003-11-23 devnull 0150,0151,0304,0305,0306,0307,0310,0311,
590 bc7cb1a1 2003-11-23 devnull 0312,0152,0153,0154,0155,0156,0157,0160,
591 bc7cb1a1 2003-11-23 devnull 0161,0162,0313,0314,0315,0316,0317,0320,
592 bc7cb1a1 2003-11-23 devnull 0321,0176,0163,0164,0165,0166,0167,0170,
593 bc7cb1a1 2003-11-23 devnull 0171,0172,0322,0323,0324,0325,0326,0327,
594 bc7cb1a1 2003-11-23 devnull 0330,0331,0332,0333,0334,0335,0336,0337,
595 bc7cb1a1 2003-11-23 devnull 0340,0341,0342,0343,0344,0345,0346,0347,
596 bc7cb1a1 2003-11-23 devnull 0173,0101,0102,0103,0104,0105,0106,0107,
597 bc7cb1a1 2003-11-23 devnull 0110,0111,0350,0351,0352,0353,0354,0355,
598 bc7cb1a1 2003-11-23 devnull 0175,0112,0113,0114,0115,0116,0117,0120,
599 bc7cb1a1 2003-11-23 devnull 0121,0122,0356,0357,0360,0361,0362,0363,
600 bc7cb1a1 2003-11-23 devnull 0134,0237,0123,0124,0125,0126,0127,0130,
601 bc7cb1a1 2003-11-23 devnull 0131,0132,0364,0365,0366,0367,0370,0371,
602 bc7cb1a1 2003-11-23 devnull 0060,0061,0062,0063,0064,0065,0066,0067,
603 bc7cb1a1 2003-11-23 devnull 0070,0071,0372,0373,0374,0375,0376,0377,
605 bc7cb1a1 2003-11-23 devnull uchar atoe[] =
607 bc7cb1a1 2003-11-23 devnull 0000,0001,0002,0003,0067,0055,0056,0057,
608 bc7cb1a1 2003-11-23 devnull 0026,0005,0045,0013,0014,0015,0016,0017,
609 bc7cb1a1 2003-11-23 devnull 0020,0021,0022,0023,0074,0075,0062,0046,
610 bc7cb1a1 2003-11-23 devnull 0030,0031,0077,0047,0034,0035,0036,0037,
611 bc7cb1a1 2003-11-23 devnull 0100,0117,0177,0173,0133,0154,0120,0175,
612 bc7cb1a1 2003-11-23 devnull 0115,0135,0134,0116,0153,0140,0113,0141,
613 bc7cb1a1 2003-11-23 devnull 0360,0361,0362,0363,0364,0365,0366,0367,
614 bc7cb1a1 2003-11-23 devnull 0370,0371,0172,0136,0114,0176,0156,0157,
615 bc7cb1a1 2003-11-23 devnull 0174,0301,0302,0303,0304,0305,0306,0307,
616 bc7cb1a1 2003-11-23 devnull 0310,0311,0321,0322,0323,0324,0325,0326,
617 bc7cb1a1 2003-11-23 devnull 0327,0330,0331,0342,0343,0344,0345,0346,
618 bc7cb1a1 2003-11-23 devnull 0347,0350,0351,0112,0340,0132,0137,0155,
619 bc7cb1a1 2003-11-23 devnull 0171,0201,0202,0203,0204,0205,0206,0207,
620 bc7cb1a1 2003-11-23 devnull 0210,0211,0221,0222,0223,0224,0225,0226,
621 bc7cb1a1 2003-11-23 devnull 0227,0230,0231,0242,0243,0244,0245,0246,
622 bc7cb1a1 2003-11-23 devnull 0247,0250,0251,0300,0152,0320,0241,0007,
623 bc7cb1a1 2003-11-23 devnull 0040,0041,0042,0043,0044,0025,0006,0027,
624 bc7cb1a1 2003-11-23 devnull 0050,0051,0052,0053,0054,0011,0012,0033,
625 bc7cb1a1 2003-11-23 devnull 0060,0061,0032,0063,0064,0065,0066,0010,
626 bc7cb1a1 2003-11-23 devnull 0070,0071,0072,0073,0004,0024,0076,0341,
627 bc7cb1a1 2003-11-23 devnull 0101,0102,0103,0104,0105,0106,0107,0110,
628 bc7cb1a1 2003-11-23 devnull 0111,0121,0122,0123,0124,0125,0126,0127,
629 bc7cb1a1 2003-11-23 devnull 0130,0131,0142,0143,0144,0145,0146,0147,
630 bc7cb1a1 2003-11-23 devnull 0150,0151,0160,0161,0162,0163,0164,0165,
631 bc7cb1a1 2003-11-23 devnull 0166,0167,0170,0200,0212,0213,0214,0215,
632 bc7cb1a1 2003-11-23 devnull 0216,0217,0220,0232,0233,0234,0235,0236,
633 bc7cb1a1 2003-11-23 devnull 0237,0240,0252,0253,0254,0255,0256,0257,
634 bc7cb1a1 2003-11-23 devnull 0260,0261,0262,0263,0264,0265,0266,0267,
635 bc7cb1a1 2003-11-23 devnull 0270,0271,0272,0273,0274,0275,0276,0277,
636 bc7cb1a1 2003-11-23 devnull 0312,0313,0314,0315,0316,0317,0332,0333,
637 bc7cb1a1 2003-11-23 devnull 0334,0335,0336,0337,0352,0353,0354,0355,
638 bc7cb1a1 2003-11-23 devnull 0356,0357,0372,0373,0374,0375,0376,0377,
640 bc7cb1a1 2003-11-23 devnull uchar atoibm[] =
642 bc7cb1a1 2003-11-23 devnull 0000,0001,0002,0003,0067,0055,0056,0057,
643 bc7cb1a1 2003-11-23 devnull 0026,0005,0045,0013,0014,0015,0016,0017,
644 bc7cb1a1 2003-11-23 devnull 0020,0021,0022,0023,0074,0075,0062,0046,
645 bc7cb1a1 2003-11-23 devnull 0030,0031,0077,0047,0034,0035,0036,0037,
646 bc7cb1a1 2003-11-23 devnull 0100,0132,0177,0173,0133,0154,0120,0175,
647 bc7cb1a1 2003-11-23 devnull 0115,0135,0134,0116,0153,0140,0113,0141,
648 bc7cb1a1 2003-11-23 devnull 0360,0361,0362,0363,0364,0365,0366,0367,
649 bc7cb1a1 2003-11-23 devnull 0370,0371,0172,0136,0114,0176,0156,0157,
650 bc7cb1a1 2003-11-23 devnull 0174,0301,0302,0303,0304,0305,0306,0307,
651 bc7cb1a1 2003-11-23 devnull 0310,0311,0321,0322,0323,0324,0325,0326,
652 bc7cb1a1 2003-11-23 devnull 0327,0330,0331,0342,0343,0344,0345,0346,
653 bc7cb1a1 2003-11-23 devnull 0347,0350,0351,0255,0340,0275,0137,0155,
654 bc7cb1a1 2003-11-23 devnull 0171,0201,0202,0203,0204,0205,0206,0207,
655 bc7cb1a1 2003-11-23 devnull 0210,0211,0221,0222,0223,0224,0225,0226,
656 bc7cb1a1 2003-11-23 devnull 0227,0230,0231,0242,0243,0244,0245,0246,
657 bc7cb1a1 2003-11-23 devnull 0247,0250,0251,0300,0117,0320,0241,0007,
658 bc7cb1a1 2003-11-23 devnull 0040,0041,0042,0043,0044,0025,0006,0027,
659 bc7cb1a1 2003-11-23 devnull 0050,0051,0052,0053,0054,0011,0012,0033,
660 bc7cb1a1 2003-11-23 devnull 0060,0061,0032,0063,0064,0065,0066,0010,
661 bc7cb1a1 2003-11-23 devnull 0070,0071,0072,0073,0004,0024,0076,0341,
662 bc7cb1a1 2003-11-23 devnull 0101,0102,0103,0104,0105,0106,0107,0110,
663 bc7cb1a1 2003-11-23 devnull 0111,0121,0122,0123,0124,0125,0126,0127,
664 bc7cb1a1 2003-11-23 devnull 0130,0131,0142,0143,0144,0145,0146,0147,
665 bc7cb1a1 2003-11-23 devnull 0150,0151,0160,0161,0162,0163,0164,0165,
666 bc7cb1a1 2003-11-23 devnull 0166,0167,0170,0200,0212,0213,0214,0215,
667 bc7cb1a1 2003-11-23 devnull 0216,0217,0220,0232,0233,0234,0235,0236,
668 bc7cb1a1 2003-11-23 devnull 0237,0240,0252,0253,0254,0255,0256,0257,
669 bc7cb1a1 2003-11-23 devnull 0260,0261,0262,0263,0264,0265,0266,0267,
670 bc7cb1a1 2003-11-23 devnull 0270,0271,0272,0273,0274,0275,0276,0277,
671 bc7cb1a1 2003-11-23 devnull 0312,0313,0314,0315,0316,0317,0332,0333,
672 bc7cb1a1 2003-11-23 devnull 0334,0335,0336,0337,0352,0353,0354,0355,
673 bc7cb1a1 2003-11-23 devnull 0356,0357,0372,0373,0374,0375,0376,0377,