PageRenderTime 25ms CodeModel.GetById 0ms RepoModel.GetById 1ms app.codeStats 0ms

/trunk/Lib/perl5/perlprimtypes.swg

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