You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.5 KiB
56 lines
1.5 KiB
/* ----------------------------------------------------------------------------- |
|
* 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); |
|
} |
|
|
|
|