diff options
| author | dgp <dgp@users.sourceforge.net> | 2020-03-30 15:13:53 (GMT) |
|---|---|---|
| committer | dgp <dgp@users.sourceforge.net> | 2020-03-30 15:13:53 (GMT) |
| commit | 8139a8a59564bd6aea41fba879e3d394c740aeff (patch) | |
| tree | c984d7c707852825875eb494108c9d1ba591cb43 /generic/tclBinary.c | |
| parent | bcfc4a29c55da65006d3eb778c097ee6a24460e8 (diff) | |
| parent | 987ffc2687ef44b4bda1b03ff9914d69130cd3c5 (diff) | |
| download | tcl-8139a8a59564bd6aea41fba879e3d394c740aeff.zip tcl-8139a8a59564bd6aea41fba879e3d394c740aeff.tar.gz tcl-8139a8a59564bd6aea41fba879e3d394c740aeff.tar.bz2 | |
Merge 8.6, revise to use TclGetBytesFromObj.
Diffstat (limited to 'generic/tclBinary.c')
| -rw-r--r-- | generic/tclBinary.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/generic/tclBinary.c b/generic/tclBinary.c index 6802f99..e83689f 100644 --- a/generic/tclBinary.c +++ b/generic/tclBinary.c @@ -2947,8 +2947,9 @@ BinaryDecodeUu( Tcl_Obj *resultObj = NULL; unsigned char *data, *datastart, *dataend; unsigned char *begin, *cursor; - int i, index, size, count = 0, strict = 0, lineLen; + int i, index, size, pure = 1, count = 0, strict = 0, lineLen; unsigned char c; + Tcl_UniChar ch; enum { OPT_STRICT }; static const char *const optStrings[] = { "-strict", NULL }; @@ -2969,8 +2970,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); @@ -3076,9 +3081,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 %d", - c, (int) (data - datastart - 1))); + ch, (int) (data - datastart - 1))); Tcl_SetErrorCode(interp, "TCL", "BINARY", "DECODE", "INVALID", NULL); TclDecrRefCount(resultObj); return TCL_ERROR; |
