barryg@sdcrdcf.UUCP (07/22/83)
There is a bug in the EBCDIC to ASCII translation in dd. I earlier submitted an alternative version of the etoa translation table, but decided that the user should have a choice of translation tables - either the one that comes with the standard dd, or the one I built that is compatible with the IBM TN print train. conv=ascii selects the standard translation, and conv=tnascii selects the translation table I built. The following is the result of running diff, comparing the standard source (4.1bsd) with my source. My source will be posted to net.sources. barry gold diff /usr/src/cmd/dd.c ~/dd.c > dd.diff 1c1 < static char *sccsid = "@(#)dd.c 4.1 (Berkeley) 10/1/80"; --- > static char *sccsid = "@(#)dd.c 4.1.a (Barry Gold) 7/22/83"; 72a73,115 > char etoatn[] = { > /*NUL SOH STX ETX HT DEL*/ > /*00*/ 0000,0001,0002,0003,0234,'\t',0206,0177, > /* VT FF CR SO SI*/ > 0227,0215,0216,0013,'\f','\r',0016,0017, > /*DLE DC1 DC2 DC3 NL BS*/ > /*10*/ 0020,0021,0022,0023,0235,'\n','\b',0207, > /* EM SUB FS GS RS US*/ > 0030,0031,0222,0217,0034,0035,0036,0037, > /*LF ETB ESC*/ > /*20*/ 0200,0201,0202,0203,0204,'\n',0027,0033, > /*ENQ ACK BEL*/ > 0210,0211,0212,0213,0214,0005,0006,0007, > /* SYN EOT*/ > /*30*/ 0220,0221,0026,0223,0224,0225,0226,0004, > /* DC4 NAK SUB*/ > 0230,0231,0232,0233,0024,0025,0236,0032, > /*40*/ ' ',0240,0241,0242,0243,0244,0245,0246, > /*cent*/ /*4a (cent) ==> [ */ > 0247,0250, '[', '.', '<', '(', '+', '^', > /*50*/ '&',0251,0252,0253,0254,0255,0256,0257, > 0260,0261, '!', '$', '*', ')', ';', '~', > /*60*/ '-', '/',0262,0263,0264,0265,0266,0267, > 0270,0271, '|', ',', '%', '_', '>', '?', > /*70*/ 0272,0273,0274,0275,0276,0277,0300,0301, > 0302, '`', ':', '#', '@','\'', '=','\"', > /*80*/ 0303, 'a', 'b', 'c', 'd', 'e', 'f', 'g', > 'h', 'i',0304,0305,0306,0307,0310,0311, > /*90*/ 0312, 'j', 'k', 'l', 'm', 'n', 'o', 'p', > 'q', 'r',0313,0314,0315,0316,0317,0320, > /*A0*/ 0321, '~', 's', 't', 'u', 'v', 'w', 'x', > 'y', 'z',0322,0324,0325, '[',0326,0327, /*AD = [*/ > /*B0*/ 0330,0331,0332,0333,0334,0335,0336,0337, > 0340,0341,0342,0344,0345, ']',0346,0347, /*BD = ]*/ > /*C0*/ '{', 'A', 'B', 'C', 'D', 'E', 'F', 'G', > 'H', 'I',0350,0351,0352,0353,0354,0355, > /*D0*/ '}', 'J', 'K', 'L', 'M', 'N', 'O', 'P', > 'Q', 'R',0356,0357,0360,0361,0362,0363, > /*E0*/ '\\',0237, 'S', 'T', 'U', 'V', 'W', 'X', > 'Y', 'Z',0364,0365,0366,0367,0370,0371, > /*F0*/ '0', '1', '2', '3', '4', '5', '6', '7', > '8', '9',0372,0373,0374,0375,0376,0377, > }; 151c194,195 < int ebcdic(), ibm(), ascii(), null(), cnull(), term(), block(), unblock(); --- > int ebcdic(), ibm(), ascii(), tnascii(), null(), cnull(), term(), > block(), unblock(); 214a259,262 > if(match("tnascii")) { > conv = tnascii; > goto cloop; > } 477a526,552 > tnascii(cc) > { > register c; > > c = etoatn[cc] & 0377; > if(cbs == 0) { > cnull(c); > return; > } > if(c == ' ') { > nspace++; > goto out; > } > while(nspace > 0) { > null(' '); > nspace--; > } > cnull(c); > > out: > if(++cbc >= cbs) { > null('\n'); > cbc = 0; > nspace = 0; > } > } > 606a682,683 > >