summaryrefslogtreecommitdiffstats
path: root/generic/tclEncoding.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2018-04-25 15:00:53 (GMT)
committerdgp <dgp@users.sourceforge.net>2018-04-25 15:00:53 (GMT)
commit13bcd282e3970b483fe00aa53e58ccf456d17bbc (patch)
tree4dbc707399a6e334148c8704fdf5b5450c204d3a /generic/tclEncoding.c
parent26e714137a987c67af5a932fdaf7bd1138d97a2d (diff)
parent859bcc9f868c96444e50001dac785edb3e889156 (diff)
downloadtcl-13bcd282e3970b483fe00aa53e58ccf456d17bbc.zip
tcl-13bcd282e3970b483fe00aa53e58ccf456d17bbc.tar.gz
tcl-13bcd282e3970b483fe00aa53e58ccf456d17bbc.tar.bz2
merge 8.7
Diffstat (limited to 'generic/tclEncoding.c')
-rw-r--r--generic/tclEncoding.c25
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.
*/