summaryrefslogtreecommitdiff
path: root/share/swig/2.0.11/tcl/tclwstrings.swg
diff options
context:
space:
mode:
authorVince Harron <vharron@google.com>2015-06-07 21:43:05 -0700
committerVince Harron <vharron@google.com>2015-06-08 08:33:11 -0700
commit330b6544424d02bcdf29653dd889d524d2e6f7d2 (patch)
tree4c40fd53e5c12fcc83aeaa06f27fa606bcfe3d3c /share/swig/2.0.11/tcl/tclwstrings.swg
parent7b7c39b73762eb3aa12d79a3893e156fd801468e (diff)
downloadwindows-x86-330b6544424d02bcdf29653dd889d524d2e6f7d2.tar.gz
Diffstat (limited to 'share/swig/2.0.11/tcl/tclwstrings.swg')
-rw-r--r--share/swig/2.0.11/tcl/tclwstrings.swg67
1 files changed, 67 insertions, 0 deletions
diff --git a/share/swig/2.0.11/tcl/tclwstrings.swg b/share/swig/2.0.11/tcl/tclwstrings.swg
new file mode 100644
index 0000000..b3b682e
--- /dev/null
+++ b/share/swig/2.0.11/tcl/tclwstrings.swg
@@ -0,0 +1,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;
+}
+}
+