summaryrefslogtreecommitdiff
path: root/share/swig/2.0.11/guile/ports.i
diff options
context:
space:
mode:
Diffstat (limited to 'share/swig/2.0.11/guile/ports.i')
-rw-r--r--share/swig/2.0.11/guile/ports.i50
1 files changed, 50 insertions, 0 deletions
diff --git a/share/swig/2.0.11/guile/ports.i b/share/swig/2.0.11/guile/ports.i
new file mode 100644
index 0000000..7691d3e
--- /dev/null
+++ b/share/swig/2.0.11/guile/ports.i
@@ -0,0 +1,50 @@
+/* -----------------------------------------------------------------------------
+ * 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 *
+{
+ if (SWIG_ConvertPtr($input, (void**) &($1), $1_descriptor, 0) != 0) {
+ if (!(SCM_FPORTP($input))) {
+ scm_wrong_type_arg("$symname", $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("$symname", 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("$symname", strerror(errno), SCM_EOL);
+ }
+ }
+ }
+}
+
+%typemap(freearg) FILE* {
+ if ($1) {
+ fclose($1);
+ }
+}
+