WSTester updated to work plus hopefully all the other changes that need to go into...
[jabaws.git] / binaries / src / ViennaRNA / interfaces / tmaps.i
diff --git a/binaries/src/ViennaRNA/interfaces/tmaps.i b/binaries/src/ViennaRNA/interfaces/tmaps.i
new file mode 100644 (file)
index 0000000..7a77acd
--- /dev/null
@@ -0,0 +1,87 @@
+// Perl typemaps
+ #ifdef SWIGPERL5
+// convert between perl and C file handle
+%typemap(in) FILE * {
+  if (SvOK($input)) /* check for undef */
+       $1 = PerlIO_findFILE(IoIFP(sv_2io($input)));
+  else  $1 = NULL;
+}
+
+// This tells SWIG to treat char ** as a special case
+%typemap(in) char ** {
+        AV *tempav;
+        I32 len;
+        int i;
+        SV  **tv;
+        if (!SvROK($input))
+            croak("Argument $argnum is not a reference.");
+        if (SvTYPE(SvRV($input)) != SVt_PVAV)
+            croak("Argument $argnum is not an array.");
+        tempav = (AV*)SvRV($input);
+        len = av_len(tempav);
+        $1 = (char **) malloc((len+2)*sizeof(char *));
+        for (i = 0; i <= len; i++) {
+            tv = av_fetch(tempav, i, 0);
+            $1[i] = (char *) SvPV(*tv,PL_na);
+        }
+        $1[i] = NULL;
+};
+
+
+// Creates a new Perl array and places a NULL-terminated char ** into it
+%typemap(out) char ** {
+        AV *myav;
+        SV **svs;
+        int i = 0,len = 0;
+        /* Figure out how many elements we have */
+        while ($1[len])
+           len++;
+        svs = (SV **) malloc(len*sizeof(SV *));
+        for (i = 0; i < len ; i++) {
+            svs[i] = sv_newmortal();
+            sv_setpv((SV*)svs[i],$1[i]);
+        };
+        myav =  av_make(len,svs);
+        free(svs);
+        $result = newRV((SV*)myav);
+        sv_2mortal($result);
+        argvi++;
+}
+
+#endif
+
+// Typemaps that are independent of scripting language
+
+// This cleans up the char ** array after the function call
+%typemap(freearg) char ** {
+         free($1);
+}
+// Now a few test functions
+//%inline %{
+//int print_args(char **argv) {
+//    int i = 0;
+//    while (argv[i]) {
+//         printf("argv[%d] = %s\n", i,argv[i]);
+//         i++;
+//    }
+//    return i;
+//}
+
+// Returns a char ** list
+//char **get_args() {
+//    static char *values[] = {"Dave","Mike","Susan","John","Michelle",0};
+//    return &values[0];
+//}
+//%}
+
+
+
+// Python typemaps
+#ifdef SWIGPYTHON
+// convert between python and C file handle
+%typemap(in) FILE * {
+  if (PyFile_Check($input)) /* check for undef */
+        $1 = PyFile_AsFile($input);
+  else  $1 = NULL;
+}
+#endif