The first field of the user-defined stream structure must be of type
QP_stream
. Other fields in the user-defined stream structure can
be anything that is required to operate on the user-defined stream.
The Prolog input/output system passes a QP_stream
pointer as the first argument to the bottom layer functions;
casting this to the user-defined stream structure enables other fields in
the user-defined stream to be accessed.
The example below declares a binary stream structure as:
typedef struct { QP_stream qpinfo; int fd; /* UNIX file descriptor */ int last_rdsize; /* size of last returned record */ unsigned char buffer[Buffer_Size]; /* I/O buffer */ } BinStream; #define CoerceBinStream(x) ((BinStream *)(x))
The field qpinfo
stores information about the binary stream known to
the Prolog input/output system. There is a buffer
field in the structure
since the I/O buffer is allocated by the user. The macro
CoerceBinStream
is used to convert a pointer to QP_stream
into a
pointer to BinStream
. We use this macro to convert the pointer
so that fields in the BinStream
structure can be accessed.