diff options
Diffstat (limited to 'Lib/guile/argcargv.i')
-rw-r--r-- | Lib/guile/argcargv.i | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/Lib/guile/argcargv.i b/Lib/guile/argcargv.i new file mode 100644 index 000000000..003be96a7 --- /dev/null +++ b/Lib/guile/argcargv.i @@ -0,0 +1,44 @@ +/* ------------------------------------------------------------- + * SWIG library containing argc and argv multi-argument typemaps + * ------------------------------------------------------------- */ + +%typemap(in) (int ARGC, char **ARGV) { + $1_ltype i, len; + SWIG_contract_assert($input != (SCM)0 && + !scm_is_null($input) && + scm_is_array($input), + "you must pass array of strings"); + len = scm_c_array_length($input); + $1 = len; + $2 = ($2_ltype) malloc((len+1)*sizeof($*2_ltype)); + if ($2 == NULL) { + scm_misc_error(FUNC_NAME, "fail allocating memory for array", SCM_EOL); + } + for (i = 0; i < len; i++) { + SCM args = scm_list_1(scm_from_long(i)); + SCM str = scm_array_ref($input, args); + SWIG_contract_assert(scm_is_string(str), "elements in array must be strings"); + $2[i] = ($*2_ltype)SWIG_scm2str(str); + } + $2[i] = NULL; +} + +%typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { + if ($input != (SCM)0 && !scm_is_null($input) && scm_is_array($input)) { + size_t len = scm_c_array_length($input); + size_t i; + for(i = 0; i < len; i++) { + SCM args = scm_list_1(scm_from_long(i)); + SCM str = scm_array_ref($input, args); + if (!scm_is_string(str)) { + break; + } + } + /* All elements are strings! */ + $1 = (i == len); + } +} + +%typemap(freearg) (int ARGC, char **ARGV) { + free((void *)$2); +} |