[gambit-list] user-defined ports / input-port-byte-position on u8vector ports

Darren Baker darren at wildfire.com.au
Thu Feb 19 03:01:30 EST 2009


Hi all,

I've been implementing a virtual file system in Gambit; the idea is that 
I can open a file for input and it could be transparently sourced from a 
.zip file, or the local filesystem, http connection, etc., and a 
suitable newly-created port would be returned that the caller can do the 
usual character and byte I/O with.

So for example if a request resolves to a local file, then 
open-input-port is used, if it's a compressed file, then a different 
port would be used that handles the decompression.

Two issues:

1)
In the case of reading from a .zip, Gambit obviously doesn't have a port 
for this, so it seemed to me that creating a new custom port type would 
be ideal.  Is there an official / easy way to do this?

(A simplified low-level user port type would be great, in the style used 
by many C libraries, ie user provides read-bytes, write-bytes, seek and 
tell functions.)


2)
For now I've implemented .zip functionality by extracting the required 
file to a u8vector, then creating a u8vector-input-port on that, and 
returning it.  Good idea... except that I find out the hard way that 
input-port-byte-position doesn't work on u8vector ports.  This seems to 
indicate that I can't do random access binary I/O on them using the port 
functions...?  I realise it's not a "device port" but it seems a logical 
thing to want to do in general.


Btw, reading the list archives from 2006 there was a discussion on the 
behaviour of input-port-byte-position returning the *buffered* position 
not the read-u8 cursor position.  FWIW, my vote is for the read-u8 
position, the current behaviour totally caught me out and isn't 
particularly usable. :)

Thanks,
Darren





More information about the Gambit-list mailing list