aboutsummaryrefslogtreecommitdiff
path: root/Lib/r/argcargv.i
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/r/argcargv.i')
-rw-r--r--Lib/r/argcargv.i38
1 files changed, 38 insertions, 0 deletions
diff --git a/Lib/r/argcargv.i b/Lib/r/argcargv.i
new file mode 100644
index 000000000..1753f6e3f
--- /dev/null
+++ b/Lib/r/argcargv.i
@@ -0,0 +1,38 @@
+/* -------------------------------------------------------------
+ * SWIG library containing argc and argv multi-argument typemaps
+ * ------------------------------------------------------------- */
+
+/* Preserve string vector as is */
+%typemap(scoercein) (int ARGC, char **ARGV) ""
+/* Verify we pass the proper string vector */
+%typemap(scheck) (int ARGC, char **ARGV) %{
+ assert(is.null($input) || (is.vector($input) && is.character($input)))
+%}
+/* Check argument is null or a string vector for dispatcher */
+%typemap(rtypecheck) (int ARGC, char **ARGV) %{
+ is.null($arg) || (is.vector($arg) && is.character($arg))
+%}
+%typemap(in) (int ARGC, char **ARGV) {
+ $1_ltype i;
+ SEXP *pstr;
+ if ($input == R_NilValue) {
+ /* Empty array */
+ $1 = 0;
+ } else if (!Rf_isVectorAtomic($input) || TYPEOF($input) != STRSXP) {
+ SWIG_exception_fail(SWIG_RuntimeError, "Wrong array type.");
+ } else {
+ $1 = Rf_length($input);
+ pstr = CHARACTER_POINTER($input);
+ }
+ $2 = ($2_ltype) malloc(($1+1)*sizeof($*2_ltype));
+ if ($2 == SWIG_NULLPTR) {
+ SWIG_exception_fail(SWIG_MemoryError, "Memory allocation failed.");
+ }
+ for (i = 0; i < $1; i++) {
+ $2[i] = ($*2_ltype)STRING_VALUE(pstr[i]);
+ }
+ $2[i] = SWIG_NULLPTR;
+}
+%typemap(freearg,noblock=1) (int ARGC, char **ARGV) {
+ free((void *)$2);
+}