diff options
Diffstat (limited to 'Lib/javascript/jsc/argcargv.i')
-rw-r--r-- | Lib/javascript/jsc/argcargv.i | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/Lib/javascript/jsc/argcargv.i b/Lib/javascript/jsc/argcargv.i new file mode 100644 index 000000000..dacecb085 --- /dev/null +++ b/Lib/javascript/jsc/argcargv.i @@ -0,0 +1,67 @@ +/* ------------------------------------------------------------ + * SWIG library containing argc and argv multi-argument typemaps + * ------------------------------------------------------------ */ + +%{ +SWIGINTERN int SWIG_AsVal_string SWIG_JSC_AS_DECL_ARGS(JSValueRef obj, JSStringRef* str) +{ + if (!JSValueIsString SWIG_JSC_FROM_CALL_ARGS(obj)) { + return SWIG_TypeError; + } + if(str != SWIG_NULLPTR) { + *str = JSValueToStringCopy SWIG_JSC_AS_CALL_ARGS(obj, SWIG_NULLPTR); + } + return SWIG_OK; +} +%} + +%typemap(in) (int ARGC, char **ARGV) { + int i, len; + size_t arraysize; + JSObjectRef array; + if (!JSValueIsArray SWIG_JSC_FROM_CALL_ARGS($input)) { + SWIG_exception_fail(SWIG_ERROR, "not array"); + } + array = JSValueToObject SWIG_JSC_AS_CALL_ARGS($input, SWIG_NULLPTR); + len = SWIGJSC_ArrayLength SWIG_JSC_FROM_CALL_ARGS(array); + arraysize = (len+1)*sizeof($*2_ltype); + $1 = len; + $2 = ($2_ltype) malloc(arraysize); + if ($2 == SWIG_NULLPTR) { + SWIG_exception_fail(SWIG_ERROR, "memory allocation of array failed"); + } + memset($2, 0, arraysize); + for (i = 0; i < len; i++) { + int res, slen; + $*2_ltype pstr; + JSStringRef str; + JSValueRef jsvalue = JSObjectGetPropertyAtIndex(context, array, i, SWIG_NULLPTR); + res = SWIG_AsVal_string SWIG_JSC_AS_CALL_ARGS(jsvalue, &str); + if (!SWIG_IsOK(res)) { + SWIG_exception_fail(SWIG_ERROR, "failed to convert to string"); + } + slen = JSStringGetMaximumUTF8CStringSize(str); + pstr = ($*2_ltype) malloc(slen); + if (pstr == SWIG_NULLPTR) { + SWIG_exception_fail(SWIG_ERROR, "memory allocation of a string failed"); + } + if (slen) { + res = JSStringGetUTF8CString(str, pstr, slen); + if (res > slen) { + SWIG_exception_fail(SWIG_ERROR, "wrong string length"); + } + } + $2[i] = pstr; + } + $2[i] = SWIG_NULLPTR; +} + +%typemap(freearg) (int ARGC, char **ARGV) { + if ($2 != SWIG_NULLPTR) { + $1_ltype i; + for (i = 0; i < $1; i++) { + free((void *)$2[i]); + } + free((void *)$2); + } +} |