summaryrefslogtreecommitdiff
path: root/Lib/tcl
diff options
context:
space:
mode:
authorOlly Betts <olly@survex.com>2006-09-24 21:55:30 +0000
committerOlly Betts <olly@survex.com>2006-09-24 21:55:30 +0000
commitfdd51d408068ab8e21d27519fd45a99b840f8bd9 (patch)
tree7db3df1a25e05e8325b234bccbf95c5aa5adae9d /Lib/tcl
parent61472bb0ac0c2868d3e05569606c1e768038c5a0 (diff)
downloadswig-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.swg24
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;