1 /* ----------------------------------------------------------------------------- 2 * cdata.i 3 * 4 * SWIG library file containing macros for manipulating raw C data as strings. 5 * ----------------------------------------------------------------------------- */ 6 7 %{ 8 typedef struct SWIGCDATA { 9 char *data; 10 int len; 11 } SWIGCDATA; 12 %} 13 14 /* ----------------------------------------------------------------------------- 15 * Typemaps for returning binary data 16 * ----------------------------------------------------------------------------- */ 17 18 #if SWIGGUILE 19 %typemap(out) SWIGCDATA { 20 $result = scm_from_locale_stringn($1.data,$1.len); 21 } 22 %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); 23 #elif SWIGCHICKEN 24 %typemap(out) SWIGCDATA { 25 C_word *string_space = C_alloc(C_SIZEOF_STRING($1.len)); 26 $result = C_string(&string_space, $1.len, $1.data); 27 } 28 %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); 29 #elif SWIGPHP 30 %typemap(out) SWIGCDATA { 31 ZVAL_STRINGL($result, $1.data, $1.len, 1); 32 } 33 %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); 34 #else 35 %echo "cdata.i module not supported." 36 #endif 37 38 39 /* ----------------------------------------------------------------------------- 40 * %cdata(TYPE [, NAME]) 41 * 42 * Convert raw C data to a binary string. 43 * ----------------------------------------------------------------------------- */ 44 45 %define %cdata(TYPE,NAME...) 46 47 %insert("header") { 48 #if #NAME == "" 49 static SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements) { 50 #else 51 static SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements) { 52 #endif 53 SWIGCDATA d; 54 d.data = (char *) ptr; 55 #if #TYPE != "void" 56 d.len = nelements*sizeof(TYPE); 57 #else 58 d.len = nelements; 59 #endif 60 return d; 61 } 62 } 63 64 %typemap(default) int nelements "$1 = 1;" 65 66 #if #NAME == "" 67 SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements); 68 #else 69 SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements); 70 #endif 71 %enddef 72 73 %typemap(default) int nelements; 74 75 %rename(cdata) ::cdata_void(void *ptr, int nelements); 76 77 %cdata(void); 78 79 /* Memory move function. Due to multi-argument typemaps this appears to be wrapped as 80 void memmove(void *data, const char *s); */ 81 void memmove(void *data, const void *indata, int inlen); 82