summaryrefslogtreecommitdiff
path: root/devtools/swigwin-1.3.34/Lib/guile/ports.i
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/swigwin-1.3.34/Lib/guile/ports.i')
-rw-r--r--devtools/swigwin-1.3.34/Lib/guile/ports.i56
1 files changed, 56 insertions, 0 deletions
diff --git a/devtools/swigwin-1.3.34/Lib/guile/ports.i b/devtools/swigwin-1.3.34/Lib/guile/ports.i
new file mode 100644
index 0000000..0d0e142
--- /dev/null
+++ b/devtools/swigwin-1.3.34/Lib/guile/ports.i
@@ -0,0 +1,56 @@
+/* -----------------------------------------------------------------------------
+ * See the LICENSE file for information on copyright, usage and redistribution
+ * of SWIG, and the README file for authors - http://www.swig.org/release.html.
+ *
+ * ports.i
+ *
+ * Guile typemaps for handling ports
+ * ----------------------------------------------------------------------------- */
+
+%{
+ #ifndef _POSIX_SOURCE
+ /* This is needed on Solaris for fdopen(). */
+ # define _POSIX_SOURCE 199506L
+ #endif
+ #include <stdio.h>
+ #include <errno.h>
+ #include <unistd.h>
+%}
+
+/* This typemap for FILE * accepts
+ (1) FILE * pointer objects,
+ (2) Scheme file ports. In this case, it creates a temporary C stream
+ which reads or writes from a dup'ed file descriptor.
+ */
+
+%typemap(in, doc="$NAME is a file port or a FILE * pointer") FILE *
+ ( int closep )
+{
+ if (SWIG_ConvertPtr($input, (void**) &($1), $1_descriptor, 0) == 0) {
+ closep = 0;
+ }
+ else if(!(SCM_FPORTP($input)))
+ scm_wrong_type_arg("$name", $argnum, $input);
+ else {
+ int fd;
+ if (SCM_OUTPUT_PORT_P($input))
+ scm_force_output($input);
+ fd=dup(SCM_FPORT_FDES($input));
+ if(fd==-1)
+ scm_misc_error("$name", strerror(errno), SCM_EOL);
+ $1=fdopen(fd,
+ SCM_OUTPUT_PORT_P($input)
+ ? (SCM_INPUT_PORT_P($input)
+ ? "r+" : "w")
+ : "r");
+ if($1==NULL)
+ scm_misc_error("$name", strerror(errno), SCM_EOL);
+ closep = 1;
+ }
+}
+
+%typemap(freearg) FILE* {
+ if (closep$argnum)
+ fclose($1);
+}
+