Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | |
2 | /* ------------------------------------------------------------ | |
3 | * utility methods for wchar_t strings | |
4 | * ------------------------------------------------------------ */ | |
5 | ||
6 | %fragment("SWIG_AsWCharPtrAndSize","header") { | |
7 | SWIGINTERN int | |
8 | SWIG_AsWCharPtrAndSize(PyObject *obj, wchar_t **cptr, size_t *psize) | |
9 | { | |
10 | static swig_type_info* pwchar_info = 0; | |
11 | wchar_t * vptr = 0; | |
12 | if (!pwchar_info) pwchar_info = SWIG_TypeQuery("wchar_t *"); | |
13 | if (SWIG_ConvertPtr(obj, (void**)&vptr, pwchar_info, 0) != -1) { | |
14 | if (cptr) *cptr = vptr; | |
15 | if (psize) *psize = vptr ? (wcslen(vptr) + 1) : 0; | |
16 | return SWIG_OLDOBJ; | |
17 | } else { | |
18 | int isunicode = PyUnicode_Check(obj); | |
19 | if (isunicode || PyString_Check(obj)) { | |
20 | if (cptr) { | |
21 | int size = isunicode ? PyUnicode_GetSize(obj) : PyString_Size(obj); | |
22 | wchar_t *nptr = SWIG_new_array(size + 1, wchar_t); | |
23 | PyUnicodeObject *uni = (PyUnicodeObject *)PyUnicode_FromObject(obj); | |
24 | PyUnicode_AsWideChar(uni, nptr, size); | |
25 | nptr[size] = 0; | |
26 | *cptr = nptr; | |
27 | if (psize) { | |
28 | *psize = (size_t) size + 1; | |
29 | } | |
30 | Py_DECREF(uni); | |
31 | } | |
32 | return SWIG_NEWOBJ; | |
33 | } | |
34 | } | |
35 | if (cptr) { | |
36 | SWIG_type_error("wchar_t *", obj); | |
37 | } | |
38 | return 0; | |
39 | } | |
40 | } | |
41 | ||
42 | %fragment("SWIG_AsWCharPtr","header", | |
43 | fragment="SWIG_AsWCharPtrAndSize") { | |
44 | SWIGINTERN int | |
45 | SWIG_AsWCharPtr(PyObject *obj, wchar_t **val) | |
46 | { | |
47 | if (SWIG_AsWCharPtrAndSize(obj, val, (size_t*)(0))) { | |
48 | return 1; | |
49 | } | |
50 | if (val) { | |
51 | PyErr_Clear(); | |
52 | SWIG_type_error("wchar_t *", obj); | |
53 | } | |
54 | return 0; | |
55 | } | |
56 | } | |
57 | ||
58 | %fragment("SWIG_FromWCharPtr","header") { | |
59 | SWIGINTERN PyObject * | |
60 | SWIG_FromWCharPtr(const wchar_t * cptr) | |
61 | { | |
62 | if (cptr) { | |
63 | size_t size = wcslen(cptr); | |
64 | if (size > INT_MAX) { | |
65 | return SWIG_NewPointerObj(SWIG_const_cast(cptr,wchar_t *), | |
66 | SWIG_TypeQuery("wchar_t *"), 0); | |
67 | } else { | |
68 | return PyUnicode_FromWideChar(cptr, size); | |
69 | } | |
70 | } | |
71 | Py_INCREF(Py_None); | |
72 | return Py_None; | |
73 | } | |
74 | } | |
75 | ||
76 | %fragment("SWIG_AsNewWCharPtr","header", | |
77 | fragment="SWIG_AsWCharPtrAndSize") { | |
78 | SWIGINTERN int | |
79 | SWIG_AsNewWCharPtr(PyObject *obj, wchar_t **val) | |
80 | { | |
81 | wchar_t * cptr = 0; size_t csize = 0; | |
82 | int res = SWIG_AsWCharPtrAndSize(obj, &cptr, &csize); | |
83 | if (res) { | |
84 | if (val) { | |
85 | if (csize) { | |
86 | *val = SWIG_new_array(csize, wchar_t); | |
87 | memcpy(*val, cptr, (--csize)*sizeof(wchar_t)); | |
88 | (*val)[csize] = 0; | |
89 | } else if (cptr) { | |
90 | *val = SWIG_new_array(1, wchar_t); | |
91 | (*val)[0] = 0; | |
92 | } else { | |
93 | *val = 0; | |
94 | } | |
95 | } | |
96 | return SWIG_NEWOBJ; | |
97 | } | |
98 | if (val) { | |
99 | SWIG_type_error("wchar_t *", obj); | |
100 | } | |
101 | return 0; | |
102 | } | |
103 | } | |
104 | ||
105 | %fragment("SWIG_AsWCharArray","header", | |
106 | fragment="SWIG_AsWCharPtrAndSize") { | |
107 | SWIGINTERN int | |
108 | SWIG_AsWCharArray(PyObject *obj, wchar_t *val, size_t size) | |
109 | { | |
110 | wchar_t * cptr; size_t csize; | |
111 | if (SWIG_AsWCharPtrAndSize(obj, &cptr, &csize)) { | |
112 | if ((csize == size + 1) && !(cptr[csize-1])) --csize; | |
113 | if (csize <= size) { | |
114 | if (val) { | |
115 | if (csize) memcpy(val, cptr, csize*sizeof(wchar_t)); | |
116 | if (csize < size) memset(val+csize, 0, (size-csize)*sizeof(wchar_t)); | |
117 | } | |
118 | return 1; | |
119 | } | |
120 | } | |
121 | if (val) { | |
122 | PyErr_Format(PyExc_ValueError, | |
123 | "a wchar_t array of maximum size %lu is expected", | |
124 | (unsigned long) size); | |
125 | } | |
126 | return 0; | |
127 | } | |
128 | } | |
129 | ||
130 | %fragment("SWIG_FromWCharArray","header") { | |
131 | SWIGINTERNINLINE PyObject * | |
132 | SWIG_FromWCharArray(const wchar_t * carray, size_t size) | |
133 | { | |
134 | if (size > INT_MAX) { | |
135 | return SWIG_NewPointerObj(SWIG_const_cast(carray,wchar_t *), | |
136 | SWIG_TypeQuery("wchar_t *"), 0); | |
137 | } else { | |
138 | return PyUnicode_FromWideChar(carray, SWIG_numeric_cast(size,int)); | |
139 | } | |
140 | } | |
141 | } | |
142 | ||
143 | /* ------------------------------------------------------------ | |
144 | * The plain wchar_t * handling | |
145 | * ------------------------------------------------------------ */ | |
146 | ||
147 | %typemap_pystring(wchar_t, | |
148 | SWIG_AsWCharPtr, | |
149 | SWIG_AsWCharPtrAndSize, | |
150 | SWIG_FromWCharPtr, | |
151 | SWIG_AsNewWCharPtr, | |
152 | SWIG_AsWCharArray, | |
153 | SWIG_FromWCharArray); | |
154 |