perlstrings.swg 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /* ------------------------------------------------------------
  2. * utility methods for char strings
  3. * ------------------------------------------------------------ */
  4. %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") {
  5. SWIGINTERN int
  6. SWIG_AsCharPtrAndSize(SV *obj, char** cptr, size_t* psize, int *alloc)
  7. {
  8. if (SvMAGICAL(obj)) {
  9. SV *tmp = sv_newmortal();
  10. SvSetSV(tmp, obj);
  11. obj = tmp;
  12. }
  13. if (SvPOK(obj)) {
  14. STRLEN len = 0;
  15. char *cstr = SvPV(obj, len);
  16. size_t size = len + 1;
  17. if (cptr) {
  18. if (alloc) {
  19. if (*alloc == SWIG_NEWOBJ) {
  20. *cptr = %new_copy_array(cstr, size, char);
  21. } else {
  22. *cptr = cstr;
  23. *alloc = SWIG_OLDOBJ;
  24. }
  25. }
  26. }
  27. if (psize) *psize = size;
  28. return SWIG_OK;
  29. } else {
  30. swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
  31. if (pchar_descriptor) {
  32. char* vptr = 0;
  33. if (SWIG_ConvertPtr(obj, (void**)&vptr, pchar_descriptor, 0) == SWIG_OK) {
  34. if (cptr) *cptr = vptr;
  35. if (psize) *psize = vptr ? (strlen(vptr) + 1) : 0;
  36. if (alloc) *alloc = SWIG_OLDOBJ;
  37. return SWIG_OK;
  38. }
  39. }
  40. }
  41. return SWIG_TypeError;
  42. }
  43. }
  44. %fragment("SWIG_FromCharPtrAndSize","header") {
  45. SWIGINTERNINLINE SV *
  46. SWIG_FromCharPtrAndSize(const char* carray, size_t size)
  47. {
  48. SV *obj = sv_newmortal();
  49. if (carray) {
  50. sv_setpvn(obj, carray, size);
  51. } else {
  52. sv_setsv(obj, &PL_sv_undef);
  53. }
  54. return obj;
  55. }
  56. }