From ed3938e36fe833bd32efd3d11674f6262e64e43b Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Mon, 24 Sep 2007 21:42:05 +0000 Subject: [PATCH] fix long long handling - mainly patch 1771313. Attempt to define ISO limits that should be in limits.h if gcc has not defined them. This might need refining further. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9954 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Lib/tcl/tclprimtypes.swg | 20 ++++++++++++++++---- Lib/typemaps/fragments.swg | 16 ++++++++-------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/Lib/tcl/tclprimtypes.swg b/Lib/tcl/tclprimtypes.swg index 31c0b77a0..ff59631c6 100644 --- a/Lib/tcl/tclprimtypes.swg +++ b/Lib/tcl/tclprimtypes.swg @@ -67,7 +67,8 @@ SWIG_From_dec(unsigned long)(unsigned long value) } } -%fragment(SWIG_AsVal_frag(unsigned long),"header") { +%fragment(SWIG_AsVal_frag(unsigned long),"header", + fragment="") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(Tcl_Obj *obj, unsigned long *val) { long v; @@ -87,8 +88,11 @@ SWIG_AsVal_dec(unsigned long)(Tcl_Obj *obj, unsigned long *val) { char *endptr; unsigned long v; if (*nptr == '-') return SWIG_OverflowError; + errno = 0; v = strtoul(nptr, &endptr,0); - if (errno == ERANGE) { + if (nptr[0] == '\0' || *endptr != '\0') + return SWIG_TypeError; + if (v == ULONG_MAX && errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { @@ -124,6 +128,7 @@ SWIG_From_dec(long long)(long long value) } %fragment(SWIG_AsVal_frag(long long),"header", + fragment="", fragment="") { SWIGINTERN int SWIG_AsVal_dec(long long)(Tcl_Obj *obj, long long *val) @@ -137,8 +142,11 @@ SWIG_AsVal_dec(long long)(Tcl_Obj *obj, long long *val) const char *nptr = Tcl_GetStringFromObj(obj, &len); if (nptr && len > 0) { char *endptr; + errno = 0; long long v = strtoll(nptr, &endptr,0); - if (errno == ERANGE) { + if (nptr[0] == '\0' || *endptr != '\0') + return SWIG_TypeError; + if ((v == LLONG_MAX || v == LLONG_MIN) && errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { @@ -174,6 +182,7 @@ SWIG_From_dec(unsigned long long)(unsigned long long value) %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), + fragment="", fragment="") { SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(Tcl_Obj *obj, unsigned long long *val) @@ -189,8 +198,11 @@ SWIG_AsVal_dec(unsigned long long)(Tcl_Obj *obj, unsigned long long *val) char *endptr; unsigned long long v; if (*nptr == '-') return SWIG_OverflowError; + errno = 0; v = strtoull(nptr, &endptr,0); - if (errno == ERANGE) { + if (nptr[0] == '\0' || *endptr != '\0') + return SWIG_TypeError; + if (v == ULLONG_MAX && errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { diff --git a/Lib/typemaps/fragments.swg b/Lib/typemaps/fragments.swg index 00c35b986..6d3e20223 100644 --- a/Lib/typemaps/fragments.swg +++ b/Lib/typemaps/fragments.swg @@ -319,16 +319,16 @@ * common fragments * ------------------------------------------------------------ */ +/* Default compiler options for gcc allow long_long but not LLONG_MAX. + * Define SWIG_NO_LLONG_MAX if this added limits support is not wanted. */ %fragment("","header") %{ #include -#ifndef LLONG_MIN -# define LLONG_MIN LONG_LONG_MIN -#endif -#ifndef LLONG_MAX -# define LLONG_MAX LONG_LONG_MAX -#endif -#ifndef ULLONG_MAX -# define ULLONG_MAX ULONG_LONG_MAX +#if !defined(SWIG_NO_LLONG_MAX) +# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) +# define LLONG_MAX __LONG_LONG_MAX__ +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +# endif #endif %}