summaryrefslogtreecommitdiff
path: root/devtools/swigwin-1.3.34/Lib/tcl/tclwstrings.swg
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/swigwin-1.3.34/Lib/tcl/tclwstrings.swg')
-rw-r--r--devtools/swigwin-1.3.34/Lib/tcl/tclwstrings.swg70
1 files changed, 70 insertions, 0 deletions
diff --git a/devtools/swigwin-1.3.34/Lib/tcl/tclwstrings.swg b/devtools/swigwin-1.3.34/Lib/tcl/tclwstrings.swg
new file mode 100644
index 0000000..2d344c2
--- /dev/null
+++ b/devtools/swigwin-1.3.34/Lib/tcl/tclwstrings.swg
@@ -0,0 +1,70 @@
+/* -----------------------------------------------------------------------------
+ * 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;
+}
+}
+