[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Chicken-users] Binding FILE* to port
From: |
Graham Fawcett |
Subject: |
Re: [Chicken-users] Binding FILE* to port |
Date: |
Fri, 16 Feb 2007 11:48:29 -0500 |
On 2/16/07, Alex Queiroz <address@hidden> wrote:
Hallo list,
Suppose I've got the following C function:
int ov_open(FILE* f, SomeStruct* st);
How could I bind it so the file pointer is replaced by a file port?
(ov-open port some-struct)
The GMP egg contains the following definitions:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; conversion routines for a scheme port to a FILE*
;; Courtesy of Felix L. Winkelmann
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-foreign-variable _eof int "EOF")
(define port->file*
(let ([port-file (foreign-lambda c-pointer "C_port_file" scheme-object)])
(lambda (port)
(let ([fp (port-file port)])
(or fp (error "port has no associated file-pointer" port)) ) )
) )
(define file*->port
(let ([fputs (foreign-lambda void "fputs" c-string c-pointer)]
[fgetc (foreign-lambda int "fgetc" c-pointer)]
[fclose (foreign-lambda void "fclose" c-pointer)] )
(lambda (fp outp)
(if outp
(make-output-port
(lambda (str) (fputs str fp))
(lambda () (fclose fp)) )
(make-input-port
(lambda ()
(let ([c (fgetc fp)])
(if (eq? _eof c)
#!eof
(integer->char c) ) ) )
(lambda () #t)
(lambda () (fclose fp)) ) ) ) ) )
Does that help?
--Graham