Home | History | Annotate | Download | only in perl5
      1 /* ------------------------------------------------------------
      2  * Primitive Types
      3  * ------------------------------------------------------------ */
      4 
      5 /* bool */
      6 
      7 %fragment(SWIG_From_frag(bool),"header") {
      8 SWIGINTERNINLINE SV *
      9 SWIG_From_dec(bool)(bool value)
     10 {
     11   return boolSV(value);
     12 }
     13 }
     14 
     15 %fragment(SWIG_AsVal_frag(bool),"header") {
     16 SWIGINTERN int
     17 SWIG_AsVal_dec(bool)(SV *obj, bool* val)
     18 {
     19   if (obj == &PL_sv_yes) {
     20     if (val) *val = true;
     21     return SWIG_OK;
     22   } else if (obj == &PL_sv_no) {
     23     if (val) *val = false;
     24     return SWIG_OK;
     25   } else {
     26     if (val) *val = SvTRUE(obj) ? true : false;
     27     return SWIG_AddCast(SWIG_OK);
     28   }
     29 }
     30 }
     31 
     32 
     33 /* long */
     34 
     35 %fragment(SWIG_From_frag(long),"header") {
     36 SWIGINTERNINLINE SV *
     37 SWIG_From_dec(long)(long value)
     38 {
     39   SV *sv;
     40   if (value >= IV_MIN && value <= IV_MAX)
     41     sv = newSViv(value);
     42   else
     43     sv = newSVpvf("%ld", value);
     44   return sv_2mortal(sv);
     45 }
     46 }
     47 
     48 %fragment(SWIG_AsVal_frag(long),"header",
     49 	  fragment="SWIG_CanCastAsInteger") {
     50 SWIGINTERN int
     51 SWIG_AsVal_dec(long)(SV *obj, long* val)
     52 {
     53   if (SvUOK(obj)) {
     54     UV v = SvUV(obj);
     55     if (v <= LONG_MAX) {
     56       if (val) *val = v;
     57       return SWIG_OK;
     58     }
     59     return SWIG_OverflowError;
     60   } else if (SvIOK(obj)) {
     61     IV v = SvIV(obj);
     62     if (v >= LONG_MIN && v <= LONG_MAX) {
     63       if(val) *val = v;
     64       return SWIG_OK;
     65     }
     66     return SWIG_OverflowError;
     67   } else {
     68     int dispatch = 0;
     69     const char *nptr = SvPV_nolen(obj);
     70     if (nptr) {
     71       char *endptr;
     72       long v;
     73       errno = 0;
     74       v = strtol(nptr, &endptr,0);
     75       if (errno == ERANGE) {
     76 	errno = 0;
     77 	return SWIG_OverflowError;
     78       } else {
     79 	if (*endptr == '\0') {
     80 	  if (val) *val = v;
     81 	  return SWIG_Str2NumCast(SWIG_OK);
     82 	}
     83       }
     84     }
     85     if (!dispatch) {
     86       double d;
     87       int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d));
     88       if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) {
     89 	if (val) *val = (long)(d);
     90 	return res;
     91       }
     92     }
     93   }
     94   return SWIG_TypeError;
     95 }
     96 }
     97 
     98 /* unsigned long */
     99 
    100 %fragment(SWIG_From_frag(unsigned long),"header") {
    101 SWIGINTERNINLINE SV *
    102 SWIG_From_dec(unsigned long)(unsigned long value)
    103 {
    104   SV *sv;
    105   if (value <= UV_MAX)
    106     sv = newSVuv(value);
    107   else
    108     sv = newSVpvf("%lu", value);
    109   return sv_2mortal(sv);
    110 }
    111 }
    112 
    113 %fragment(SWIG_AsVal_frag(unsigned long),"header",
    114 	  fragment="SWIG_CanCastAsInteger") {
    115 SWIGINTERN int
    116 SWIG_AsVal_dec(unsigned long)(SV *obj, unsigned long *val)
    117 {
    118   if (SvUOK(obj)) {
    119     UV v = SvUV(obj);
    120     if (v <= ULONG_MAX) {
    121       if (val) *val = v;
    122       return SWIG_OK;
    123     }
    124     return SWIG_OverflowError;
    125   } else if (SvIOK(obj)) {
    126     IV v = SvIV(obj);
    127     if (v >= 0 && v <= ULONG_MAX) {
    128       if (val) *val = v;
    129       return SWIG_OK;
    130     }
    131     return SWIG_OverflowError;
    132   } else {
    133     int dispatch = 0;
    134     const char *nptr = SvPV_nolen(obj);
    135     if (nptr) {
    136       char *endptr;
    137       unsigned long v;
    138       errno = 0;
    139       v = strtoul(nptr, &endptr,0);
    140       if (errno == ERANGE) {
    141 	errno = 0;
    142 	return SWIG_OverflowError;
    143       } else {
    144 	if (*endptr == '\0') {
    145 	  if (val) *val = v;
    146 	  return SWIG_Str2NumCast(SWIG_OK);
    147 	}
    148       }
    149     }
    150     if (!dispatch) {
    151       double d;
    152       int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d));
    153       if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) {
    154 	if (val) *val = (unsigned long)(d);
    155 	return res;
    156       }
    157     }
    158   }
    159   return SWIG_TypeError;
    160 }
    161 }
    162 
    163 /* long long */
    164 
    165 %fragment(SWIG_From_frag(long long),"header",
    166 	  fragment=SWIG_From_frag(long),
    167 	  fragment="<limits.h>",
    168 	  fragment="<stdio.h>") {
    169 SWIGINTERNINLINE SV *
    170 SWIG_From_dec(long long)(long long value)
    171 {
    172   SV *sv;
    173   if (value >= IV_MIN && value <= IV_MAX)
    174     sv = newSViv((IV)(value));
    175   else {
    176     //sv = newSVpvf("%lld", value); doesn't work in non 64bit Perl
    177     char temp[256];
    178     sprintf(temp, "%lld", value);
    179     sv = newSVpv(temp, 0);
    180   }
    181   return sv_2mortal(sv);
    182 }
    183 }
    184 
    185 %fragment(SWIG_AsVal_frag(long long),"header",
    186 	  fragment="<limits.h>",
    187 	  fragment="<stdlib.h>",
    188 	  fragment="SWIG_CanCastAsInteger") {
    189 
    190 SWIGINTERN int
    191 SWIG_AsVal_dec(long long)(SV *obj, long long *val)
    192 {
    193   if (SvUOK(obj)) {
    194     UV v = SvUV(obj);
    195     if (v < LLONG_MAX) {
    196       if (val) *val = v;
    197       return SWIG_OK;
    198     }
    199     return SWIG_OverflowError;
    200   } else if (SvIOK(obj)) {
    201     IV v = SvIV(obj);
    202     if (v >= LLONG_MIN && v <= LLONG_MAX) {
    203       if (val) *val = v;
    204       return SWIG_OK;
    205     }
    206     return SWIG_OverflowError;
    207   } else {
    208     int dispatch = 0;
    209     const char *nptr = SvPV_nolen(obj);
    210     if (nptr) {
    211       char *endptr;
    212       long long v;
    213       errno = 0;
    214       v = strtoll(nptr, &endptr,0);
    215       if (errno == ERANGE) {
    216 	errno = 0;
    217 	return SWIG_OverflowError;
    218       } else {
    219 	if (*endptr == '\0') {
    220 	  if (val) *val = v;
    221 	  return SWIG_Str2NumCast(SWIG_OK);
    222 	}
    223       }
    224     }
    225     if (!dispatch) {
    226       const double mant_max = 1LL << DBL_MANT_DIG;
    227       const double mant_min = -mant_max;
    228       double d;
    229       int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d));
    230       if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) {
    231 	if (val) *val = (long long)(d);
    232 	return res;
    233       }
    234     }
    235   }
    236   return SWIG_TypeError;
    237 }
    238 }
    239 
    240 /* unsigned long long */
    241 
    242 %fragment(SWIG_From_frag(unsigned long long),"header",
    243 	  fragment=SWIG_From_frag(long long),
    244 	  fragment="<limits.h>",
    245 	  fragment="<stdio.h>") {
    246 SWIGINTERNINLINE SV *
    247 SWIG_From_dec(unsigned long long)(unsigned long long value)
    248 {
    249   SV *sv;
    250   if (value <= UV_MAX)
    251     sv = newSVuv((UV)(value));
    252   else {
    253     //sv = newSVpvf("%llu", value); doesn't work in non 64bit Perl
    254     char temp[256];
    255     sprintf(temp, "%llu", value);
    256     sv = newSVpv(temp, 0);
    257   }
    258   return sv_2mortal(sv);
    259 }
    260 }
    261 
    262 %fragment(SWIG_AsVal_frag(unsigned long long),"header",
    263 	  fragment="<limits.h>",
    264 	  fragment="<stdlib.h>",
    265 	  fragment="SWIG_CanCastAsInteger") {
    266 SWIGINTERN int
    267 SWIG_AsVal_dec(unsigned long long)(SV *obj, unsigned long long *val)
    268 {
    269   if (SvUOK(obj)) {
    270     if (val) *val = SvUV(obj);
    271     return SWIG_OK;
    272   } else  if (SvIOK(obj)) {
    273     IV v = SvIV(obj);
    274     if (v >= 0 && v <= ULLONG_MAX) {
    275       if (val) *val = v;
    276       return SWIG_OK;
    277     } else {
    278       return SWIG_OverflowError;
    279     }
    280   } else {
    281     int dispatch = 0;
    282     const char *nptr = SvPV_nolen(obj);
    283     if (nptr) {
    284       char *endptr;
    285       unsigned long long v;
    286       errno = 0;
    287       v = strtoull(nptr, &endptr,0);
    288       if (errno == ERANGE) {
    289 	errno = 0;
    290 	return SWIG_OverflowError;
    291       } else {
    292 	if (*endptr == '\0') {
    293 	  if (val) *val = v;
    294 	  return SWIG_Str2NumCast(SWIG_OK);
    295 	}
    296       }
    297     }
    298     if (!dispatch) {
    299       const double mant_max = 1LL << DBL_MANT_DIG;
    300       double d;
    301       int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d));
    302       if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) {
    303 	if (val) *val = (unsigned long long)(d);
    304 	return res;
    305       }
    306     }
    307   }
    308   return SWIG_TypeError;
    309 }
    310 }
    311 
    312 /* double */
    313 
    314 %fragment(SWIG_From_frag(double),"header") {
    315 SWIGINTERNINLINE SV *
    316 SWIG_From_dec(double)(double value)
    317 {
    318   return sv_2mortal(newSVnv(value));
    319 }
    320 }
    321 
    322 %fragment(SWIG_AsVal_frag(double),"header") {
    323 SWIGINTERN int
    324 SWIG_AsVal_dec(double)(SV *obj, double *val)
    325 {
    326   if (SvNIOK(obj)) {
    327     if (val) *val = SvNV(obj);
    328     return SWIG_OK;
    329   } else if (SvIOK(obj)) {
    330     if (val) *val = (double) SvIV(obj);
    331     return SWIG_AddCast(SWIG_OK);
    332   } else {
    333     const char *nptr = SvPV_nolen(obj);
    334     if (nptr) {
    335       char *endptr;
    336       double v;
    337       errno = 0;
    338       v = strtod(nptr, &endptr);
    339       if (errno == ERANGE) {
    340 	errno = 0;
    341 	return SWIG_OverflowError;
    342       } else {
    343 	if (*endptr == '\0') {
    344 	  if (val) *val = v;
    345 	  return SWIG_Str2NumCast(SWIG_OK);
    346 	}
    347       }
    348     }
    349   }
    350   return SWIG_TypeError;
    351 }
    352 }
    353