chicken-users
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]