/* -------------------------------------------------------------
 * 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) {
    int i;
    for(i = 0; i < arr->len; i++) {
      free(arr->array[i]);
    }
    free(arr);
  }
  return NULL;
}

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 == NULL) {
    SWIG_CSharpSetPendingException(SWIG_CSharpOutOfMemoryException, "fail to duplicate array.");
    return NULL;
  }
  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 == NULL) {
      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] = NULL;
  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) {
    $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);
%}
