The following definition for the
stream-read-char
reads a character from the stream. If the character read is a
#\Line-Separator
, then the method returns
#\Newline
, otherwise the character read is returned. It also returns
:eof
at the end of the file.
(defmethod stream:stream-read-char ((stream unicode-ls-stream))
(let ((char (read-char (ls-stream-file-stream stream)
nil :eof)))
(if (eq char #\Line-Separator)
#\Newline
char)))
There is no need to define a new method for
stream-read-line
as the default method uses
stream-read-char
repeatedly to read a line, and our implementation of
stream-read-char
ensures that this will work.
stream-read-char
stream
The generic function
stream-read-char
reads one item from
stream
. The item read is either a character or the end of file symbol
:eof
if the stream is at the end of a file. Every subclass of
fundamental-character-input-stream
must define a method for this function.
We also need to make sure that if a
#\Newline
is unread, it is unread as a
#\Line-Separator
. The following code uses the Common Lisp file stream function
unread-char
to achieve this.
(defmethod stream:stream-unread-char ((stream unicode-ls-stream)
char)
(unread-char (if (eq char #\Newline) #\Line-Separator char)
(ls-stream-file-stream stream)))
stream-unread-char
stream
The generic function
stream-unread-char
undoes the last call to
stream-read-char
, as in
unread-char
. Every subclass of
fundamental-character-input-stream
must define a method for this function.
Finally, although the default methods for
stream-listen
and
stream-clear-input
would work for our stream, it is faster to use the functions provided by
file-stream
, using our accessor,
ls-stream-file-stream
.
(defmethod stream:stream-listen ((stream unicode-ls-stream))
(listen (ls-stream-file-stream stream)))
(defmethod stream:stream-clear-input ((stream unicode-ls-stream))
(clear-input (ls-stream-file-stream stream)))
stream-clear-input
stream
The generic function
stream-clear-input
implements
clear-input
. The default method is defined on
fundamental-input-stream
and does nothing.
stream-listen
stream
The generic function
stream-listen
is used by
listen
and returns
t
if there is input available. The default method uses
stream-read-char-no-hang
and
stream-unread-char
. Most streams should define their own method as this is usually trivial and more efficient than the method provided.