diff options
| -rw-r--r-- | generic/tclBinary.c | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/generic/tclBinary.c b/generic/tclBinary.c index 0e22298..665c36b 100644 --- a/generic/tclBinary.c +++ b/generic/tclBinary.c @@ -2594,8 +2594,9 @@ BinaryDecodeHex( Tcl_Obj *resultObj = NULL; unsigned char *data, *datastart, *dataend; unsigned char *begin, *cursor, c; - int i, index, value, size, cut = 0, strict = 0; - size_t count = 0; + int i, index, value, pure = 1, strict = 0; + size_t size, cut = 0, count = 0; + Tcl_UniChar ch = 0; enum {OPT_STRICT }; static const char *const optStrings[] = { "-strict", NULL }; @@ -2616,8 +2617,12 @@ BinaryDecodeHex( } TclNewObj(resultObj); - datastart = data = (unsigned char *) - TclGetStringFromObj(objv[objc - 1], &count); + data = TclGetBytesFromObj(NULL, objv[objc - 1], &count); + if (data == NULL) { + pure = 0; + data = (unsigned char *) TclGetStringFromObj(objv[objc - 1], &count); + } + datastart = data; dataend = data + count; size = (count + 1) / 2; begin = cursor = Tcl_SetByteArrayLength(resultObj, size); @@ -2662,10 +2667,15 @@ BinaryDecodeHex( return TCL_OK; badChar: + if (pure) { + ch = c; + } else { + TclUtfToUniChar((const char *)(data - 1), &ch); + } TclDecrRefCount(resultObj); Tcl_SetObjResult(interp, Tcl_ObjPrintf( "invalid hexadecimal digit \"%c\" at position %" TCL_Z_MODIFIER "u", - c, data - datastart - 1)); + ch, data - datastart - 1)); Tcl_SetErrorCode(interp, "TCL", "BINARY", "DECODE", "INVALID", NULL); return TCL_ERROR; } @@ -2949,9 +2959,10 @@ BinaryDecodeUu( Tcl_Obj *resultObj = NULL; unsigned char *data, *datastart, *dataend; unsigned char *begin, *cursor; - int i, index, size, strict = 0, lineLen; - size_t count = 0; + int i, index, pure = 1, strict = 0, lineLen; + size_t size, count = 0; unsigned char c; + Tcl_UniChar ch = 0; enum { OPT_STRICT }; static const char *const optStrings[] = { "-strict", NULL }; @@ -2972,8 +2983,12 @@ BinaryDecodeUu( } TclNewObj(resultObj); - datastart = data = (unsigned char *) - TclGetStringFromObj(objv[objc - 1], &count); + data = TclGetBytesFromObj(NULL, objv[objc - 1], &count); + if (data == NULL) { + pure = 0; + data = (unsigned char *) TclGetStringFromObj(objv[objc - 1], &count); + } + datastart = data; dataend = data + count; size = ((count + 3) & ~3) * 3 / 4; begin = cursor = Tcl_SetByteArrayLength(resultObj, size); @@ -3079,9 +3094,14 @@ BinaryDecodeUu( return TCL_ERROR; badUu: + if (pure) { + ch = c; + } else { + TclUtfToUniChar((const char *)(data - 1), &ch); + } Tcl_SetObjResult(interp, Tcl_ObjPrintf( "invalid uuencode character \"%c\" at position %" TCL_Z_MODIFIER "u", - c, data - datastart - 1)); + ch, data - datastart - 1)); Tcl_SetErrorCode(interp, "TCL", "BINARY", "DECODE", "INVALID", NULL); TclDecrRefCount(resultObj); return TCL_ERROR; @@ -3117,7 +3137,7 @@ BinaryDecode64( int pure = 1, strict = 0; int i, index, cut = 0; size_t size, count = 0; - Tcl_UniChar ch; + Tcl_UniChar ch = 0; enum { OPT_STRICT }; static const char *const optStrings[] = { "-strict", NULL }; |
