[flexi-streams-cvs] r17 - branches/hans
hhubner at common-lisp.net
hhubner at common-lisp.net
Wed May 14 10:59:58 UTC 2008
Author: hhubner
Date: Wed May 14 06:59:57 2008
New Revision: 17
Modified:
branches/hans/output.lisp
Log:
Fix bug in output cr-lf handling
Modified: branches/hans/output.lisp
==============================================================================
--- branches/hans/output.lisp (original)
+++ branches/hans/output.lisp Wed May 14 06:59:57 2008
@@ -80,7 +80,7 @@
(defmacro define-char-writer (((stream stream-class) char sink) &body body)
(let ((body body))
- (with-unique-names (string start end dummy-sink byte i)
+ (with-unique-names (string start end dummy-sink input-char byte i eol-style)
`(progn
(defmethod char-to-octets ((,stream ,stream-class) ,char ,sink)
(declare (optimize speed))
@@ -90,14 +90,23 @@
(let ((,sink (make-array (truncate (* (- ,end ,start)
(flexi-stream-output-size-factor ,stream)))
:adjustable t :fill-pointer 0 :element-type '(unsigned-byte 8))))
- (loop
+ (labels ((write-byte* (,byte ,dummy-sink)
+ (declare (ignore ,dummy-sink))
+ (vector-push-extend ,byte ,sink))
+ (write-char (,char)
+ , at body))
+ (loop
+ with ,eol-style = (external-format-eol-style (flexi-stream-external-format ,stream))
for ,i of-type fixnum from ,start below ,end
- for ,char of-type character = (aref ,string ,i)
- do (flet ((write-byte* (,byte ,dummy-sink)
- (declare (ignore ,dummy-sink))
- (vector-push-extend ,byte ,sink)))
- , at body))
- ,sink))))))
+ for ,input-char of-type character = (aref ,string ,i)
+ do (if (eql ,input-char #\Newline)
+ (case ,eol-style
+ (:cr (write-char #\Return))
+ (:crlf (write-char #\Return)
+ (write-char #\Newline))
+ (t (write-char #\Newline)))
+ (write-char ,input-char)))
+ ,sink)))))))
(define-char-writer ((stream flexi-latin-1-output-stream) char sink)
(let ((octet (char-code char)))
@@ -191,18 +200,20 @@
(write-byte* (ldb (byte 8 position) char-code) sink))
char)
-(define-char-writer ((stream flexi-cr-mixin) char sink)
+(defmethod char-to-octets ((stream flexi-cr-mixin) char sink)
+ (declare (optimize speed))
"The `base' method for all streams which need end-of-line
conversion. Uses CALL-NEXT-METHOD to do the actual work of sending
one or more characters to SINK."
- (with-accessors ((external-format flexi-stream-external-format))
+ (with-accessors
+ ((external-format flexi-stream-external-format))
stream
(case char
- (#\Newline
+ (#\Newline
(case (external-format-eol-style external-format)
(:cr (call-next-method stream #\Return sink))
(:crlf (call-next-method stream #\Return sink)
- (call-next-method stream #\Linefeed sink))))
+ (call-next-method stream #\Newline sink))))
(otherwise (call-next-method)))
char))
More information about the Flexi-streams-cvs
mailing list