-@node Extensible Streams
+@node Streams
@comment node-name, next, previous, up
-@chapter Extensible Streams
+@chapter Streams
-SBCL supports various extensions of ANSI Common Lisp streams.
+Streams which read or write Lisp character data from or to the outside
+world -- files, sockets or other external entities -- require the
+specification of a conversion between the external, binary data and the
+Lisp characters. In ANSI Common Lisp, this is done by specifying the
+@code{:external-format} argument when the stream is created. The major
+information required is an @emph{encoding}, specified by a keyword
+naming that encoding; however, it is also possible to specify
+refinements to that encoding as additional options to the external
+format designator.
+
+In addition, SBCL supports various extensions of ANSI Common Lisp
+streams:
@table @strong
@item Bivalent Streams
@end table
@menu
+* External Formats::
* Bivalent Streams::
* Gray Streams::
* Simple Streams::
@end menu
+@node External Formats
+@section External Formats
+@cindex External formats
+
+@findex @cl{stream-external-format}
+The encodings supported by SBCL as external formats are named by
+keyword. Each encoding has a canonical name, which will be encoding
+returned by @code{stream-external-format}, and a number of aliases for
+convenience, as shown in the table below:
+
+@include encodings.texi-temp
+
+@findex @cl{open}
+@findex @cl{with-open-file}
+In situations where an external file format designator is required, such
+as the @code{:external-format} argument in calls to @code{open} or
+@code{with-open-file}, users may supply the name of an encoding to
+denote the external format which is applying that encoding to Lisp
+characters.
+
+In addition to the basic encoding for an external format, options
+controlling various special cases may be passed, by using a list (whose
+first element must be an encoding name and whose rest is a plist) as an
+external file format designator. At present, the only supported key in
+the plist is @code{:replacement}, where the corresponding value is a
+string designator which is used as a replacement when an encoding or
+decoding error happens, handling those errors without user intervention;
+for example:
+@lisp
+(with-open-file (i pathname :external-format '(:utf-8 :replacement #\?))
+ (read-line i))
+@end lisp
+will read the first line of @var{pathname}, replacing any invalid utf-8
+sequences with question marks.
+
@node Bivalent Streams
@section Bivalent Streams
@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
+@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
@include fun-common-lisp-stream-element-type.texinfo
@include fun-common-lisp-close.texinfo
-
+@include fun-sb-gray-stream-file-position.texinfo