summaryrefslogtreecommitdiffstats
path: root/generic/tclScan.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2018-02-22 21:17:14 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2018-02-22 21:17:14 (GMT)
commit07448025782175253319b1330ea0a1ab3cb0b5d0 (patch)
treea65b45bbea287fe45c91962dfd9e855ef5037f50 /generic/tclScan.c
parentcb2f9cccfbc8007a93a1010bbabe4614939b94a2 (diff)
parentf5bf130f05e3dcf636ef831f017d5672c594660a (diff)
downloadtcl-07448025782175253319b1330ea0a1ab3cb0b5d0.zip
tcl-07448025782175253319b1330ea0a1ab3cb0b5d0.tar.gz
tcl-07448025782175253319b1330ea0a1ab3cb0b5d0.tar.bz2
merge trunk
Diffstat (limited to 'generic/tclScan.c')
-rw-r--r--generic/tclScan.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/generic/tclScan.c b/generic/tclScan.c
index 0cd23d8..65ceb66 100644
--- a/generic/tclScan.c
+++ b/generic/tclScan.c
@@ -10,6 +10,7 @@
*/
#include "tclInt.h"
+#include "tommath.h"
/*
* Flag values used by Tcl_ScanObjCmd.
@@ -415,14 +416,7 @@ ValidateFormat(
case 'x':
case 'X':
case 'b':
- break;
case 'u':
- if (flags & SCAN_BIG) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "unsigned bignum scans are invalid", -1));
- Tcl_SetErrorCode(interp, "TCL", "FORMAT", "BADUNSIGNED",NULL);
- goto error;
- }
break;
/*
* Bracket terms need special checking
@@ -944,7 +938,18 @@ Tcl_ScanObjCmd(
} else {
TclSetIntObj(objPtr, wideValue);
}
- } else if (!(flags & SCAN_BIG)) {
+ } else if (flags & SCAN_BIG) {
+ if (flags & SCAN_UNSIGNED) {
+ mp_int big;
+ if ((Tcl_GetBignumFromObj(interp, objPtr, &big) != TCL_OK)
+ || (mp_cmp_d(&big, 0) == MP_LT)) {
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(
+ "unsigned bignum scans are invalid", -1));
+ Tcl_SetErrorCode(interp, "TCL", "FORMAT", "BADUNSIGNED",NULL);
+ return TCL_ERROR;
+ }
+ }
+ } else {
if (TclGetLongFromObj(NULL, objPtr, &value) != TCL_OK) {
if (TclGetString(objPtr)[0] == '-') {
value = LONG_MIN;