You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.0 KiB
71 lines
2.0 KiB
5 years ago
|
/* -----------------------------------------------------------------------------
|
||
|
* See the LICENSE file for information on copyright, usage and redistribution
|
||
|
* of SWIG, and the README file for authors - http://www.swig.org/release.html.
|
||
|
*
|
||
|
* 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;
|
||
|
}
|
||
|
}
|
||
|
|