.. .fl
#include <sfdisc.h> extern Sfdisc_t* dcnewskable(Sfio_t* f); extern int dcdelskable(Sfdisc_t* disc); extern Sfdisc_t* dcnewtee(Sfio_t* tee); extern int dcdeltee(Sfdisc_t* disc); extern Sfdisc_t* dcnewfilter(char* cmd); extern int dcdelfilter(Sfdisc_t* disc); extern Sfdisc_t* dcnewsubstream(Sfio_t* f, long offset, long extent); extern int dcdelsubstream(Sfdisc_t* disc); extern Sfdisc_t* dcnewlzw(void); extern int dcdellzw(Sfdisc_t* disc); extern Sfdisc_t* dcnewunion(Sfio_t** flist, int n); extern int dcdelunion(Sfdisc_t* disc);
I/O disciplines are used to extend the data processing power of sfio streams. The convention for using the disciplines in this package is to use the call \f5dcnewXXX() to create a discipline of the type \f5XXX and to use \f5dcdelXXX() to destroy it. A discipline is enable by inserting it into the desired stream using the \f5sfdisc() call. A discipline can be used on only one stream. It is unsafe to share a discipline on two or more streams since the discipline may maintain states between successive IO calls. For multiple uses, \f5dcnewXXX() should be used to create a distinct discipline for each stream. Each discipline structure is equipped with an exception handler that causes self-destruction when the associated stream is closed.
.Ss " Sfdisc_t* dcnewskable(Sfio_t* f);" .Ss " int dcdelskable(Sfdisc_t* disc);" \f5dcnewskable() creates a discipline that when inserted on the stream \f5f will ensure that \f5f is seekable. If \f5f is originally unseekable, data will be shadowed in a temporary file stream to allow seekability. \f5dcnewskable() returns the discipline on success and \f5NULL on failure. .Ss " Sfdisc_t* dcnewtee(Sfio_t* tee);" .Ss " int dcdeltee(Sfdisc_t* disc);" \f5dcnewtee() creates a discipline that when inserted into a stream \f5f will duplicate to the stream \f5tee any data written to \f5f. \f5dcnewtee() returns the discipline on success and \f5NULL on failure. .Ss " Sfdisc_t* dcnewfilter(char* cmd);" .Ss " int dcdelfilter(Sfdisc_t* disc);" \f5dcnewfilter() creates a discipline that when inserted into a stream \f5f will run the command \f5cmd to process any input data before making it available to the application. For example, \f5dcnewfilter("uncompress") is an equivalent but slower alternative to the lzw discipline below. \f5dcnewfilter() returns the discipline on success and \f5NULL on failure. .Ss " Sfdisc_t* dcnewsubstream(Sfio_t* base, long offset, long extent);" .Ss " int dcdelsubstream(Sfdisc_t* disc);" \f5dcnewsubstream() creates a discipline that reserves a portion of the stream \f5base starting at \f5offset with length \f5extent and makes this portion appear as if it is a stream. When this discipline is inserted into a stream, it will make cause all IO operations on this stream to take place in the reserved portion of the \f5base stream. \f5dcnewsubstream() returns the discipline on success and \f5NULL on failure. .Ss " Sfdisc_t* dcnewlzw(void); .Ss " int dcdellzw(Sfdisc_t* disc);" \f5dcnewlzw() creates a discipline that when inserted into a stream \f5f will run the uncompress algorithm on input data from \f5f before making it available to the application. This is useful to allow applications to process data from a file packed with the UNIX compress utility as if the data is in plain text. \f5dcnewlzw() returns the discipline on success and \f5NULL on failure. .Ss " Sfdisc_t* dcnewunion(Sfio_t** list, int n); .Ss " int dcdelunion(Sfdisc_t* disc);" \f5dcnewunion() creates a discipline that concatenates input data from all \f5n streams in \f5list. When inserted into a stream \f5f, this discipline will cause all input operations on \f5f to come from the merged data stream. \f5dcnewunion() returns the discipline on success and \f5NULL on failure.