12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- /* -----------------------------------------------------------------------------
- * tclwstrings.wg
- *
- * Utility methods for wchar strings
- * ----------------------------------------------------------------------------- */
- %{
- #include <wchar.h>
- %}
- %fragment("SWIG_AsWCharPtrAndSize","header") {
- SWIGINTERN int
- SWIG_AsWCharPtrAndSize(Tcl_Obj *obj, wchar_t** cptr, size_t* psize, int *alloc)
- {
- int len = 0;
- Tcl_UniChar *ustr = Tcl_GetUnicodeFromObj(obj, &len);
- if (ustr) {
- if (cptr) {
- Tcl_Encoding encoding = NULL;
- char *src = (char *) ustr;
- int srcLen = (len)*sizeof(Tcl_UniChar);
- int dstLen = sizeof(wchar_t)*(len + 1);
- char *dst = %new_array(dstLen, char);
- int flags = 0;
- Tcl_EncodingState *statePtr = 0;
- int srcRead = 0;
- int dstWrote = 0;
- int dstChars = 0;
- Tcl_UtfToExternal(0, encoding, src, srcLen, flags, statePtr, dst,
- dstLen, &srcRead, &dstWrote, &dstChars);
-
- if (alloc) *alloc = SWIG_NEWOBJ;
- }
- if (psize) *psize = len + 1;
- return SWIG_OK;
- }
- return SWIG_TypeError;
- }
- }
- %fragment("SWIG_FromWCharPtrAndSize","header") {
- SWIGINTERNINLINE Tcl_Obj *
- SWIG_FromWCharPtrAndSize(const wchar_t* carray, size_t size)
- {
- Tcl_Obj *res = NULL;
- if (size < INT_MAX) {
- Tcl_Encoding encoding = NULL;
- char *src = (char *) carray;
- int srcLen = (int)(size*sizeof(wchar_t));
- int dstLen = (int)(size*sizeof(Tcl_UniChar));
- char *dst = %new_array(dstLen, char);
- int flags = 0;
- Tcl_EncodingState *statePtr = 0;
- int srcRead = 0;
- int dstWrote = 0;
- int dstChars = 0;
-
- Tcl_ExternalToUtf(0, encoding, src, srcLen, flags, statePtr, dst,
- dstLen, &srcRead, &dstWrote, &dstChars);
-
- res = Tcl_NewUnicodeObj((Tcl_UniChar*)dst, (int)size);
- %delete_array(dst);
- }
- return res;
- }
- }
|