summaryrefslogtreecommitdiffstats
path: root/generic/tclEncoding.c
diff options
context:
space:
mode:
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 1d3a3eb..d2b0efc 100644
--- a/generic/tclEncoding.c
+++ b/generic/tclEncoding.c
@@ -573,13 +573,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;
@@ -601,13 +601,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
@@ -2984,10 +2984,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);
@@ -3017,17 +3014,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