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
|
||||
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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
%}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue