blob: 0d0e142e17d8b8ff93df00649d8ecbd5a2fc89aa [file] [log] [blame]
/* -----------------------------------------------------------------------------
* 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);
}