aboutsummaryrefslogtreecommitdiff
path: root/Lib/csharp/argcargv.i
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/csharp/argcargv.i')
-rw-r--r--Lib/csharp/argcargv.i76
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);
+%}