cdata.i 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* -----------------------------------------------------------------------------
  2. * cdata.i
  3. *
  4. * SWIG library file containing macros for manipulating raw C data as strings.
  5. * ----------------------------------------------------------------------------- */
  6. %{
  7. typedef struct SWIGCDATA {
  8. char *data;
  9. intgo len;
  10. } SWIGCDATA;
  11. %}
  12. %fragment("cdata", "header") %{
  13. struct swigcdata {
  14. intgo size;
  15. void *data;
  16. };
  17. %}
  18. %typemap(gotype) SWIGCDATA "[]byte"
  19. %typemap(imtype) SWIGCDATA "uint64"
  20. %typemap(out, fragment="cdata") SWIGCDATA(struct swigcdata *swig_out) %{
  21. swig_out = (struct swigcdata *)malloc(sizeof(*swig_out));
  22. if (swig_out) {
  23. swig_out->size = $1.len;
  24. swig_out->data = malloc(swig_out->size);
  25. if (swig_out->data) {
  26. memcpy(swig_out->data, $1.data, swig_out->size);
  27. }
  28. }
  29. $result = *(long long *)(void **)&swig_out;
  30. %}
  31. %typemap(goout) SWIGCDATA %{
  32. {
  33. type swigcdata struct { size int; data uintptr }
  34. p := (*swigcdata)(unsafe.Pointer(uintptr($1)))
  35. if p == nil || p.data == 0 {
  36. $result = nil
  37. } else {
  38. b := make([]byte, p.size)
  39. a := (*[0x7fffffff]byte)(unsafe.Pointer(p.data))[:p.size]
  40. copy(b, a)
  41. Swig_free(p.data)
  42. Swig_free(uintptr(unsafe.Pointer(p)))
  43. $result = b
  44. }
  45. }
  46. %}
  47. /* -----------------------------------------------------------------------------
  48. * %cdata(TYPE [, NAME])
  49. *
  50. * Convert raw C data to a binary string.
  51. * ----------------------------------------------------------------------------- */
  52. %define %cdata(TYPE,NAME...)
  53. %insert("header") {
  54. #if #NAME == ""
  55. static SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements) {
  56. #else
  57. static SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements) {
  58. #endif
  59. SWIGCDATA d;
  60. d.data = (char *) ptr;
  61. #if #TYPE != "void"
  62. d.len = nelements*sizeof(TYPE);
  63. #else
  64. d.len = nelements;
  65. #endif
  66. return d;
  67. }
  68. }
  69. %typemap(default) int nelements "$1 = 1;"
  70. #if #NAME == ""
  71. SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements);
  72. #else
  73. SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements);
  74. #endif
  75. %enddef
  76. %typemap(default) int nelements;
  77. %rename(cdata) ::cdata_void(void *ptr, int nelements);
  78. %cdata(void);
  79. /* Memory move function. Due to multi-argument typemaps this appears
  80. to be wrapped as
  81. void memmove(void *data, const char *s); */
  82. void memmove(void *data, char *indata, int inlen);