From 34221f223aef65896eb0e631a0fd2f608d98fa4e Mon Sep 17 00:00:00 2001 From: Erez Geva Date: Sat, 21 May 2022 20:47:50 +0200 Subject: [PATCH] Add Octave argcargv.i Signed-off-by: Erez Geva --- Examples/test-suite/argcargvtest.i | 2 +- Lib/octave/argcargv.i | 33 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 Lib/octave/argcargv.i diff --git a/Examples/test-suite/argcargvtest.i b/Examples/test-suite/argcargvtest.i index d87ce6871..3ba79d860 100644 --- a/Examples/test-suite/argcargvtest.i +++ b/Examples/test-suite/argcargvtest.i @@ -1,6 +1,6 @@ %module argcargvtest -#if !defined(SWIGCSHARP) && !defined(SWIGD) && !defined(SWIGGO) && !defined(SWIGGUILE) && !defined(SWIGJAVA) && !defined(SWIGJAVASCRIPT) && !defined(SWIGMZSCHEME) && !defined(SWIGOCTAVE) && !defined(SWIGR) && !defined(SWIGSCILAB) +#if !defined(SWIGCSHARP) && !defined(SWIGD) && !defined(SWIGGO) && !defined(SWIGGUILE) && !defined(SWIGJAVA) && !defined(SWIGJAVASCRIPT) && !defined(SWIGMZSCHEME) && !defined(SWIGR) && !defined(SWIGSCILAB) %include %apply (int ARGC, char **ARGV) { (size_t argc, const char **argv) } diff --git a/Lib/octave/argcargv.i b/Lib/octave/argcargv.i new file mode 100644 index 000000000..3da37a9a5 --- /dev/null +++ b/Lib/octave/argcargv.i @@ -0,0 +1,33 @@ +/* ------------------------------------------------------------ + * 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); + } + $2[i] = (char *)list(i).string_value().c_str(); + } + $2[i] = NULL; +} + +%typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { + const octave_value& ov = $input; + $1 = !ov.is_scalar_type(); +} + +%typemap(freearg) (int ARGC, char **ARGV) { + if ($2 != NULL) { + free((void *)$2); + } +}