summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2021-03-30 13:35:15 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2021-03-30 13:35:15 (GMT)
commit78a0992b4431f976641f3d08f63c13fab742e1b9 (patch)
treedfc0285585e08653ecb2e634f267fba7443a48cf /generic
parent41533dc84a21444a1885476d2b4ac780b6581a44 (diff)
downloadtcl-78a0992b4431f976641f3d08f63c13fab742e1b9.zip
tcl-78a0992b4431f976641f3d08f63c13fab742e1b9.tar.gz
tcl-78a0992b4431f976641f3d08f63c13fab742e1b9.tar.bz2
Better error-messages
Diffstat (limited to 'generic')
-rw-r--r--generic/tclCmdAH.c23
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,