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
This commit is contained in:
parent
7e8f1dd8b1
commit
af0e3e86e6
1 changed files with 13 additions and 11 deletions
|
|
@ -75,15 +75,19 @@ SWIG_AsVal_dec(unsigned long)(Tcl_Obj *obj, unsigned long *val) {
|
||||||
if (v >= 0) {
|
if (v >= 0) {
|
||||||
if (val) *val = (unsigned long) v;
|
if (val) *val = (unsigned long) v;
|
||||||
return SWIG_OK;
|
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;
|
int len = 0;
|
||||||
const char *nptr = Tcl_GetStringFromObj(obj, &len);
|
const char *nptr = Tcl_GetStringFromObj(obj, &len);
|
||||||
if (nptr && len > 0) {
|
if (nptr && len > 0) {
|
||||||
char *endptr;
|
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) {
|
if (errno == ERANGE) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
return SWIG_OverflowError;
|
return SWIG_OverflowError;
|
||||||
|
|
@ -176,18 +180,16 @@ SWIG_AsVal_dec(unsigned long long)(Tcl_Obj *obj, unsigned long long *val)
|
||||||
{
|
{
|
||||||
long v;
|
long v;
|
||||||
if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) {
|
if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) {
|
||||||
if (v >= 0) {
|
if (val) *val = (unsigned long) v;
|
||||||
if (val) *val = (long) v;
|
return SWIG_OK;
|
||||||
return SWIG_OK;
|
|
||||||
} else {
|
|
||||||
return SWIG_OverflowError;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
int len = 0;
|
int len = 0;
|
||||||
const char *nptr = Tcl_GetStringFromObj(obj, &len);
|
const char *nptr = Tcl_GetStringFromObj(obj, &len);
|
||||||
if (nptr && len > 0) {
|
if (nptr && len > 0) {
|
||||||
char *endptr;
|
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) {
|
if (errno == ERANGE) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
return SWIG_OverflowError;
|
return SWIG_OverflowError;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue