;;;----- Licensing notice ---------------------------------------------------
;;;
-;;; This file is part of the Sensble Object Design, an object system for C.
+;;; This file is part of the Sensible Object Design, an object system for C.
;;;
;;; SOD is free software; you can redistribute it and/or modify
;;; it under the terms of the GNU General Public License as published by
(clear-input ustream)))
(defmethod stream-read-sequence
- ((stream proxy-input-stream) seq &optional (start 0) end)
+ ((stream proxy-input-stream) seq
+ #+clisp &key #-clisp &optional (start 0) end)
(with-slots (ustream) stream
(read-sequence seq ustream :start start :end end)))
(force-output ustream)))
(defmethod stream-write-sequence
- ((stream proxy-output-stream) seq &optional (start 0) end)
+ ((stream proxy-output-stream) seq
+ #+clisp &key #-clisp &optional (start 0) end)
(with-slots (ustream) stream
(write-sequence seq ustream :start start :end end)))
;; Base class.
-(export '(position-aware-stream
- position-aware-stream-line position-aware-stream-column))
-(defclass position-aware-stream (proxy-stream)
- ((file :initarg :file :initform nil
- :type pathname :accessor position-aware-stream-file)
- (line :initarg :line :initform 1
- :type fixnum :accessor position-aware-stream-line)
- (column :initarg :column :initform 0
- :type fixnum :accessor position-aware-stream-column))
- (:documentation
- "Character stream which keeps track of the line and column position.
-
- A position-aware-stream wraps an existing character stream and tracks the
- line and column position of the current stream position. A newline
- character increases the line number by one and resets the column number to
- zero; most characters advance the column number by one, but tab advances
- to the next multiple of eight. (This is consistent with Emacs, at least.)
- The position can be read using `stream-line-and-column'.
-
- This is a base class; you probably want `position-aware-input-stream' or
- `position-aware-output-stream'."))
-
-(defgeneric stream-line-and-column (stream)
- (:documentation
- "Returns the current stream position of STREAM as line/column numbers.
-
- Returns two values: the line and column numbers of STREAM's input
- position.")
- (:method ((stream stream))
- (values nil nil))
- (:method ((stream position-aware-stream))
- (with-slots (line column) stream
- (values line column))))
+(defmethod stream-line-and-column ((stream position-aware-stream))
+ (with-slots (line column) stream
+ (values line column)))
(defmethod stream-pathname ((stream position-aware-stream))
"Return the pathname corresponding to a `position-aware-stream'.
;; Input stream.
-(export 'position-aware-input-stream)
-(defclass position-aware-input-stream
- (position-aware-stream proxy-character-input-stream)
- ()
- (:documentation
- "A character input stream which tracks the input position.
-
- This is particularly useful for parsers and suchlike, which want to
- produce accurate error-location information."))
-
(defmethod stream-unread-char ((stream position-aware-input-stream) char)
;; I could have written this as a :before or :after method, but I think
(call-next-method))
(defmethod stream-read-sequence
- ((stream position-aware-input-stream) seq &optional (start 0) end)
+ ((stream position-aware-input-stream) seq
+ #+clisp &key #-clisp &optional (start 0) end)
(declare (ignore end))
(let ((pos (call-next-method)))
(with-position (stream)
;; Output stream.
-(export 'position-aware-output-stream)
-(defclass position-aware-output-stream
- (position-aware-stream proxy-character-output-stream)
- ()
- (:documentation
- "A character output stream which tracks the output position.
-
- This is particularly useful when generating C code: the position can be
- used to generate `#line' directives referring to the generated code after
- insertion of some user code."))
-
(defmethod stream-write-sequence
- ((stream position-aware-output-stream) seq &optional (start 0) end)
+ ((stream position-aware-output-stream) seq
+ #+clisp &key #-clisp &optional (start 0) end)
(with-position (stream)
(dosequence (ch seq :start start :end end)
(update ch))