diff options
Diffstat (limited to 'share/swig/2.0.11/guile/ports.i')
-rw-r--r-- | share/swig/2.0.11/guile/ports.i | 50 |
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); + } +} + |