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
This commit is contained in:
William S Fulton 2007-09-24 21:42:05 +00:00
commit ed3938e36f
2 changed files with 24 additions and 12 deletions

View file

@ -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="<limits.h>") {
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="<limits.h>",
fragment="<stdlib.h>") {
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="<limits.h>",
fragment="<stdlib.h>") {
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 {

View file

@ -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("<limits.h>","header") %{
#include <limits.h>
#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
%}