summaryrefslogtreecommitdiff
path: root/utf8.h
diff options
context:
space:
mode:
authorKarl Williamson <khw@cpan.org>2019-12-05 12:26:21 -0700
committerKarl Williamson <khw@cpan.org>2019-12-07 15:50:38 -0700
commit59645eb176f6a56df33554f3bedd0d3a7e071455 (patch)
tree766ddea71329c719854ec50c4e9e0b6869ff5f9f /utf8.h
parent72b8e1a24ab8931021b00a2a11ef7f36afb88e38 (diff)
downloadperl-59645eb176f6a56df33554f3bedd0d3a7e071455.tar.gz
Fix UTF8_IS_START on EBCDIC
Diffstat (limited to 'utf8.h')
-rw-r--r--utf8.h14
1 files changed, 11 insertions, 3 deletions
diff --git a/utf8.h b/utf8.h
index 8c4cfd54df..fa036f0e05 100644
--- a/utf8.h
+++ b/utf8.h
@@ -380,11 +380,19 @@ encoded as UTF-8. C<cp> is a native (ASCII or EBCDIC) code point if less than
((UTF_CONTINUATION_MARK >> UTF_ACCUMULATION_SHIFT) | UTF_START_MARK(2))
/* Is the byte 'c' the first byte of a multi-byte UTF8-8 encoded sequence?
- * This doesn't catch invariants (they are single-byte). It also excludes the
+ * This excludes invariants (they are single-byte). It also excludes the
* illegal overlong sequences that begin with C0 and C1 on ASCII platforms, and
- * C0-C4 I8 start bytes on EBCDIC ones */
-#define UTF8_IS_START(c) (__ASSERT_(FITS_IN_8_BITS(c)) \
+ * C0-C4 I8 start bytes on EBCDIC ones. On EBCDIC E0 can't start a
+ * non-overlong sequence, so we define a base macro and for those platforms,
+ * extend it to also exclude E0 */
+#define UTF8_IS_START_base(c) (__ASSERT_(FITS_IN_8_BITS(c)) \
(NATIVE_UTF8_TO_I8(c) >= UTF_MIN_START_BYTE))
+#ifdef EBCDIC
+# define UTF8_IS_START(c) \
+ (UTF8_IS_START_base(c) && (c) != I8_TO_NATIVE_UTF8(0xE0))
+#else
+# define UTF8_IS_START(c) UTF8_IS_START_base(c)
+#endif
#define UTF_MIN_ABOVE_LATIN1_BYTE \
((0x100 >> UTF_ACCUMULATION_SHIFT) | UTF_START_MARK(2))