diff options
author | Karl Williamson <khw@cpan.org> | 2014-05-12 18:29:41 -0600 |
---|---|---|
committer | Karl Williamson <khw@cpan.org> | 2014-05-31 11:57:00 -0600 |
commit | 0ed2b00b2bd6a650391433ad8733983692df43d5 (patch) | |
tree | 58fcb6e37392ef5f52aaccb965f7c087749f0e68 | |
parent | dd9bc2b0af8e838ed989897601a0ee36eeed092f (diff) | |
download | perl-0ed2b00b2bd6a650391433ad8733983692df43d5.tar.gz |
Fix definition of toCTRL() for EBCDIC
The definition was incorrect. When going from control to printable
name, we need to go from Latin1 -> Native, so that e.g., a 65 gets
turned into the native 'A'
-rw-r--r-- | handy.h | 12 | ||||
-rw-r--r-- | utf8.h | 4 | ||||
-rw-r--r-- | utfebcdic.h | 4 |
3 files changed, 15 insertions, 5 deletions
@@ -1653,11 +1653,13 @@ EXTCONST U32 PL_charclass[]; #ifndef EBCDIC # define toCTRL(c) (toUPPER(c) ^ 64) #else -# define toCTRL(c) ((c) == '?' \ - ? LATIN1_TO_NATIVE(0x9F) \ - : (c) == LATIN1_TO_NATIVE(0x9F) \ - ? '?' \ - : (NATIVE_TO_LATIN1(toUPPER(c)) ^ 64)) +# define toCTRL(c) ((isPRINT_A(c)) \ + ? UNLIKELY((c) == '?') \ + ? QUESTION_MARK_CTRL \ + : (NATIVE_TO_LATIN1(toUPPER(c)) ^ 64) \ + : UNLIKELY((c) == QUESTION_MARK_CTRL) \ + ? ((c) == '?') \ + : (LATIN1_TO_NATIVE((c) ^ 64))) #endif /* Line numbers are unsigned, 32 bits. */ @@ -270,6 +270,10 @@ Perl's extended UTF-8 means we can have start bytes up to FF. #error UTF8_MAXBYTES must be at least 12 #endif +/* ^? is defined to be DEL on ASCII systems. See the definition of toCTRL() + * for more */ +#define QUESTION_MARK_CTRL DEL_NATIVE + #define MAX_UTF8_TWO_BYTE 0x7FF #define UTF8_MAXBYTES_CASE UTF8_MAXBYTES diff --git a/utfebcdic.h b/utfebcdic.h index 1211c9fd4a..7eec66fd0b 100644 --- a/utfebcdic.h +++ b/utfebcdic.h @@ -194,6 +194,10 @@ END_EXTERN_C * character occupies 5 bytes, therefore this number is 15 */ #define UTF8_MAXBYTES_CASE 15 +/* ^? is defined to be APC on EBCDIC systems. See the definition of toCTRL() + * for more */ +#define QUESTION_MARK_CTRL LATIN1_TO_NATIVE(0x9F) + #define MAX_UTF8_TWO_BYTE 0x3FF /* |