diff options
Diffstat (limited to 'devtools/swigwin-1.3.34/Lib/guile/ports.i')
| -rw-r--r-- | devtools/swigwin-1.3.34/Lib/guile/ports.i | 56 |
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); +} + |