[gambit-list] Questions about reading from a port and u8vector
Marc Feeley
feeley at iro.umontreal.ca
Sat Jun 27 00:17:14 EDT 2009
On 26-Jun-09, at 10:37 PM, Lam Luu wrote:
> Hello everyone,
>
> I am working on ICFP programming contest. There is something I am
> really
> confused about.
>
> Supposed that I have an input port, and I want to read the next 8
> bytes
> as an IEEE 754 double value or a 32-bit unsigned integer, is there
> anyway to do this in Gambit? I mean, they are not string with digit
> '0'
> - '9', but actual representation of the number.
>
> Secondly, is there anyway to pass an u8vector to a C-lambda, as a
> char*
> or whatever? The C Interface section of the manual only provides
> information about character string, but not u8vector. Is it possible
> to
> pass u8vector as char*?
>
The code below will write and read 64 bit floats. The IEEE 754
representation is not guaranteed, but on most machines that is what
you'll get. Beware that the endianness will be determined by the
processor's native endianness.
To pass a u8vector to a c-lambda do this:
(define foo
(c-lambda (scheme-object)
int
"char *ptr = ___CAST(char*,___BODY(___arg1));
___result = ptr[0] + ptr[1] + ptr[2];"))
(pp (foo (u8vector 10 20 30))) ;; prints 60
Good luck with the contest!
Marc
(define u8vector-subtype (##subtype (u8vector)))
(define f64vector-subtype (##subtype (f64vector)))
(define (write-f64 x port)
(let ((v (f64vector x)))
(##subtype-set! v u8vector-subtype)
(write-subu8vector v 0 (u8vector-length v) port)))
(define (read-f64 port)
(let ((v (f64vector 0.0)))
(##subtype-set! v u8vector-subtype)
(let ((n (read-subu8vector v 0 (u8vector-length v) port)))
(if (= n (u8vector-length v))
(begin
(##subtype-set! v f64vector-subtype)
(f64vector-ref v 0))
#!eof))))
(call-with-output-file
"f64test"
(lambda (port)
(write-f64 -1.5 port)
(write-f64 +inf.0 port)
(write-f64 3.1415926 port)))
(call-with-input-file
"f64test"
(lambda (port)
(let* ((a (read-f64 port))
(b (read-f64 port))
(c (read-f64 port))
(d (read-f64 port)))
(pp (list a b c d)))))
More information about the Gambit-list
mailing list