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