diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2021-03-30 13:35:15 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2021-03-30 13:35:15 (GMT) |
commit | 78a0992b4431f976641f3d08f63c13fab742e1b9 (patch) | |
tree | dfc0285585e08653ecb2e634f267fba7443a48cf /generic | |
parent | 41533dc84a21444a1885476d2b4ac780b6581a44 (diff) | |
download | tcl-78a0992b4431f976641f3d08f63c13fab742e1b9.zip tcl-78a0992b4431f976641f3d08f63c13fab742e1b9.tar.gz tcl-78a0992b4431f976641f3d08f63c13fab742e1b9.tar.bz2 |
Better error-messages
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclCmdAH.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index df80d3c..0c0a4a4 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.c @@ -579,12 +579,19 @@ EncodingConvertfromObjCmd( /* * Convert the string into a byte array in 'ds' */ - bytesPtr = (char *) Tcl_GetByteArrayFromObj(data, &length); + if (stopOnError) { + bytesPtr = (char *) TclGetBytesFromObj(interp, data, &length); + if (bytesPtr == NULL) { + return TCL_ERROR; + } + } else { + bytesPtr = (char *) Tcl_GetByteArrayFromObj(data, &length); + } result = Tcl_ExternalToUtfDStringEx(encoding, bytesPtr, length, stopOnError ? TCL_ENCODING_STOPONERROR : 0, &ds); if (stopOnError && (result != (size_t)-1)) { - Tcl_SetObjResult(interp, Tcl_ObjPrintf("decoding error after reading %" - TCL_LL_MODIFIER "u byte%s", (long long)result, (result != 1)?"s":"")); + Tcl_SetObjResult(interp, Tcl_ObjPrintf("unexpected byte at index %" + TCL_LL_MODIFIER "u: '%c' (\\x%X)", (long long)result, UCHAR(bytesPtr[result]), UCHAR(bytesPtr[result]))); Tcl_DStringFree(&ds); return TCL_ERROR; } @@ -667,10 +674,12 @@ EncodingConverttoObjCmd( result = Tcl_UtfToExternalDStringEx(encoding, stringPtr, length, stopOnError ? TCL_ENCODING_STOPONERROR : 0, &ds); if (stopOnError && (result != (size_t)-1)) { - result = Tcl_NumUtfChars(stringPtr, result); - Tcl_SetObjResult(interp, Tcl_ObjPrintf("encoding error after reading %" - TCL_LL_MODIFIER "u character%s", (long long)result, (result != 1)?"s":"")); - Tcl_DStringFree(&ds); + size_t pos = Tcl_NumUtfChars(stringPtr, result); + int ucs4; + TclUtfToUCS4(&stringPtr[result], &ucs4); + Tcl_SetObjResult(interp, Tcl_ObjPrintf("unexpected character at index %" + TCL_LL_MODIFIER "u: '%1s' (U+%06X)", (long long)pos, &stringPtr[result], ucs4)); + Tcl_DStringFree(&ds); return TCL_ERROR; } Tcl_SetObjResult(interp, |