@node Extensible Streams
@comment  node-name,  next,  previous,  up
@chapter Extensible Streams

SBCL supports various extensions of ANSI Common Lisp streams.

@table @strong
@item Bivalent Streams
A type of stream that can read and write both @code{character} and
@code{(unsigned-byte 8)} values.

@item Gray Streams
User-overloadable CLOS classes whose instances can be used as Lisp
streams (e.g. passed as the first argument to @code{format}).

@item Simple Streams
The bundled contrib module @dfn{sb-simple-streams} implements a subset
of the Franz Allegro simple-streams proposal.

@end table

@menu
* Bivalent Streams::
* Gray Streams::                
* Simple Streams::              
@end menu

@node Bivalent Streams
@section Bivalent Streams

A @dfn{bivalent stream} can be used to read and write both
@code{character} and @code{(unsigned-byte 8)} values.  A bivalent
stream is created by calling @code{open} with the argument @code{:element-type
:default}.  On such a stream, both binary and character data can be
read and written with the usual input and output functions.

@c Horrible visual markup
@quotation
Streams are @emph{not} created bivalent by default for performance
reasons.  Bivalent streams are incompatible with
@code{fast-read-char}, an internal optimization in sbcl's stream
machinery that bulk-converts octets to characters and implements a
fast path through @code{read-char}.
@end quotation

@node Gray Streams
@section Gray Streams

@include class-sb-gray-fundamental-stream.texinfo
@include fun-sb-gray-stream-advance-to-column.texinfo
@include fun-sb-gray-stream-clear-input.texinfo
@include fun-sb-gray-stream-clear-output.texinfo
@include fun-sb-gray-stream-finish-output.texinfo
@include fun-sb-gray-stream-force-output.texinfo
@include fun-sb-gray-stream-fresh-line.texinfo
@include fun-sb-gray-stream-line-column.texinfo
@include fun-sb-gray-stream-line-length.texinfo
@include fun-sb-gray-stream-listen.texinfo
@include fun-sb-gray-stream-peek-char.texinfo
@include fun-sb-gray-stream-read-byte.texinfo
@include fun-sb-gray-stream-read-char-no-hang.texinfo
@include fun-sb-gray-stream-read-char.texinfo
@include fun-sb-gray-stream-read-line.texinfo
@include fun-sb-gray-stream-read-sequence.texinfo
@include fun-sb-gray-stream-start-line-p.texinfo
@include fun-sb-gray-stream-terpri.texinfo
@include fun-sb-gray-stream-unread-char.texinfo
@include fun-sb-gray-stream-write-byte.texinfo
@include fun-sb-gray-stream-write-char.texinfo
@include fun-sb-gray-stream-write-sequence.texinfo
@include fun-sb-gray-stream-write-string.texinfo

@node Simple Streams
@comment  node-name,  next,  previous,  up
@section Simple Streams
@include sb-simple-streams/sb-simple-streams.texinfo
