From af0e3e86e6738ea3ed0ae4c45b1fa230e6e53c66 Mon Sep 17 00:00:00 2001 From: Olly Betts Date: Sun, 24 Sep 2006 21:55:30 +0000 Subject: [PATCH] Fix Tcl typemaps to handle unsigned long > LONG_MAX and unsigned long long > LONG_LONG_MAX when converting values from Tcl to C/C++. Fixes bug #1533266. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9351 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- SWIG/Lib/tcl/tclprimtypes.swg | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/SWIG/Lib/tcl/tclprimtypes.swg b/SWIG/Lib/tcl/tclprimtypes.swg index 931ea5054..31c0b77a0 100644 --- a/SWIG/Lib/tcl/tclprimtypes.swg +++ b/SWIG/Lib/tcl/tclprimtypes.swg @@ -75,15 +75,19 @@ SWIG_AsVal_dec(unsigned long)(Tcl_Obj *obj, unsigned long *val) { if (v >= 0) { if (val) *val = (unsigned long) v; return SWIG_OK; - } else { - return SWIG_OverflowError; } - } else { + /* If v is negative, then this could be a negative number, or an + unsigned value which doesn't fit in a signed long, so try to + get it as a string so we can distinguish these cases. */ + } + { int len = 0; const char *nptr = Tcl_GetStringFromObj(obj, &len); if (nptr && len > 0) { char *endptr; - unsigned long v = strtoul(nptr, &endptr,0); + unsigned long v; + if (*nptr == '-') return SWIG_OverflowError; + v = strtoul(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; @@ -176,18 +180,16 @@ SWIG_AsVal_dec(unsigned long long)(Tcl_Obj *obj, unsigned long long *val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { - if (v >= 0) { - if (val) *val = (long) v; - return SWIG_OK; - } else { - return SWIG_OverflowError; - } + if (val) *val = (unsigned long) v; + return SWIG_OK; } else { int len = 0; const char *nptr = Tcl_GetStringFromObj(obj, &len); if (nptr && len > 0) { char *endptr; - unsigned long long v = strtoull(nptr, &endptr,0); + unsigned long long v; + if (*nptr == '-') return SWIG_OverflowError; + v = strtoull(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError;