summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Williamson <khw@cpan.org>2014-05-12 18:29:41 -0600
committerKarl Williamson <khw@cpan.org>2014-05-31 11:57:00 -0600
commit0ed2b00b2bd6a650391433ad8733983692df43d5 (patch)
tree58fcb6e37392ef5f52aaccb965f7c087749f0e68
parentdd9bc2b0af8e838ed989897601a0ee36eeed092f (diff)
downloadperl-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.h12
-rw-r--r--utf8.h4
-rw-r--r--utfebcdic.h4
3 files changed, 15 insertions, 5 deletions
diff --git a/handy.h b/handy.h
index 13f8d22311..740ebe526d 100644
--- a/handy.h
+++ b/handy.h
@@ -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. */
diff --git a/utf8.h b/utf8.h
index 52671ebb9d..8945663e1a 100644
--- a/utf8.h
+++ b/utf8.h
@@ -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
/*