diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2020-05-25 09:02:15 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2020-05-25 09:02:15 (GMT) |
| commit | d3eb8cf5e3d7b1535ba73e95dee737c08a36d3bb (patch) | |
| tree | 213e7ff9c39f086709993aa1c98cd5e4b88302e6 /generic | |
| parent | e54cad6de1c547761044db23d6b9358b00db2230 (diff) | |
| download | tcl-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.c | 6 | ||||
| -rw-r--r-- | generic/tclInt.h | 4 | ||||
| -rw-r--r-- | generic/tclUtf.c | 16 |
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 /* *--------------------------------------------------------------------------- |
