1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
/* -----------------------------------------------------------------------------
* 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;
}
}
|