diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2019-12-09 09:59:02 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2019-12-09 09:59:02 (GMT) |
| commit | fea9c41d92f884d7d684647ac911c4ce45e9209f (patch) | |
| tree | c1e30efb2c5cd34d336689cfbfeb7914d5db11f8 /generic/tclEncoding.c | |
| parent | d67affb10098d8289d0fd12a5ea738068740ef39 (diff) | |
| download | tcl-fea9c41d92f884d7d684647ac911c4ce45e9209f.zip tcl-fea9c41d92f884d7d684647ac911c4ce45e9209f.tar.gz tcl-fea9c41d92f884d7d684647ac911c4ce45e9209f.tar.bz2 | |
Add special handling of lower surrogate to UtfToUtfProc(), so valgrind should't complain in that situation. With new test-cases covering that.
Diffstat (limited to 'generic/tclEncoding.c')
| -rw-r--r-- | generic/tclEncoding.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c index 69075bd..ffa23f3 100644 --- a/generic/tclEncoding.c +++ b/generic/tclEncoding.c @@ -2361,16 +2361,16 @@ UtfToUtfProc( dst += Tcl_UniCharToUtf(*chPtr, dst); } else { src += TclUtfToUniChar(src, chPtr); - if ((*chPtr | 0x3FF) == 0xDBFF) { - /* A high surrogate character is detected, handle especially */ + if ((*chPtr | 0x7FF) == 0xDFFF) { + /* A surrogate character is detected, handle especially */ Tcl_UniChar low = *chPtr; size_t len = (src <= srcEnd-3) ? Tcl_UtfToUniChar(src, &low) : 0; - if ((low | 0x3FF) != 0xDFFF) { + if (((low | 0x3FF) != 0xDFFF) || !(*chPtr & 0x800)) { *dst++ = (char) (((*chPtr >> 12) | 0xE0) & 0xEF); *dst++ = (char) (((*chPtr >> 6) | 0x80) & 0xBF); *dst++ = (char) ((*chPtr | 0x80) & 0xBF); continue; - } else if (pureNullMode == 1) { + } else if ((TCL_UTF_MAX > 3) || (pureNullMode == 1)) { int full = (((*chPtr & 0x3FF) << 10) | (low & 0x3FF)) + 0x10000; *dst++ = (char) (((full >> 18) | 0xF0) & 0xF7); *dst++ = (char) (((full >> 12) | 0x80) & 0xBF); |
