/* ------------------------------------------------------------- * SWIG library containing argc and argv multi-argument typemaps * ------------------------------------------------------------- */ %typemap(in) (int ARGC, char **ARGV) { if ($input.is_scalar_type()) { $1 = 0; $2 = NULL; %argument_fail(SWIG_TypeError, "'int ARGC, char **ARGV' is not a list", $symname, $argnum); } octave_value_list list = $input.list_value(); int i, len = list.length(); $1 = ($1_ltype) len; $2 = (char **) malloc((len+1)*sizeof(char *)); for (i = 0; i < len; i++) { if (!list(i).is_string()) { $1 = 0; %argument_fail(SWIG_TypeError, "'int ARGC, char **ARGV' use a non-string", $symname, $argnum); } const std::string & s = list(i).string_value(); size_t slen = s.size() + 1; char * p = (char*)malloc(slen); $2[i] = p; memcpy(p, s.c_str(), slen); } $2[i] = NULL; } %typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { $1 = 0; const octave_value& ov = $input; if (!ov.is_scalar_type()) { octave_value_list list = ov.list_value(); int i, len = list.length(); $1 = 1; for (i = 0; i < len; i++) { if (!list(i).is_string()) { $1 = 0; break; } } } } %typemap(freearg) (int ARGC, char **ARGV) { if ($2 != NULL) { $1_ltype i; for (i = 0; i < $1; i++) { free((void *)$2[i]); } free((void *)$2); } }