diff options
Diffstat (limited to 'Lib/csharp/argcargv.i')
-rw-r--r-- | Lib/csharp/argcargv.i | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/Lib/csharp/argcargv.i b/Lib/csharp/argcargv.i new file mode 100644 index 000000000..2dae1f6dc --- /dev/null +++ b/Lib/csharp/argcargv.i @@ -0,0 +1,76 @@ +/* ------------------------------------------------------------- + * SWIG library containing argc and argv multi-argument typemaps + * ------------------------------------------------------------- */ + +%typemap(cstype) (int ARGC, char **ARGV) "string[]" +%typemap(imtype) (int ARGC, char **ARGV) "global::System.IntPtr" +%typemap(ctype) (int ARGC, char **ARGV) "void*" +%typemap(csin) (int ARGC, char **ARGV) "$modulePINVOKE.SWIG_csharp_string_array_to_c($csinput.Length, $csinput)" +%pragma(csharp) imclasscode=%{ + [global::System.Runtime.InteropServices.DllImport("$module", EntryPoint="SWIG_csharp_string_array_to_c")] + public static extern global::System.IntPtr SWIG_csharp_string_array_to_c(int len, [global::System.Runtime.InteropServices.In,global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray, ArraySubType=global::System.Runtime.InteropServices.UnmanagedType.LPStr, SizeParamIndex=0)] string[] array); +%} +%fragment("SWIG_csharp_string_array", "header") %{ +#ifdef __cplusplus +extern "C" { +#endif +typedef struct { int len; char* array[1]; } SWIG_csharp_string_array; + +static void* SWIG_csharp_string_array_free(SWIG_csharp_string_array *arr) { + if (arr != SWIG_NULLPTR) { + int i; + for(i = 0; i < arr->len; i++) { + free(arr->array[i]); + } + free(arr); + } + return SWIG_NULLPTR; +} + +SWIGEXPORT void* SWIGSTDCALL SWIG_csharp_string_array_to_c(int len, void *array) { + int i; + size_t alen, slen; + char *p, **ptr; + SWIG_csharp_string_array *ret; + /* We don't need to add one to len for the terminating NULL here because + * SWIG_csharp_string_array includes one element already. + */ + alen = sizeof(SWIG_csharp_string_array) + sizeof(char *) * len; + ret = (SWIG_csharp_string_array *)malloc(alen); + if (ret == SWIG_NULLPTR) { + SWIG_CSharpSetPendingException(SWIG_CSharpOutOfMemoryException, "fail to duplicate array."); + return SWIG_NULLPTR; + } + memset(ret, 0, alen); + ret->len = len; + ptr = (char **)array; + for(i = 0; i < len; i++) { + slen = strlen(ptr[i]) + 1; + p = (char*)malloc(slen); + if (p == SWIG_NULLPTR) { + SWIG_CSharpSetPendingException(SWIG_CSharpOutOfMemoryException, "fail to alloc a string."); + return SWIG_csharp_string_array_free(ret); + } + memcpy(p, ptr[i], slen); + ret->array[i] = p; + } + ret->array[i] = SWIG_NULLPTR; + return ret; +} + +#ifdef __cplusplus +} +#endif +%} + +%typemap(in, canthrow=1, fragment="SWIG_csharp_string_array") (int ARGC, char **ARGV) %{ + SWIG_csharp_string_array *arr = (SWIG_csharp_string_array*)$input; + if (arr != SWIG_NULLPTR) { + $1 = ($1_ltype)arr->len; + $2 = ($2_ltype)arr->array; + } +%} + +%typemap(freearg, fragment="SWIG_csharp_string_array") (int ARGC, char **ARGV) %{ + SWIG_csharp_string_array_free((SWIG_csharp_string_array*)$input); +%} |