Mercurial > vim
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 |