diff options
author | Olly Betts <olly@survex.com> | 2006-09-24 21:55:30 +0000 |
---|---|---|
committer | Olly Betts <olly@survex.com> | 2006-09-24 21:55:30 +0000 |
commit | fdd51d408068ab8e21d27519fd45a99b840f8bd9 (patch) | |
tree | 7db3df1a25e05e8325b234bccbf95c5aa5adae9d /Lib/tcl | |
parent | 61472bb0ac0c2868d3e05569606c1e768038c5a0 (diff) | |
download | swig-fdd51d408068ab8e21d27519fd45a99b840f8bd9.tar.gz |
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/SWIG@9351 626c5289-ae23-0410-ae9c-e8d60b6d4f22
Diffstat (limited to 'Lib/tcl')
-rw-r--r-- | Lib/tcl/tclprimtypes.swg | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/Lib/tcl/tclprimtypes.swg b/Lib/tcl/tclprimtypes.swg index 931ea5054..31c0b77a0 100644 --- a/Lib/tcl/tclprimtypes.swg +++ b/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; |