summaryrefslogtreecommitdiffstats
path: root/generic/tclEncoding.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2023-02-22 07:48:10 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2023-02-22 07:48:10 (GMT)
commite10652549884dc52a643e650c96ae56f7e6b19ee (patch)
tree4067eff4dc83e48fe990438012bade2f0ebbf8a9 /generic/tclEncoding.c
parent0892c6f37c9e2638565bf7f8641fa137e46648c3 (diff)
parentf0284298add52f9e6804e1d3e53c4e67fcfbc1c3 (diff)
downloadtcl-e10652549884dc52a643e650c96ae56f7e6b19ee.zip
tcl-e10652549884dc52a643e650c96ae56f7e6b19ee.tar.gz
tcl-e10652549884dc52a643e650c96ae56f7e6b19ee.tar.bz2
Merge 8.7
Diffstat (limited to 'generic/tclEncoding.c')
-rw-r--r--generic/tclEncoding.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c
index 0133e3d..e79cefd 100644
--- a/generic/tclEncoding.c
+++ b/generic/tclEncoding.c
@@ -579,13 +579,13 @@ TclInitEncodingSubsystem(void)
type.freeProc = NULL;
type.nullSize = 2;
type.encodingName = "ucs-2le";
- type.clientData = INT2PTR(TCL_ENCODING_LE|TCL_ENCODING_NOCOMPLAIN);
+ type.clientData = INT2PTR(TCL_ENCODING_LE);
Tcl_CreateEncoding(&type);
type.encodingName = "ucs-2be";
- type.clientData = INT2PTR(TCL_ENCODING_NOCOMPLAIN);
+ type.clientData = INT2PTR(0);
Tcl_CreateEncoding(&type);
type.encodingName = "ucs-2";
- type.clientData = INT2PTR(isLe.c|TCL_ENCODING_NOCOMPLAIN);
+ type.clientData = INT2PTR(isLe.c);
Tcl_CreateEncoding(&type);
type.toUtfProc = Utf32ToUtfProc;
@@ -607,13 +607,13 @@ TclInitEncodingSubsystem(void)
type.freeProc = NULL;
type.nullSize = 2;
type.encodingName = "utf-16le";
- type.clientData = INT2PTR(TCL_ENCODING_LE);
+ type.clientData = INT2PTR(TCL_ENCODING_LE|ENCODING_UTF);
Tcl_CreateEncoding(&type);
type.encodingName = "utf-16be";
- type.clientData = INT2PTR(0);
+ type.clientData = INT2PTR(ENCODING_UTF);
Tcl_CreateEncoding(&type);
type.encodingName = "utf-16";
- type.clientData = INT2PTR(isLe.c);
+ type.clientData = INT2PTR(isLe.c|ENCODING_UTF);
Tcl_CreateEncoding(&type);
#ifndef TCL_NO_DEPRECATED
@@ -2907,10 +2907,7 @@ UtfToUcs2Proc(
* output buffer. */
{
const char *srcStart, *srcEnd, *srcClose, *dstStart, *dstEnd;
- int result, numChars;
-#if TCL_UTF_MAX < 4
- int len;
-#endif
+ int result, numChars, len;
Tcl_UniChar ch = 0;
flags |= PTR2INT(clientData);
@@ -2940,17 +2937,32 @@ UtfToUcs2Proc(
break;
}
#if TCL_UTF_MAX < 4
- src += (len = TclUtfToUniChar(src, &ch));
+ len = TclUtfToUniChar(src, &ch);
if ((ch >= 0xD800) && (len < 3)) {
+ if (STOPONERROR) {
+ result = TCL_CONVERT_UNKNOWN;
+ break;
+ }
+ src += len;
src += TclUtfToUniChar(src, &ch);
ch = 0xFFFD;
}
#else
- src += TclUtfToUniChar(src, &ch);
+ len = TclUtfToUniChar(src, &ch);
if (ch > 0xFFFF) {
+ if (STOPONERROR) {
+ result = TCL_CONVERT_UNKNOWN;
+ break;
+ }
ch = 0xFFFD;
}
#endif
+ if (STOPONERROR && ((ch & ~0x7FF) == 0xD800)) {
+ result = TCL_CONVERT_SYNTAX;
+ break;
+ }
+
+ src += len;
/*
* Need to handle this in a way that won't cause misalignment by