summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tclCmdAH.c30
-rw-r--r--generic/tclEncoding.c22
-rw-r--r--generic/tclInt.h1
-rw-r--r--tests/cmdAH.test7
-rw-r--r--tests/socket.test2
5 files changed, 48 insertions, 14 deletions
diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c
index 5fbe27e..692c75b 100644
--- a/generic/tclCmdAH.c
+++ b/generic/tclCmdAH.c
@@ -51,6 +51,7 @@ static Tcl_ObjCmdProc EncodingConvertfromObjCmd;
static Tcl_ObjCmdProc EncodingConverttoObjCmd;
static Tcl_ObjCmdProc EncodingDirsObjCmd;
static Tcl_ObjCmdProc EncodingNamesObjCmd;
+static Tcl_ObjCmdProc EncodingProfilesObjCmd;
static Tcl_ObjCmdProc EncodingSystemObjCmd;
static inline int ForeachAssignments(Tcl_Interp *interp,
struct ForeachState *statePtr);
@@ -519,6 +520,7 @@ TclInitEncodingCmd(
{"convertto", EncodingConverttoObjCmd, TclCompileBasic1To3ArgCmd, NULL, NULL, 0},
{"dirs", EncodingDirsObjCmd, TclCompileBasic0Or1ArgCmd, NULL, NULL, 1},
{"names", EncodingNamesObjCmd, TclCompileBasic0ArgCmd, NULL, NULL, 0},
+ {"profiles", EncodingProfilesObjCmd, TclCompileBasic0ArgCmd, NULL, NULL, 0},
{"system", EncodingSystemObjCmd, TclCompileBasic0Or1ArgCmd, NULL, NULL, 1},
{NULL, NULL, NULL, NULL, NULL, 0}
};
@@ -891,6 +893,34 @@ EncodingNamesObjCmd(
/*
*-----------------------------------------------------------------------------
*
+ * EncodingProfilesObjCmd --
+ *
+ * This command returns a list of the available encoding profiles
+ *
+ * Results:
+ * Returns a standard Tcl result
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+int
+EncodingProfilesObjCmd(
+ TCL_UNUSED(void *),
+ Tcl_Interp* interp, /* Tcl interpreter */
+ int objc, /* Number of command line args */
+ Tcl_Obj* const objv[]) /* Vector of command line args */
+{
+ if (objc > 1) {
+ Tcl_WrongNumArgs(interp, 1, objv, NULL);
+ return TCL_ERROR;
+ }
+ TclGetEncodingProfiles(interp);
+ return TCL_OK;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *
* EncodingSystemObjCmd --
*
* This command retrieves or changes the system encoding
diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c
index e8e1756..fc3ac77 100644
--- a/generic/tclEncoding.c
+++ b/generic/tclEncoding.c
@@ -208,7 +208,7 @@ static struct TclEncodingProfiles {
|| (TCL_ENCODING_PROFILE_GET(flags_) == 0 \
&& TCL_ENCODING_PROFILE_DEFAULT == TCL_ENCODING_PROFILE_REPLACE))
-#define UNICODE_REPLACE_CHAR 0xFFFD
+#define UNICODE_REPLACE_CHAR ((Tcl_UniChar)0xFFFD)
#define SURROGATE(c_) (((c_) & ~0x7FF) == 0xD800)
#define HIGH_SURROGATE(c_) (((c_) & ~0x3FF) == 0xD800)
#define LOW_SURROGATE(c_) (((c_) & ~0x3FF) == 0xDC00)
@@ -547,6 +547,7 @@ FillEncodingFileMap(void)
* TCL_ENCODING_LE is only used for utf-16/utf-32/ucs-2. re-use the same value */
#define TCL_ENCODING_LE TCL_ENCODING_MODIFIED /* Little-endian encoding */
#define TCL_ENCODING_UTF 0x200 /* For UTF-8 encoding, allow 4-byte output sequences */
+#define TCL_ENCODING_CESU8 0x400 /* TODO - Distinguishes cesu-8 from utf-8*/
void
TclInitEncodingSubsystem(void)
@@ -592,7 +593,7 @@ TclInitEncodingSubsystem(void)
type.nullSize = 1;
type.clientData = INT2PTR(TCL_ENCODING_UTF);
Tcl_CreateEncoding(&type);
- type.clientData = INT2PTR(0);
+ type.clientData = INT2PTR(TCL_ENCODING_CESU8);
type.encodingName = "cesu-8";
Tcl_CreateEncoding(&type);
@@ -2505,13 +2506,6 @@ UtfToUtfProc(
* TODO - below check could be simplified to remove the MODIFIED
* expression I think given the checks already made above. May be.
*/
-#if 0
- if ((len < 2) && (ch != 0) && (flags & TCL_ENCODING_MODIFIED)
- && (profile == TCL_ENCODING_PROFILE_STRICT)) {
- result = TCL_CONVERT_SYNTAX;
- break;
- }
-#else
if ((len < 2) && (ch != 0) && (flags & TCL_ENCODING_MODIFIED)) {
if (PROFILE_STRICT(profile)) {
result = TCL_CONVERT_SYNTAX;
@@ -2520,7 +2514,7 @@ UtfToUtfProc(
ch = UNICODE_REPLACE_CHAR;
}
}
-#endif
+
src += len;
if (!(flags & TCL_ENCODING_UTF) && (ch > 0x3FF)) {
if (ch > 0xFFFF) {
@@ -2551,7 +2545,7 @@ UtfToUtfProc(
cesu8:
*dst++ = (char) (((ch >> 12) | 0xE0) & 0xEF);
*dst++ = (char) (((ch >> 6) | 0x80) & 0xBF);
- *dst++ = (char) ((ch | 0x80) & 0xBF);
+ *dst++ = (char) ((ch | 0x80) & 0xBF);
continue;
}
src += len;
@@ -3205,7 +3199,11 @@ TableToUtfProc(
if (prefixBytes[byte]) {
src--;
}
- ch = (Tcl_UniChar)byte;
+ if (PROFILE_REPLACE(flags)) {
+ ch = UNICODE_REPLACE_CHAR;
+ } else {
+ ch = (Tcl_UniChar)byte;
+ }
}
/*
diff --git a/generic/tclInt.h b/generic/tclInt.h
index 4b6303d..538b177 100644
--- a/generic/tclInt.h
+++ b/generic/tclInt.h
@@ -2891,6 +2891,7 @@ TclEncodingProfileNameToId(Tcl_Interp *interp,
MODULE_SCOPE const char *TclEncodingProfileIdToName(Tcl_Interp *interp,
int profileId);
MODULE_SCOPE int TclEncodingExternalFlagsToInternal(int flags);
+MODULE_SCOPE void TclGetEncodingProfiles(Tcl_Interp *interp);
/*
* TIP #233 (Virtualized Time)
diff --git a/tests/cmdAH.test b/tests/cmdAH.test
index c666513..65ecac5 100644
--- a/tests/cmdAH.test
+++ b/tests/cmdAH.test
@@ -208,21 +208,26 @@ set encInvalidBytes {
utf-8 \x41\xC0\x42 default A\u00C0B -1 C0
utf-8 \x41\xC0\x42 tcl8 A\u00C0B -1 C0
+ utf-8 \x41\xC0\x42 replace A\uFFFDB -1 C0
utf-8 \x41\xC0\x42 strict A 1 C0
utf-8 \x41\x80\x42 default A\u0080B -1 80
utf-8 \x41\x80\x42 tcl8 A\u0080B -1 80
+ utf-8 \x41\x80\x42 replace A\uFFFDB -1 80
utf-8 \x41\x80\x42 strict A 1 80
utf-8 \x41\xC0\x80\x42 default A\u0000B -1 C080
utf-8 \x41\xC0\x80\x42 tcl8 A\u0000B -1 C080
utf-8 \x41\xC0\x80\x42 strict A 1 C080
utf-8 \x41\xC1\x42 default A\u00C1B -1 C1
utf-8 \x41\xC1\x42 tcl8 A\u00C1B -1 C1
+ utf-8 \x41\xC1\x42 replace A\uFFFDB -1 C1
utf-8 \x41\xC1\x42 strict A 1 C1
utf-8 \x41\xC2\x42 default A\u00C2B -1 C2-nontrail
utf-8 \x41\xC2\x42 tcl8 A\u00C2B -1 C2-nontrail
+ utf-8 \x41\xC2\x42 replace A\uFFFDB -1 C2-nontrail
utf-8 \x41\xC2\x42 strict A 1 C2-nontrail
utf-8 \x41\xC2 default A\u00C2 -1 C2-incomplete
utf-8 \x41\xC2 tcl8 A\u00C2 -1 C2-incomplete
+ utf-8 \x41\xC2 replace A\uFFFD -1 C2-incomplete
utf-8 \x41\xC2 strict A 1 C2-incomplete
utf-8 A\xed\xa0\x80B default A\uD800B -1 High-surrogate
utf-8 A\xed\xa0\x80B tcl8 A\uD800B -1 High-surrogate
@@ -335,7 +340,7 @@ test cmdAH-4.1.1 {encoding} -returnCodes error -body {
} -result {wrong # args: should be "encoding subcommand ?arg ...?"}
test cmdAH-4.1.2 {Tcl_EncodingObjCmd} -returnCodes error -body {
encoding foo
-} -result {unknown or ambiguous subcommand "foo": must be convertfrom, convertto, dirs, names, or system}
+} -result {unknown or ambiguous subcommand "foo": must be convertfrom, convertto, dirs, names, profiles, or system}
#
# encoding system 4.2.*
diff --git a/tests/socket.test b/tests/socket.test
index a0fe2f7..b1435be 100644
--- a/tests/socket.test
+++ b/tests/socket.test
@@ -1071,7 +1071,7 @@ test socket_$af-7.3 {testing socket specific options} -constraints [list socket
close $s
update
llength $l
-} -result 22
+} -result 20
test socket_$af-7.4 {testing socket specific options} -constraints [list socket supported_$af] -setup {
set timer [after 10000 "set x timed_out"]
set l ""