CMUCL commit: RELEASE-20B-BRANCH src/code (fd-stream-extfmt.lisp)

Raymond Toy rtoy at common-lisp.net
Mon Sep 6 17:41:30 CEST 2010


    Date: Monday, September 6, 2010 @ 11:41:30
  Author: rtoy
    Path: /project/cmucl/cvsroot/src/code
     Tag: RELEASE-20B-BRANCH

Modified: fd-stream-extfmt.lisp

Fix a couple of issues with changing the stream external format in
midstream.

o When changing the external format, the new converted characters need
  to go into the string-buffer at the point after the last character
  was read.  This maintains consistency if the format is changed
  again before we have to read in another buffer of octets.
o Handle the case where an external format that uses the string-buffer
  is changed to ISO8859-1, which doesn't.  In this case, the converted
  characters need to be copied to the in-buffer in the right place and
  the string-buffer needs to be set to NIL to indicate that the
  string-buffer is not used anymore.
o Add a note that we don't handle the case of changing ISO8859-1 to
  another external-format that uses a string-buffer.


-----------------------+
 fd-stream-extfmt.lisp |   41 ++++++++++++++++++++++++++++++-----------
 1 file changed, 30 insertions(+), 11 deletions(-)


Index: src/code/fd-stream-extfmt.lisp
diff -u src/code/fd-stream-extfmt.lisp:1.10 src/code/fd-stream-extfmt.lisp:1.10.2.1
--- src/code/fd-stream-extfmt.lisp:1.10	Tue Jul 20 17:34:29 2010
+++ src/code/fd-stream-extfmt.lisp	Mon Sep  6 11:41:30 2010
@@ -5,7 +5,7 @@
 ;;; domain.
 ;;; 
 (ext:file-comment
- "$Header: /project/cmucl/cvsroot/src/code/fd-stream-extfmt.lisp,v 1.10 2010-07-20 21:34:29 rtoy Exp $")
+ "$Header: /project/cmucl/cvsroot/src/code/fd-stream-extfmt.lisp,v 1.10.2.1 2010-09-06 15:41:30 rtoy Exp $")
 ;;;
 ;;; **********************************************************************
 ;;;
@@ -76,6 +76,11 @@
       (setf (fd-stream-out stream) (ef-cout extfmt)
 	    ;;@@ (fd-stream-sout stream) (ef-sout extfmt)
 	    ))
+    ;; FIXME: We currently don't handle the case of changing from
+    ;; ISO8859-1 to something else.  This is because ISO8859-1 doesn't
+    ;; use the string-buffer, so when we switch to another external
+    ;; format that does, we need to set up the string-buffer
+    ;; appropriately.
     (when (and lisp::*enable-stream-buffer-p* updatep
 	       (lisp-stream-string-buffer stream))
       ;; We want to reconvert any octets that haven't been converted
@@ -83,7 +88,7 @@
       ;; This is done by converting (the previously converted) octets
       ;; until we've converted the right number of characters.
       (let ((ibuf (lisp-stream-in-buffer stream))
-	    (sindex (1- (lisp-stream-string-index stream)))
+	    (sindex (lisp-stream-string-index stream))
 	    (index 0)
 	    (state (fd-stream-saved-oc-state stream)))
 	;; Reconvert all the octets we've already converted and read.
@@ -93,29 +98,43 @@
 	    (octets-to-string ibuf
 			      :start 0
 			      :external-format old-format
-			      :string (make-string sindex)
+			      :string (make-string (1- sindex))
 			      :state state
 			      :error (fd-stream-octets-to-char-error stream))
 	  (declare (ignore s pos))
 	  (setf state new-state)
 	  (setf index count))
-	
 	;; We now know the last octet that was used.  Now convert the
-	;; rest of the octets using the new format.
+	;; rest of the octets using the new format.  The new
+	;; characters are placed in the string buffer at the point
+	;; just after the last character that we've already read.
 	(multiple-value-bind (s pos count new-state)
 	    (octets-to-string ibuf
 			      :start index
 			      :end (fd-stream-in-length stream)
 			      :external-format (fd-stream-external-format stream)
 			      :string (lisp-stream-string-buffer stream)
-			      :s-start 1
+			      :s-start sindex
 			      :state state
 			      :error (fd-stream-octets-to-char-error stream))
-	  (declare (ignore s))
-	  (setf (lisp-stream-string-index stream) 1)
-	  (setf (lisp-stream-string-buffer-len stream) pos)
-	  (setf (lisp-stream-in-index stream) (+ index count))
-	  (setf (fd-stream-oc-state stream) new-state))))
+	  (cond ((eq (fd-stream-external-format stream) :iso8859-1)
+		 ;; ISO8859-1 doesn't use the string-buffer, so we
+		 ;; need to copy the string to the in-buffer and then
+		 ;; set the string-buffer to nil to indicate we're not
+		 ;; using the string buffer anymore.
+		 (let ((index (- in-buffer-length count)))
+		   (dotimes (k count)
+		     (setf (aref ibuf (+ k index))
+			   (char-code (aref s (+ k sindex)))))
+		   (setf (lisp-stream-in-index stream) index)
+		   (setf (lisp-stream-string-buffer stream) nil)
+		   (setf (lisp-stream-string-buffer-len stream) 0)
+		   (setf (lisp-stream-string-index stream) 0)))
+		(t
+		 (setf (lisp-stream-string-index stream) sindex)
+		 (setf (lisp-stream-string-buffer-len stream) pos)
+		 (setf (lisp-stream-in-index stream) (+ index count))
+		 (setf (fd-stream-oc-state stream) new-state))))))
     extfmt))
 
 



More information about the cmucl-commit mailing list