aboutsummaryrefslogtreecommitdiff
path: root/Lib/guile/argcargv.i
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/guile/argcargv.i')
-rw-r--r--Lib/guile/argcargv.i44
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);
+}