summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2020-05-25 09:02:15 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2020-05-25 09:02:15 (GMT)
commitd3eb8cf5e3d7b1535ba73e95dee737c08a36d3bb (patch)
tree213e7ff9c39f086709993aa1c98cd5e4b88302e6 /generic
parente54cad6de1c547761044db23d6b9358b00db2230 (diff)
downloadtcl-d3eb8cf5e3d7b1535ba73e95dee737c08a36d3bb.zip
tcl-d3eb8cf5e3d7b1535ba73e95dee737c08a36d3bb.tar.gz
tcl-d3eb8cf5e3d7b1535ba73e95dee737c08a36d3bb.tar.bz2
Fix compiled "string is <class>" for TCL_UTF_MAX=4 build, for characters > U+FFFF.
Diffstat (limited to 'generic')
-rw-r--r--generic/tclExecute.c6
-rw-r--r--generic/tclInt.h4
-rw-r--r--generic/tclUtf.c16
3 files changed, 23 insertions, 3 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index eeb69de..76feb79 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -5915,9 +5915,11 @@ TEBCresume(
ustring1 = Tcl_GetUnicodeFromObj(valuePtr, &length);
match = 1;
if (length > 0) {
+ int ch;
end = ustring1 + length;
- for (p=ustring1 ; p<end ; p++) {
- if (!tclStringClassTable[opnd].comparator(*p)) {
+ for (p=ustring1 ; p<end ; ) {
+ p += TclUniCharToUCS4(p, &ch);
+ if (!tclStringClassTable[opnd].comparator(ch)) {
match = 0;
break;
}
diff --git a/generic/tclInt.h b/generic/tclInt.h
index b59d312..dfb3dfe 100644
--- a/generic/tclInt.h
+++ b/generic/tclInt.h
@@ -3188,8 +3188,10 @@ MODULE_SCOPE int TclUCS4ToUtf(int, char *);
MODULE_SCOPE int TclUCS4ToLower(int ch);
#if TCL_UTF_MAX == 4
MODULE_SCOPE int TclGetUCS4(Tcl_Obj *, int);
+ MODULE_SCOPE int TclUniCharToUCS4(const Tcl_UniChar *, int *);
#else
- #define TclGetUCS4 Tcl_GetUniChar
+# define TclGetUCS4 Tcl_GetUniChar
+# define TclUniCharToUCS4(src, ptr) (*ptr = *(src),1)
#endif
/*
diff --git a/generic/tclUtf.c b/generic/tclUtf.c
index ed9138b..5ae977a 100644
--- a/generic/tclUtf.c
+++ b/generic/tclUtf.c
@@ -2400,6 +2400,22 @@ TclUtfToUCS4(
*ucs4Ptr = (int)ch;
return len;
}
+
+#if TCL_UTF_MAX == 4
+int
+TclUniCharToUCS4(
+ const Tcl_UniChar *src, /* The Tcl_UniChar string. */
+ int *ucs4Ptr) /* Filled with the UCS4 codepoint represented
+ * by the Tcl_UniChar string. */
+{
+ if (((src[0] & 0xFC00) == 0xD800) && ((src[1] & 0xFC00) == 0xDC00)) {
+ *ucs4Ptr = (((src[0] & 0x3FF) << 10) | (src[01] & 0x3FF)) + 0x10000;
+ return 2;
+ }
+ *ucs4Ptr = src[0];
+ return 1;
+}
+#endif
/*
*---------------------------------------------------------------------------