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:
parent
f8142058e1
commit
ed3938e36f
2 changed files with 24 additions and 12 deletions
|
|
@ -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
|
SWIGINTERN int
|
||||||
SWIG_AsVal_dec(unsigned long)(Tcl_Obj *obj, unsigned long *val) {
|
SWIG_AsVal_dec(unsigned long)(Tcl_Obj *obj, unsigned long *val) {
|
||||||
long v;
|
long v;
|
||||||
|
|
@ -87,8 +88,11 @@ SWIG_AsVal_dec(unsigned long)(Tcl_Obj *obj, unsigned long *val) {
|
||||||
char *endptr;
|
char *endptr;
|
||||||
unsigned long v;
|
unsigned long v;
|
||||||
if (*nptr == '-') return SWIG_OverflowError;
|
if (*nptr == '-') return SWIG_OverflowError;
|
||||||
|
errno = 0;
|
||||||
v = strtoul(nptr, &endptr,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;
|
errno = 0;
|
||||||
return SWIG_OverflowError;
|
return SWIG_OverflowError;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -124,6 +128,7 @@ SWIG_From_dec(long long)(long long value)
|
||||||
}
|
}
|
||||||
|
|
||||||
%fragment(SWIG_AsVal_frag(long long),"header",
|
%fragment(SWIG_AsVal_frag(long long),"header",
|
||||||
|
fragment="<limits.h>",
|
||||||
fragment="<stdlib.h>") {
|
fragment="<stdlib.h>") {
|
||||||
SWIGINTERN int
|
SWIGINTERN int
|
||||||
SWIG_AsVal_dec(long long)(Tcl_Obj *obj, long long *val)
|
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);
|
const char *nptr = Tcl_GetStringFromObj(obj, &len);
|
||||||
if (nptr && len > 0) {
|
if (nptr && len > 0) {
|
||||||
char *endptr;
|
char *endptr;
|
||||||
|
errno = 0;
|
||||||
long long v = strtoll(nptr, &endptr,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;
|
errno = 0;
|
||||||
return SWIG_OverflowError;
|
return SWIG_OverflowError;
|
||||||
} else {
|
} 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 long),"header",
|
||||||
fragment=SWIG_AsVal_frag(unsigned long),
|
fragment=SWIG_AsVal_frag(unsigned long),
|
||||||
|
fragment="<limits.h>",
|
||||||
fragment="<stdlib.h>") {
|
fragment="<stdlib.h>") {
|
||||||
SWIGINTERN int
|
SWIGINTERN int
|
||||||
SWIG_AsVal_dec(unsigned long long)(Tcl_Obj *obj, unsigned long long *val)
|
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;
|
char *endptr;
|
||||||
unsigned long long v;
|
unsigned long long v;
|
||||||
if (*nptr == '-') return SWIG_OverflowError;
|
if (*nptr == '-') return SWIG_OverflowError;
|
||||||
|
errno = 0;
|
||||||
v = strtoull(nptr, &endptr,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;
|
errno = 0;
|
||||||
return SWIG_OverflowError;
|
return SWIG_OverflowError;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -319,16 +319,16 @@
|
||||||
* common fragments
|
* 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") %{
|
%fragment("<limits.h>","header") %{
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#ifndef LLONG_MIN
|
#if !defined(SWIG_NO_LLONG_MAX)
|
||||||
# define LLONG_MIN LONG_LONG_MIN
|
# 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
|
||||||
#ifndef LLONG_MAX
|
|
||||||
# define LLONG_MAX LONG_LONG_MAX
|
|
||||||
#endif
|
|
||||||
#ifndef ULLONG_MAX
|
|
||||||
# define ULLONG_MAX ULONG_LONG_MAX
|
|
||||||
#endif
|
#endif
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue