/* ----------------------------------------------------------------------------- * 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 #include #include %} /* 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); }