dd - EBCDIC to ASCII translation error
barryg at sdcrdcf.UUCP
barryg at sdcrdcf.UUCP
Sat Jul 23 03:05:58 AEST 1983
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
>
>
More information about the Net.bugs
mailing list