mirror of https://github.com/swig/swig
77 lines
2.7 KiB
OpenEdge ABL
77 lines
2.7 KiB
OpenEdge ABL
/* -------------------------------------------------------------
|
|
* 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);
|
|
%}
|