Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | /* ----------------------------------------------------------------------------- |
2 | * cdata.i | |
3 | * | |
4 | * Author(s): David Beazley (beazley@cs.uchicago.edu) | |
5 | * | |
6 | * This library file contains macros for manipulating raw C data as strings. | |
7 | * | |
8 | * $Header: /cvsroot/swig/SWIG/Lib/cdata.i,v 1.6 2005/04/05 17:48:30 wuzzeb Exp $ | |
9 | * ----------------------------------------------------------------------------- */ | |
10 | ||
11 | %{ | |
12 | typedef struct SWIGCDATA { | |
13 | char *data; | |
14 | int len; | |
15 | } SWIGCDATA; | |
16 | %} | |
17 | ||
18 | /* ----------------------------------------------------------------------------- | |
19 | * Typemaps for returning binary data | |
20 | * ----------------------------------------------------------------------------- */ | |
21 | ||
22 | #if SWIGPYTHON | |
23 | %typemap(out) SWIGCDATA { | |
24 | $result = PyString_FromStringAndSize($1.data,$1.len); | |
25 | } | |
26 | %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); | |
27 | #elif SWIGPERL | |
28 | %typemap(out) SWIGCDATA { | |
29 | ST(argvi) = sv_newmortal(); | |
30 | sv_setpvn((SV*)ST(argvi++),$1.data,$1.len); | |
31 | } | |
32 | %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); | |
33 | #elif SWIGTCL | |
34 | %typemap(out) SWIGCDATA { | |
35 | Tcl_SetObjResult(interp,Tcl_NewStringObj($1.data,$1.len)); | |
36 | } | |
37 | %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); | |
38 | #elif SWIGRUBY | |
39 | %typemap(out) SWIGCDATA { | |
40 | $result = rb_str_new($1.data,$1.len); | |
41 | } | |
42 | %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); | |
43 | #elif SWIGGUILE | |
44 | %typemap(out) SWIGCDATA { | |
45 | $result = gh_str2scm($1.data,$1.len); | |
46 | } | |
47 | %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); | |
48 | #elif SWIGCHICKEN | |
49 | %typemap(out) SWIGCDATA { | |
50 | C_word *string_space = C_alloc(C_SIZEOF_STRING($1.len)); | |
51 | $result = C_string(&string_space, $1.len, $1.data); | |
52 | } | |
53 | %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); | |
54 | #else | |
55 | %echo "cdata.i module not supported." | |
56 | #endif | |
57 | ||
58 | ||
59 | /* ----------------------------------------------------------------------------- | |
60 | * %cdata(TYPE [, NAME]) | |
61 | * | |
62 | * Convert raw C data to a binary string. | |
63 | * ----------------------------------------------------------------------------- */ | |
64 | ||
65 | %define %cdata(TYPE,NAME...) | |
66 | ||
67 | %insert("header") { | |
68 | #if #NAME == "" | |
69 | static SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements) { | |
70 | #else | |
71 | static SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements) { | |
72 | #endif | |
73 | SWIGCDATA d; | |
74 | d.data = (char *) ptr; | |
75 | #if #TYPE != "void" | |
76 | d.len = nelements*sizeof(TYPE); | |
77 | #else | |
78 | d.len = nelements; | |
79 | #endif | |
80 | return d; | |
81 | } | |
82 | } | |
83 | ||
84 | %typemap(default) int nelements "$1 = 1;" | |
85 | ||
86 | #if #NAME == "" | |
87 | SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements); | |
88 | #else | |
89 | SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements); | |
90 | #endif | |
91 | %enddef | |
92 | ||
93 | %typemap(default) int nelements; | |
94 | ||
95 | %rename(cdata) ::cdata_void(void *ptr, int nelements); | |
96 | ||
97 | %cdata(void); | |
98 | ||
99 | /* Memory move function */ | |
100 | void memmove(void *data, const void *indata, int inlen); | |
101 | ||
102 | ||
103 | ||
104 |