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