comparison src/charset.c @ 27490:fb4c30606b4a v8.2.4273

patch 8.2.4273: the EBCDIC support is outdated Commit: https://github.com/vim/vim/commit/424bcae1fb0f69e0aef5e0cf84fd771cf34a0fb7 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jan 31 14:59:41 2022 +0000 patch 8.2.4273: the EBCDIC support is outdated Problem: The EBCDIC support is outdated. Solution: Remove the EBCDIC support.
author Bram Moolenaar <Bram@vim.org>
date Mon, 31 Jan 2022 16:00:09 +0100
parents 268f6a3511df
children c1d1639b52dd
comparison
equal deleted inserted replaced
27489:9f00e1edb43c 27490:fb4c30606b4a
85 { 85 {
86 /* 86 /*
87 * Set the default size for printable characters: 87 * Set the default size for printable characters:
88 * From <Space> to '~' is 1 (printable), others are 2 (not printable). 88 * From <Space> to '~' is 1 (printable), others are 2 (not printable).
89 * This also inits all 'isident' and 'isfname' flags to FALSE. 89 * This also inits all 'isident' and 'isfname' flags to FALSE.
90 *
91 * EBCDIC: all chars below ' ' are not printable, all others are
92 * printable.
93 */ 90 */
94 c = 0; 91 c = 0;
95 while (c < ' ') 92 while (c < ' ')
96 g_chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2; 93 g_chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2;
97 #ifdef EBCDIC
98 while (c < 255)
99 #else
100 while (c <= '~') 94 while (c <= '~')
101 #endif
102 g_chartab[c++] = 1 + CT_PRINT_CHAR; 95 g_chartab[c++] = 1 + CT_PRINT_CHAR;
103 while (c < 256) 96 while (c < 256)
104 { 97 {
105 // UTF-8: bytes 0xa0 - 0xff are printable (latin1) 98 // UTF-8: bytes 0xa0 - 0xff are printable (latin1)
106 if (enc_utf8 && c >= 0xa0) 99 if (enc_utf8 && c >= 0xa0)
219 else 212 else
220 g_chartab[c] |= CT_ID_CHAR; 213 g_chartab[c] |= CT_ID_CHAR;
221 } 214 }
222 else if (i == 1) // (re)set printable 215 else if (i == 1) // (re)set printable
223 { 216 {
224 if ((c < ' ' 217 if ((c < ' ' || c > '~'
225 #ifndef EBCDIC
226 || c > '~'
227 #endif
228 // For double-byte we keep the cell width, so 218 // For double-byte we keep the cell width, so
229 // that we can detect it from the first byte. 219 // that we can detect it from the first byte.
230 ) && !(enc_dbcs && MB_BYTE2LEN(c) == 2)) 220 ) && !(enc_dbcs && MB_BYTE2LEN(c) == 2))
231 { 221 {
232 if (tilde) 222 if (tilde)
517 transchar_charbuf[1] = '@'; 507 transchar_charbuf[1] = '@';
518 i = 2; 508 i = 2;
519 c = K_SECOND(c); 509 c = K_SECOND(c);
520 } 510 }
521 511
522 if ((!chartab_initialized && ( 512 if ((!chartab_initialized && ((c >= ' ' && c <= '~')))
523 #ifdef EBCDIC 513 || (c < 256 && vim_isprintc_strict(c)))
524 (c >= 64 && c < 255)
525 #else
526 (c >= ' ' && c <= '~')
527 #endif
528 )) || (c < 256 && vim_isprintc_strict(c)))
529 { 514 {
530 // printable character 515 // printable character
531 transchar_charbuf[i] = c; 516 transchar_charbuf[i] = c;
532 transchar_charbuf[i + 1] = NUL; 517 transchar_charbuf[i + 1] = NUL;
533 } 518 }
565 c = NL; // we use CR in place of NL in this case 550 c = NL; // we use CR in place of NL in this case
566 551
567 if (dy_flags & DY_UHEX) // 'display' has "uhex" 552 if (dy_flags & DY_UHEX) // 'display' has "uhex"
568 transchar_hex(charbuf, c); 553 transchar_hex(charbuf, c);
569 554
570 #ifdef EBCDIC
571 // For EBCDIC only the characters 0-63 and 255 are not printable
572 else if (CtrlChar(c) != 0 || c == DEL)
573 #else
574 else if (c <= 0x7f) // 0x00 - 0x1f and 0x7f 555 else if (c <= 0x7f) // 0x00 - 0x1f and 0x7f
575 #endif
576 { 556 {
577 charbuf[0] = '^'; 557 charbuf[0] = '^';
578 #ifdef EBCDIC
579 if (c == DEL)
580 charbuf[1] = '?'; // DEL displayed as ^?
581 else
582 charbuf[1] = CtrlChar(c);
583 #else
584 charbuf[1] = c ^ 0x40; // DEL displayed as ^? 558 charbuf[1] = c ^ 0x40; // DEL displayed as ^?
585 #endif
586
587 charbuf[2] = NUL; 559 charbuf[2] = NUL;
588 } 560 }
589 else if (enc_utf8 && c >= 0x80) 561 else if (enc_utf8 && c >= 0x80)
590 { 562 {
591 transchar_hex(charbuf, c); 563 transchar_hex(charbuf, c);
592 } 564 }
593 #ifndef EBCDIC
594 else if (c >= ' ' + 0x80 && c <= '~' + 0x80) // 0xa0 - 0xfe 565 else if (c >= ' ' + 0x80 && c <= '~' + 0x80) // 0xa0 - 0xfe
595 { 566 {
596 charbuf[0] = '|'; 567 charbuf[0] = '|';
597 charbuf[1] = c - 0x80; 568 charbuf[1] = c - 0x80;
598 charbuf[2] = NUL; 569 charbuf[2] = NUL;
599 } 570 }
600 #else 571 else // 0x80 - 0x9f and 0xff
601 else if (c < 64)
602 { 572 {
603 charbuf[0] = '~'; 573 charbuf[0] = '~';
604 charbuf[1] = MetaChar(c);
605 charbuf[2] = NUL;
606 }
607 #endif
608 else // 0x80 - 0x9f and 0xff
609 {
610 /*
611 * TODO: EBCDIC I don't know what to do with this chars, so I display
612 * them as '~?' for now
613 */
614 charbuf[0] = '~';
615 #ifdef EBCDIC
616 charbuf[1] = '?'; // 0xff displayed as ~?
617 #else
618 charbuf[1] = (c - 0x80) ^ 0x40; // 0xff displayed as ~? 574 charbuf[1] = (c - 0x80) ^ 0x40; // 0xff displayed as ~?
619 #endif
620 charbuf[2] = NUL; 575 charbuf[2] = NUL;
621 } 576 }
622 } 577 }
623 578
624 void 579 void
2132 if (res == NULL) 2087 if (res == NULL)
2133 return p; 2088 return p;
2134 backslash_halve(res); 2089 backslash_halve(res);
2135 return res; 2090 return res;
2136 } 2091 }
2137
2138 #if (defined(EBCDIC) && defined(FEAT_POSTSCRIPT)) || defined(PROTO)
2139 /*
2140 * Table for EBCDIC to ASCII conversion unashamedly taken from xxd.c!
2141 * The first 64 entries have been added to map control characters defined in
2142 * ascii.h
2143 */
2144 static char_u ebcdic2ascii_tab[256] =
2145 {
2146 0000, 0001, 0002, 0003, 0004, 0011, 0006, 0177,
2147 0010, 0011, 0012, 0013, 0014, 0015, 0016, 0017,
2148 0020, 0021, 0022, 0023, 0024, 0012, 0010, 0027,
2149 0030, 0031, 0032, 0033, 0033, 0035, 0036, 0037,
2150 0040, 0041, 0042, 0043, 0044, 0045, 0046, 0047,
2151 0050, 0051, 0052, 0053, 0054, 0055, 0056, 0057,
2152 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067,
2153 0070, 0071, 0072, 0073, 0074, 0075, 0076, 0077,
2154 0040, 0240, 0241, 0242, 0243, 0244, 0245, 0246,
2155 0247, 0250, 0325, 0056, 0074, 0050, 0053, 0174,
2156 0046, 0251, 0252, 0253, 0254, 0255, 0256, 0257,
2157 0260, 0261, 0041, 0044, 0052, 0051, 0073, 0176,
2158 0055, 0057, 0262, 0263, 0264, 0265, 0266, 0267,
2159 0270, 0271, 0313, 0054, 0045, 0137, 0076, 0077,
2160 0272, 0273, 0274, 0275, 0276, 0277, 0300, 0301,
2161 0302, 0140, 0072, 0043, 0100, 0047, 0075, 0042,
2162 0303, 0141, 0142, 0143, 0144, 0145, 0146, 0147,
2163 0150, 0151, 0304, 0305, 0306, 0307, 0310, 0311,
2164 0312, 0152, 0153, 0154, 0155, 0156, 0157, 0160,
2165 0161, 0162, 0136, 0314, 0315, 0316, 0317, 0320,
2166 0321, 0345, 0163, 0164, 0165, 0166, 0167, 0170,
2167 0171, 0172, 0322, 0323, 0324, 0133, 0326, 0327,
2168 0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337,
2169 0340, 0341, 0342, 0343, 0344, 0135, 0346, 0347,
2170 0173, 0101, 0102, 0103, 0104, 0105, 0106, 0107,
2171 0110, 0111, 0350, 0351, 0352, 0353, 0354, 0355,
2172 0175, 0112, 0113, 0114, 0115, 0116, 0117, 0120,
2173 0121, 0122, 0356, 0357, 0360, 0361, 0362, 0363,
2174 0134, 0237, 0123, 0124, 0125, 0126, 0127, 0130,
2175 0131, 0132, 0364, 0365, 0366, 0367, 0370, 0371,
2176 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067,
2177 0070, 0071, 0372, 0373, 0374, 0375, 0376, 0377
2178 };
2179
2180 /*
2181 * Convert a buffer worth of characters from EBCDIC to ASCII. Only useful if
2182 * wanting 7-bit ASCII characters out the other end.
2183 */
2184 void
2185 ebcdic2ascii(char_u *buffer, int len)
2186 {
2187 int i;
2188
2189 for (i = 0; i < len; i++)
2190 buffer[i] = ebcdic2ascii_tab[buffer[i]];
2191 }
2192 #endif