Previous: C Port Interface, Up: I/O Extensions
This section describes how to implement a new port type in C.
As described in the previous section, a port type object (ptob) is
a structure of type scm_ptob_descriptor
. A ptob is created by
calling scm_make_port_type
.
All of the elements of the ptob, apart from name
, are procedures
which collectively implement the port behaviour. Creating a new port
type mostly involves writing these procedures.
scm_make_port_type
initializes three elements of the structure
(name
, fill_input
and write
) from its arguments.
The remaining elements are initialized with default values and can be
set later if required.
name
scm_ptob_descriptor
which is not
a procedure. Set via the first argument to scm_make_port_type
.
mark
SCM
components. Set using scm_set_port_mark
.
free
scm_set_port_free
.
print
write
is called on the port object, to print a
port description. e.g., for an fport it may produce something like:
#<input: /etc/passwd 3>
. Set using scm_set_port_print
.
equalp
scm_set_port_equalp
.
close
scm_set_port_close
.
write
scm_make_port_type
.
flush
rw_active
to SCM_PORT_NEITHER
.
Set using scm_set_port_flush
.
end_input
rw_active
to SCM_PORT_NEITHER
.
Set using scm_set_port_end_input
.
fill_input
scm_make_port_type
.
input_waiting
rw_active
is SCM_PORT_NEITHER
.
Set using scm_set_port_input_waiting
.
seek
rw_active
when it's
called. It can reset the buffers first if desired by using something
like:
if (pt->rw_active == SCM_PORT_READ) scm_end_input (object); else if (pt->rw_active == SCM_PORT_WRITE) ptob->flush (object);
However note that this will have the side effect of discarding any data
in the unread-char buffer, in addition to any side effects from the
end_input
and flush
ptob procedures. This is undesirable
when seek is called to measure the current position of the port, i.e.,
(seek p 0 SEEK_CUR)
. The libguile fport and string port
implementations take care to avoid this problem.
The procedure is set using scm_set_port_seek
.
truncate
rw_active
is SCM_PORT_NEITHER
.
Set using scm_set_port_truncate
.