diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2018-04-23 15:06:40 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2018-04-23 15:06:40 (GMT) |
commit | 27c2e432b50ae7275f17639ac47dc59f5c9522f5 (patch) | |
tree | 8ae19414640cf0836e3916669b371069e97632a3 | |
parent | 523d6ea42c58bae3ffe912865264036fd8d1b311 (diff) | |
parent | 9acb063268f48f19e3c67a877f2c83e15fd1019d (diff) | |
download | tcl-27c2e432b50ae7275f17639ac47dc59f5c9522f5.zip tcl-27c2e432b50ae7275f17639ac47dc59f5c9522f5.tar.gz tcl-27c2e432b50ae7275f17639ac47dc59f5c9522f5.tar.bz2 |
Some better surrogate handling in encodings. Not spotted before ...
-rw-r--r-- | generic/tclEncoding.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c index 3d892b7..f6744e9 100644 --- a/generic/tclEncoding.c +++ b/generic/tclEncoding.c @@ -2359,8 +2359,15 @@ UtfToUtfProc( src += 1; dst += Tcl_UniCharToUtf(*chPtr, dst); } else { - src += TclUtfToUniChar(src, chPtr); + int len = TclUtfToUniChar(src, chPtr); + src += len; dst += Tcl_UniCharToUtf(*chPtr, dst); +#if TCL_UTF_MAX <= 4 + if (!len) { + src += TclUtfToUniChar(src, chPtr); + dst += Tcl_UniCharToUtf(*chPtr, dst); + } +#endif } } @@ -2766,7 +2773,7 @@ TableFromUtfProc( } len = TclUtfToUniChar(src, &ch); -#if TCL_UTF_MAX > 3 +#if TCL_UTF_MAX > 4 /* * This prevents a crash condition. More evaluation is required for * full support of int Tcl_UniChar. [Bug 1004065] @@ -2775,6 +2782,10 @@ TableFromUtfProc( if (ch & 0xffff0000) { word = 0; } else +#else + if (!len) { + word = 0; + } else #endif word = fromUnicode[(ch >> 8)][ch & 0xff]; @@ -2972,12 +2983,18 @@ Iso88591FromUtfProc( * Check for illegal characters. */ - if (ch > 0xff) { + if (ch > 0xff +#if TCL_UTF_MAX <= 4 + || !len +#endif + ) { if (flags & TCL_ENCODING_STOPONERROR) { result = TCL_CONVERT_UNKNOWN; break; } - +#if TCL_UTF_MAX <= 4 + if (!len) len = 4; +#endif /* * Plunge on, using '?' as a fallback character. */ |