else
cp package-locks-basic.texinfo package-locks.texi-temp
fi
+
+echo /creating encodings.texi-temp
+$SBCL <<EOF
+(with-open-file (s "encodings.texi-temp" :direction :output :if-exists :supersede)
+ (let (result)
+ (sb-int:dohash ((key val) sb-impl::*external-formats*)
+ (pushnew (sb-impl::ef-names val) result :test #'equal))
+ (setq result (sort result #'string< :key #'car))
+ (format s "@table @code~%~%")
+ (loop for (cname . names) in result
+ do (format s "@item ~S~%~{@code{~S}~^, ~}~%~%" cname names))
+ (format s "@end table~%")))
+EOF
-@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 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 open
+@findex 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