Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | |
2 | /* ------------------------------------------------------------ | |
3 | * utility methods for char strings | |
4 | * ------------------------------------------------------------ */ | |
5 | ||
6 | %types(char *); | |
7 | %fragment("SWIG_AsCharPtrAndSize","header") { | |
8 | /* returns SWIG_OLDOBJ if the input is a raw char*, SWIG_PYSTR if is a PyString */ | |
9 | SWIGINTERN int | |
10 | SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize) | |
11 | { | |
12 | static swig_type_info* pchar_info = 0; | |
13 | char* vptr = 0; | |
14 | if (!pchar_info) pchar_info = SWIG_TypeQuery("char *"); | |
15 | if (SWIG_ConvertPtr(obj, (void**)&vptr, pchar_info, 0) != -1) { | |
16 | if (cptr) *cptr = vptr; | |
17 | if (psize) *psize = vptr ? (strlen(vptr) + 1) : 0; | |
18 | return SWIG_OLDOBJ; | |
19 | } else { | |
20 | PyErr_Clear(); | |
21 | if (PyString_Check(obj)) { | |
22 | if (cptr) { | |
23 | *cptr = PyString_AS_STRING(obj); | |
24 | if (psize) { | |
25 | *psize = PyString_GET_SIZE(obj) + 1; | |
26 | } | |
27 | } | |
28 | return SWIG_PYSTR; | |
29 | } | |
30 | } | |
31 | if (cptr) { | |
32 | SWIG_type_error("char *", obj); | |
33 | } | |
34 | return 0; | |
35 | } | |
36 | } | |
37 | ||
38 | %fragment("SWIG_AsCharPtr","header", | |
39 | fragment="SWIG_AsCharPtrAndSize") { | |
40 | SWIGINTERNINLINE int | |
41 | SWIG_AsCharPtr(PyObject *obj, char **val) | |
42 | { | |
43 | if (SWIG_AsCharPtrAndSize(obj, val, (size_t*)(0))) { | |
44 | return 1; | |
45 | } | |
46 | if (val) { | |
47 | PyErr_Clear(); | |
48 | SWIG_type_error("char *", obj); | |
49 | } | |
50 | return 0; | |
51 | } | |
52 | } | |
53 | ||
54 | %fragment("SWIG_FromCharPtr","header") { | |
55 | SWIGINTERN PyObject * | |
56 | SWIG_FromCharPtr(const char* cptr) | |
57 | { | |
58 | if (cptr) { | |
59 | size_t size = strlen(cptr); | |
60 | if (size > INT_MAX) { | |
61 | return SWIG_NewPointerObj(SWIG_const_cast(cptr,char*), | |
62 | SWIG_TypeQuery("char *"), 0); | |
63 | } else { | |
64 | if (size != 0) { | |
65 | return PyString_FromStringAndSize(cptr, size); | |
66 | } else { | |
67 | return PyString_FromString(cptr); | |
68 | } | |
69 | } | |
70 | } | |
71 | Py_INCREF(Py_None); | |
72 | return Py_None; | |
73 | } | |
74 | } | |
75 | ||
76 | %fragment("SWIG_AsNewCharPtr","header", | |
77 | fragment="SWIG_AsCharPtrAndSize") { | |
78 | SWIGINTERN int | |
79 | SWIG_AsNewCharPtr(PyObject *obj, char **val) | |
80 | { | |
81 | char* cptr = 0; size_t csize = 0; | |
82 | int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize); | |
83 | if (res) { | |
84 | if (val) { | |
85 | if (csize) { | |
86 | *val = SWIG_new_array(csize, char); | |
87 | memcpy(*val, cptr, --csize); | |
88 | (*val)[csize] = 0; | |
89 | } else if (cptr) { | |
90 | *val = SWIG_new_array(1, char); | |
91 | (*val)[0] = 0; | |
92 | } else { | |
93 | *val = 0; | |
94 | } | |
95 | } | |
96 | return SWIG_NEWOBJ; | |
97 | } | |
98 | if (val) { | |
99 | SWIG_type_error("char *", obj); | |
100 | } | |
101 | return 0; | |
102 | } | |
103 | } | |
104 | ||
105 | %fragment("SWIG_AsCharArray","header", | |
106 | fragment="SWIG_AsCharPtrAndSize") { | |
107 | SWIGINTERN int | |
108 | SWIG_AsCharArray(PyObject *obj, char *val, size_t size) | |
109 | { | |
110 | char* cptr; size_t csize; | |
111 | if (SWIG_AsCharPtrAndSize(obj, &cptr, &csize)) { | |
112 | /* in C you can do: | |
113 | ||
114 | char x[5] = "hello"; | |
115 | ||
116 | ie, assing the array using an extra '0' char. | |
117 | */ | |
118 | if ((csize == size + 1) && !(cptr[csize-1])) --csize; | |
119 | if (csize <= size) { | |
120 | if (val) { | |
121 | if (csize) memcpy(val, cptr, csize); | |
122 | if (csize < size) memset(val + csize, 0, size - csize); | |
123 | } | |
124 | return 1; | |
125 | } | |
126 | } | |
127 | if (val) { | |
128 | PyErr_Format(PyExc_TypeError, | |
129 | "a char array of maximum size %lu is expected", | |
130 | (unsigned long) size); | |
131 | } | |
132 | return 0; | |
133 | } | |
134 | } | |
135 | ||
136 | %fragment("SWIG_FromCharArray","header") { | |
137 | SWIGINTERNINLINE PyObject * | |
138 | SWIG_FromCharArray(const char* carray, size_t size) | |
139 | { | |
140 | if (size > INT_MAX) { | |
141 | return SWIG_NewPointerObj(SWIG_const_cast(carray,char *), | |
142 | SWIG_TypeQuery("char *"), 0); | |
143 | } else { | |
144 | return PyString_FromStringAndSize(carray, SWIG_numeric_cast(size,int)); | |
145 | } | |
146 | } | |
147 | } | |
148 | ||
149 | /* ------------------------------------------------------------ | |
150 | * The plain char * handling | |
151 | * ------------------------------------------------------------ */ | |
152 | ||
153 | %typemap_pystring(char, | |
154 | SWIG_AsCharPtr, | |
155 | SWIG_AsCharPtrAndSize, | |
156 | SWIG_FromCharPtr, | |
157 | SWIG_AsNewCharPtr, | |
158 | SWIG_AsCharArray, | |
159 | SWIG_FromCharArray) |