Home | History | Annotate | Download | only in go
      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 %typemap(gotype) SWIGCDATA %{ []byte %}
     15 %typemap(out) SWIGCDATA %{
     16   $result.data = (char*)_swig_goallocate($1.len);
     17   memcpy($result.data, $1.data, $1.len);
     18   $result.len = (int)$1.len;
     19 %}
     20 
     21 /* -----------------------------------------------------------------------------
     22  * %cdata(TYPE [, NAME])
     23  *
     24  * Convert raw C data to a binary string.
     25  * ----------------------------------------------------------------------------- */
     26 
     27 %define %cdata(TYPE,NAME...)
     28 
     29 %insert("header") {
     30 #if #NAME == ""
     31 static SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements) {
     32 #else
     33 static SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements) {
     34 #endif
     35    SWIGCDATA d;
     36    d.data = (char *) ptr;
     37 #if #TYPE != "void"
     38    d.len  = nelements*sizeof(TYPE);
     39 #else
     40    d.len  = nelements;
     41 #endif
     42    return d;
     43 }
     44 }
     45 
     46 %typemap(default) int nelements "$1 = 1;"
     47 
     48 #if #NAME == ""
     49 SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements);
     50 #else
     51 SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements);
     52 #endif
     53 %enddef
     54 
     55 %typemap(default) int nelements;
     56 
     57 %rename(cdata) ::cdata_void(void *ptr, int nelements);
     58 
     59 %cdata(void);
     60 
     61 /* Memory move function. Due to multi-argument typemaps this appears
     62    to be wrapped as
     63    void memmove(void *data, const char *s); */
     64 void memmove(void *data, char *indata, int inlen);
     65