int <read function>(qpstream, bufptr, sizeptr) QP_stream *qpstream; unsigned char **bufptr; size_t *sizeptr; Return Values: QP_FULL : a complete record is read QP_PART : a partial record is read QP_EOF : end of file is reached QP_ERROR : a partial record is read
The bottom layer read function returns a record of input to its caller.
The returned record is buffered. The buffer address is returned
through *bufptr
parameter and the size of the returned record
is stored in *sizeptr
parameter. The magic
field
in qpstream
should be updated to the system-dependent file address
(see fli-ios-sst-sda)
for the beginning of the returned record. If there is no
seek permission for the stream, the magic
field may be ignored.
The errno
field in QP_stream
stores the error code
if an error is detected in the function.
In our example, the read function does not return QP_PART
since
any length of input is chosen as a complete record.
static int bin_read(qpstream, bufptr, sizeptr) QP_stream *qpstream; unsigned char **bufptr; size_t *sizeptr; { int n; register BinStream *stream = CoerceBinStream(qpstream); qpstream->magic.byteno += stream->last_rdsize; stream->last_rdsize = 0; n = read(stream->fd, (char*) stream->buffer, (int) qpstream->max_reclen); if (n > 0) { *bufptr = stream->buffer; *sizeptr = n; stream->last_rdsize = n; return QP_FULL; } else if (n == 0) { *sizeptr = 0; return QP_EOF; } else { qpstream->errno = errno; return QP_ERROR; } }