diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2021-05-07 09:50:13 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2021-05-07 09:50:13 (GMT) |
commit | 99994365ea8c04611e93f3108f4a7d8d4e1ca49f (patch) | |
tree | 7f7ad3efe94f5da1aadf381ae75dad83584bc2cd | |
parent | de61616a605c41f8963bfa44e43dc075e6a5a4c4 (diff) | |
download | tcl-99994365ea8c04611e93f3108f4a7d8d4e1ca49f.zip tcl-99994365ea8c04611e93f3108f4a7d8d4e1ca49f.tar.gz tcl-99994365ea8c04611e93f3108f4a7d8d4e1ca49f.tar.bz2 |
Parse simplifications and better errormessage. Not 100% correct yet
-rw-r--r-- | generic/tclCmdAH.c | 36 | ||||
-rw-r--r-- | tests/encoding.test | 6 |
2 files changed, 16 insertions, 26 deletions
diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index 1361f11..9cd8c12 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.c @@ -550,24 +550,24 @@ EncodingConvertfromObjCmd( Tcl_Encoding encoding; /* Encoding to use */ int length; /* Length of the byte array being converted */ const char *bytesPtr; /* Pointer to the first byte of the array */ +#if TCL_MAJOR_VERSION > 8 || defined(TCL_NO_DEPRECATED) + const char *stopOnError = ""; +#else const char *stopOnError = NULL; +#endif size_t result; if (objc == 2) { encoding = Tcl_GetEncoding(interp, NULL); data = objv[1]; - } else if ((unsigned)(objc - 3) < 2) { + } else if ((unsigned)(objc - 2) < 3) { if (Tcl_GetEncodingFromObj(interp, objv[objc - 2], &encoding) != TCL_OK) { return TCL_ERROR; } data = objv[objc - 1]; if (objc > 3) { stopOnError = Tcl_GetString(objv[1]); - if (!stopOnError[0]) { -#if TCL_MAJOR_VERSION < 9 && !defined(TCL_NO_DEPRECATED) - stopOnError = NULL; -#endif - } else if (stopOnError[0] == '-' && stopOnError[1] == 'n' + if (stopOnError[0] == '-' && stopOnError[1] == 'n' && !strncmp(stopOnError, "-nothrow", strlen(stopOnError))) { stopOnError = NULL; } else if (stopOnError[0] == '-' && stopOnError[1] == 's' @@ -575,10 +575,6 @@ EncodingConvertfromObjCmd( } else { goto encConvFromError; } -#if TCL_MAJOR_VERSION > 8 || defined(TCL_NO_DEPRECATED) - } else { - stopOnError = ""; -#endif } } else { encConvFromError: @@ -602,7 +598,7 @@ EncodingConvertfromObjCmd( if (stopOnError && (result != (size_t)-1)) { char buf[TCL_INTEGER_SPACE]; sprintf(buf, "%" TCL_Z_MODIFIER "u", result); - Tcl_SetObjResult(interp, Tcl_ObjPrintf("unexpected byte at index %" + Tcl_SetObjResult(interp, Tcl_ObjPrintf("unexpected byte sequence starting at index %" TCL_Z_MODIFIER "u: '\\x%X'", result, UCHAR(bytesPtr[result]))); Tcl_SetErrorCode(interp, "TCL", "ENCODING", "STOPONERROR", buf, NULL); @@ -653,25 +649,23 @@ EncodingConverttoObjCmd( int length; /* Length of the string being converted */ const char *stringPtr; /* Pointer to the first byte of the string */ size_t result; +#if TCL_MAJOR_VERSION > 8 || defined(TCL_NO_DEPRECATED) + const char *stopOnError = ""; +#else const char *stopOnError = NULL; - - /* TODO - ADJUST OBJ INDICES WHEN ENSEMBLIFYING THIS */ +#endif if (objc == 2) { encoding = Tcl_GetEncoding(interp, NULL); data = objv[1]; - } else if ((unsigned)(objc - 3) < 2) { + } else if ((unsigned)(objc - 2) < 3) { if (Tcl_GetEncodingFromObj(interp, objv[objc - 2], &encoding) != TCL_OK) { return TCL_ERROR; } data = objv[objc - 1]; if (objc > 3) { stopOnError = Tcl_GetString(objv[1]); - if (!stopOnError[0]) { -#if TCL_MAJOR_VERSION < 9 && !defined(TCL_NO_DEPRECATED) - stopOnError = NULL; -#endif - } else if (stopOnError[0] == '-' && stopOnError[1] == 'n' + if (stopOnError[0] == '-' && stopOnError[1] == 'n' && !strncmp(stopOnError, "-nothrow", strlen(stopOnError))) { stopOnError = NULL; } else if (stopOnError[0] == '-' && stopOnError[1] == 's' @@ -679,10 +673,6 @@ EncodingConverttoObjCmd( } else { goto encConvToError; } -#if TCL_MAJOR_VERSION > 8 || defined(TCL_NO_DEPRECATED) - } else { - stopOnError = ""; -#endif } } else { encConvToError: diff --git a/tests/encoding.test b/tests/encoding.test index 355c2ec..d30ef60 100644 --- a/tests/encoding.test +++ b/tests/encoding.test @@ -605,16 +605,16 @@ test encoding-24.12 {Parse valid or invalid utf-8} { } 1 test encoding-24.13 {Parse valid or invalid utf-8} -body { encoding convertfrom -stoponerror utf-8 "\xC0\x81" -} -returnCodes 1 -result {unexpected byte at index 0: '\xC0'} +} -returnCodes 1 -result {unexpected byte sequence starting at index 0: '\xC0'} test encoding-24.14 {Parse valid or invalid utf-8} -body { encoding convertfrom -stoponerror utf-8 "\xC1\xBF" -} -returnCodes 1 -result {unexpected byte at index 0: '\xC1'} +} -returnCodes 1 -result {unexpected byte sequence starting at index 0: '\xC1'} test encoding-24.15 {Parse valid or invalid utf-8} { string length [encoding convertfrom -stoponerror utf-8 "\xC2\x80"] } 1 test encoding-24.16 {Parse valid or invalid utf-8} -body { encoding convertfrom -stoponerror utf-8 "Z\xE0\x80" -} -returnCodes 1 -result {unexpected byte at index 1: '\xE0'} +} -returnCodes 1 -result {unexpected byte sequence starting at index 1: '\xE0'} test encoding-24.17 {Parse valid or invalid utf-8} -constraints testbytestring -body { encoding convertto -stoponerror utf-8 [testbytestring "Z\u4343\x80"] } -returnCodes 1 -result {expected byte sequence but character 1 was '䍃' (U+004343)} |