Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!wuarchive!julius.cs.uiuc.edu!apple!voder!blia!jeffb From: jeffb@blia.BLI.COM (Jeff Beard) Newsgroups: comp.lang.c Subject: Re: EBCDIC <--> ASCII conversion Message-ID: <12609@blia.BLI.COM> Date: 2 Oct 90 22:29:17 GMT References: <1756@dinl.mmc.UUCP> <1990Oct2.185212.25161@athena.mit.edu> Reply-To: jeffb@blia.UUCP (Jeff Beard) Organization: Britton Lee, Los Gatos, CA Lines: 173 dd conv=ebcdic is in error for some codes, and is why dd also supplies conv=ibm. However, this too is in error frequently due to ambiguities in the EBCDIC table(s) ... it depends on which table you read and how one needs to map the ASCII to EBCDIC set difference. The following two tables will allow you to define your own translation. /* This routine contains only the two tables needed to convert ASCII to EBCDIC and EBCDIC to ASCII. The conversion is according to BTL character set standards. There are some anomolies in a one/one mapping: not all characters are in both charater sets eg: PL/1 not '~' ascii karot '^' tidle '~' not all devices can display all characters in the set eg: square braces '[]' brackets '{}' we accept ASCII data in a 1/1 mapping we translate EBCDIC ~ to ASCII ~ Table used to convert ascii to ebcdic. ~ */ static char dummy[] = {0}; /* for EOF index */ char atoe[] = { 0x00 , 0x01 , 0x02 , 0x03 , 0x37 , 0x2d , 0x2e , 0x2f , 0x16 , 0x05 , 0x25 , 0x0b , 0x0c , 0x0d , 0x0e , 0x0f , 0x10 , 0x11 , 0x12 , 0x13 , 0x3c , 0x3d , 0x32 , 0x26 , 0x18 , 0x19 , 0x1a , 0x27 , 0x1c , 0x1d , 0x1e , 0x1f , 0x40 /* ' ' */, 0x5a /* '!' */, 0x7f /* '"' */, 0x7b /* '#' */, 0x5b /* '$' */, 0x6c /* '%' */, 0x50 /* '&' */, 0x7d /* ''' */, 0x4d /* '(' */, 0x5d /* ')' */, 0x5c /* '*' */, 0x4e /* '+' */, 0x6b /* ',' */, 0x60 /* '-' */, 0x4b /* '.' */, 0x61 /* '/' */, 0xf0 /* '0' */, 0xf1 /* '1' */, 0xf2 /* '2' */, 0xf3 /* '3' */, 0xf4 /* '4' */, 0xf5 /* '5' */, 0xf6 /* '6' */, 0xf7 /* '7' */, 0xf8 /* '8' */, 0xf9 /* '9' */, 0x7a /* ':' */, 0x5e /* ';' */, 0x4c /* '<' */, 0x7e /* '=' */, 0x6e /* '>' */, 0x6f /* '?' */, 0x7c /* ']' */, 0xc1 /* 'A' */, 0xc2 /* 'B' */, 0xc3 /* 'C' */, 0xc4 /* 'D' */, 0xc5 /* 'E' */, 0xc6 /* 'F' */, 0xc7 /* 'G' */, 0xc8 /* 'H' */, 0xc9 /* 'I' */, 0xd1 /* 'J' */, 0xd2 /* 'K' */, 0xd3 /* 'L' */, 0xd4 /* 'M' */, 0xd5 /* 'N' */, 0xd6 /* 'O' */, 0xd7 /* 'P' */, 0xd8 /* 'Q' */, 0xd9 /* 'R' */, 0xe2 /* 'S' */, 0xe3 /* 'T' */, 0xe4 /* 'U' */, 0xe5 /* 'V' */, 0xe6 /* 'W' */, 0xe7 /* 'X' */, 0xe8 /* 'Y' */, 0xe9 /* 'Z' */, 0xad /* '[' */, 0xe0 /* '\' */, 0xbd /* ']' */, 0x9a /* '^' */, 0x6d /* '_' */, 0x79 /* '`' */, 0x81 /* 'a' */, 0x82 /* 'b' */, 0x83 /* 'c' */, 0x84 /* 'd' */, 0x85 /* 'e' */, 0x86 /* 'f' */, 0x87 /* 'g' */, 0x88 /* 'h' */, 0x89 /* 'i' */, 0x91 /* 'j' */, 0x92 /* 'k' */, 0x93 /* 'l' */, 0x94 /* 'm' */, 0x95 /* 'n' */, 0x96 /* 'o' */, 0x97 /* 'p' */, 0x98 /* 'q' */, 0x99 /* 'r' */, 0xa2 /* 's' */, 0xa3 /* 't' */, 0xa4 /* 'u' */, 0xa5 /* 'v' */, 0xa6 /* 'w' */, 0xa7 /* 'x' */, 0xa8 /* 'y' */, 0xa9 /* 'z' */, 0xc0 /* '{' */, 0x4f /* '|' */, 0xd0 /* '}' */, 0xa1 /* '~' */, 0x07 , 0x04 , 0x06 , 0x08 , 0x09 , 0x0a , 0x14 , 0x15 , 0x17 , 0x1b , 0x20 , 0x21 , 0x22 , 0x23 , 0x24 , 0x28 , 0x29 , 0x2a , 0x2b , 0x2c , 0x30 , 0x31 , 0x33 , 0x34 , 0x35 , 0x36 , 0x38 , 0x39 , 0x3a , 0x3b , 0x3e , 0x3f , 0x41 , 0x42 , 0x43 , 0x44 , 0x45 , 0x46 , 0x47 , 0x48 , 0x49 , 0x4a , 0x51 , 0x52 , 0x53 , 0x54 , 0x55 , 0x56 , 0x57 , 0x58 , 0x59 , 0x62 , 0x63 , 0x64 , 0x65 , 0x66 , 0x67 , 0x68 , 0x69 , 0x6a , 0x70 , 0x71 , 0x72 , 0x73 , 0x74 , 0x75 , 0x76 , 0x77 , 0x78 , 0x80 , 0x8a , 0x8b , 0x8c , 0x8d , 0x8e , 0x8f , 0x90 , 0x9b , 0x9c , 0x9d , 0x9e , 0x9f , 0xa0 , 0xa1 , 0xaa , 0xab , 0xac , 0xae , 0xaf , 0xb0 , 0xb1 , 0xb2 , 0xb3 , 0xb4 , 0xb5 , 0xb6 , 0xb7 , 0xb8 , 0xb9 , 0xba , 0xbb , 0xbC , 0xbe , 0xbf , 0xca , 0xcb , 0xcc , 0xcd , 0xce , 0xcf , 0xda , 0xdb , 0xdc , 0xdd , 0xde , 0xdf , 0xe1 , 0xea , 0xeb , 0xec , 0xed , 0xee , 0xef , 0xfa , 0xfb , 0xfc , 0xfd , 0xfe , 0xff , }; /* Table used to convert ebcdic to ascii. */ static char dummy2[] = {0}; /* for EOF index */ char etoa[] = { /* 0 1 2 3 */ 0000 , 0001 , 0002 , 0003 , 0200 , 0011 , 0201 , 0177 , 0202 , 0203 , 0204 , 0013 , 0014 , 0015 , 0016 , 0017 , 0020 , 0021 , 0022 , 0023 , 0205 , 0206 , 0010 , 0207 , 0030 , 0031 , 0032 , 0210 , 0034 , 0035 , 0036 , 0037 , 0211 , 0212 , 0213 , 0214 , 0215 , 0012 , 0027 , 0033 , 0216 , 0217 , 0220 , 0221 , 0222 , 0005 , 0006 , 0007 , 0223 , 0224 , 0026 , 0225 , 0226 , 0227 , 0230 , 0004 , 0231 , 0232 , 0233 , 0234 , 0024 , 0025 , 0235 , 0236 , 0040 /* ' ' */, 0237 , 0240 , 0241 , 0242 , 0243 , 0244 , 0245 , 0246 , 0247 , 0250 , 0056 /* '.' */, 0074 /* '<' */, 0050 /* '(' */, 0053 /* '+' */, 0174 /* '|' */, 0046 /* '&' */, 0251 , 0252 , 0253 , 0254 , 0255 , 0256 , 0257 , 0260 , 0261 , 0041 /* '!' */, 0044 /* '$' */, 0052 /* '*' */, 0051 /* ')' */, 0073 /* ';' */, 0176 /* '~' */, 0055 /* '-' */, 0057 /* '/' */, 0262 , 0263 , 0264 , 0265 , 0266 , 0267 , 0270 , 0271 , 0272 , 0054 /* ',' */, 0045 /* '%' */, 0137 /* '_' */, 0076 /* '>' */, 0077 /* '?' */, 0273 , 0274 , 0275 , 0276 , 0277 , 0300 , 0301 , 0302 , 0303 , 0140 /* '`' */, 0072 /* ':' */, 0043 /* '#' */, 0100 /* '@' */, 0047 /* ''' */, 0075 /* '=' */, 0042 /* '"' */, 0304 , 0141 /* 'a' */, 0142 /* 'b' */, 0143 /* 'c' */, 0144 /* 'd' */, 0145 /* 'e' */, 0146 /* 'f' */, 0147 /* 'g' */, 0150 /* 'h' */, 0151 /* 'i' */, 0305 , 0306 , 0307 , 0310 , 0311 , 0312 , 0313 , 0152 /* 'j' */, 0153 /* 'k' */, 0154 /* 'l' */, 0155 /* 'm' */, 0156 /* 'n' */, 0157 /* 'o' */, 0160 /* 'p' */, 0161 /* 'q' */, 0162 /* 'r' */, 0136 /* '^' */, 0314 , 0315 , 0316 , 0317 , 0320 , #ifdef OLDC 0321 , 0322 /* ~ */, 0163 /* 's' */, 0164 /* 't' */, #else OLDC 0321 , 0176 /* ~ */, 0163 /* 's' */, 0164 /* 't' */, #endif OLDC 0165 /* 'u' */, 0166 /* 'v' */, 0167 /* 'w' */, 0170 /* 'x' */, 0171 /* 'y' */, 0172 /* 'z' */, 0323 , 0324 , 0325 , 0133 /* '[' */, 0326 , 0327 , 0330 , 0331 , 0332 , 0333 , 0334 , 0335 , 0336 , 0337 , 0340 , 0341 , 0342 , 0343 , 0344 , 0135 /* ']' */, 0345 , 0346 , 0173 /* '{' */, 0101 /* 'A' */, 0102 /* 'B' */, 0103 /* 'C' */, 0104 /* 'D' */, 0105 /* 'E' */, 0106 /* 'F' */, 0107 /* 'G' */, 0110 /* 'H' */, 0111 /* 'I' */, 0347 , 0350 , 0351 , 0352 , 0353 , 0354 , 0175 /* '}' */, 0112 /* 'J' */, 0113 /* 'K' */, 0114 /* 'L' */, 0115 /* 'M' */, 0116 /* 'N' */, 0117 /* 'O' */, 0120 /* 'P' */, 0121 /* 'Q' */, 0122 /* 'R' */, 0355 , 0356 , 0357 , 0360 , 0361 , 0362 , 0134 /* '\' */, 0363 , 0123 /* 'S' */, 0124 /* 'T' */, 0125 /* 'U' */, 0126 /* 'V' */, 0127 /* 'W' */, 0130 /* 'X' */, 0131 /* 'Y' */, 0132 /* 'Z' */, 0364 , 0365 , 0366 , 0367 , 0370 , 0371 , 0060 /* '0' */, 0061 /* '1' */, 0062 /* '2' */, 0063 /* '3' */, 0064 /* '4' */, 0065 /* '5' */, 0066 /* '6' */, 0067 /* '7' */, 0070 /* '8' */, 0071 /* '9' */, 0372 , 0373 , 0374 , 0375 , 0376 , 0377 , };