Date: Tuesday, June 28, 2011 @ 17:55:05 Author: rtoy Path: /project/cmucl/cvsroot/src/code
Modified: fd-stream.lisp stream.lisp
Fix Trac #43 again.
stream.lisp: o Remove the old code that was the first attempt at fixing issue #43. This was wrong.
fd-stream.lisp: o Fix issue #43. Even if we have a string-buffer, we need to take into account any octets in the in-buffer (if it exists) that have not been processed. This happens if the in-buffer does not have enough octets at the end to form a complete character for the given encoding. o Some debugging prints added, but disabled.
----------------+ fd-stream.lisp | 75 +++++++++++++++++++++++++++++++++---------------------- stream.lisp | 8 ----- 2 files changed, 46 insertions(+), 37 deletions(-)
Index: src/code/fd-stream.lisp diff -u src/code/fd-stream.lisp:1.124 src/code/fd-stream.lisp:1.125 --- src/code/fd-stream.lisp:1.124 Tue May 31 06:14:39 2011 +++ src/code/fd-stream.lisp Tue Jun 28 17:55:04 2011 @@ -5,7 +5,7 @@ ;;; Carnegie Mellon University, and has been placed in the public domain. ;;; (ext:file-comment - "$Header: /project/cmucl/cvsroot/src/code/fd-stream.lisp,v 1.124 2011/05/31 13:14:39 rtoy Exp $") + "$Header: /project/cmucl/cvsroot/src/code/fd-stream.lisp,v 1.125 2011/06/29 00:55:04 rtoy Exp $") ;;; ;;; ********************************************************************** ;;; @@ -1717,35 +1717,50 @@ (fd-stream-ibuf-head stream)))
#+unicode - (if (fd-stream-string-buffer stream) - ;; The string buffer contains Lisp characters, - ;; not octets! To figure out how many octets - ;; have not been already supplied, we need to - ;; count how many octets were consumed for all - ;; the characters in the string bbuffer that have - ;; not been supplied. - (let ((ocount (fd-stream-octet-count stream))) - (when ocount - ;; Note: string-index starts at 1 (because - ;; index 0 is for the unread-char), but - ;; octet-count doesn't use that. Hence, - ;; subtract one from string-index and - ;; string-buffer-len. - (loop for k of-type fixnum from (1- (fd-stream-string-index stream)) - below (1- (fd-stream-string-buffer-len stream)) - do (decf posn (aref ocount k))))) - (when (fd-stream-in-buffer stream) - ;; When we have an in-buffer (but no - ;; string-buffer!), we need to adjust for the - ;; octets that have not yet been supplied. - ;; This situation (should!) only happens for an - ;; external-format of ISO-8859-1. If there's - ;; no string-buffer and no in-buffer, then the - ;; ibuf tail and head pointers contain all the - ;; information needed. - (decf posn (- in-buffer-length - (fd-stream-in-index stream))))) - + (when (fd-stream-string-buffer stream) + ;; The string buffer contains Lisp characters, + ;; not octets! To figure out how many octets + ;; have not been already supplied, we need to + ;; count how many octets were consumed for all + ;; the characters in the string bbuffer that have + ;; not been supplied. + (let ((ocount (fd-stream-octet-count stream))) + (when ocount + ;; Note: string-index starts at 1 (because + ;; index 0 is for the unread-char), but + ;; octet-count doesn't use that. Hence, + ;; subtract one from string-index and + ;; string-buffer-len. + #+nil + (progn + (format t "~&ocount = ~D~%" ocount) + (format t "posn = ~D~%" posn)) + (loop for k of-type fixnum from (1- (fd-stream-string-index stream)) + below (1- (fd-stream-string-buffer-len stream)) + do (decf posn (aref ocount k))) + #+nil + (progn + (format t "new posn = ~D~%" posn) + (format t "in-buffer-length = ~D~%" in-buffer-length) + (format t "fd-stream-in-index = ~D~%" (fd-stream-in-index stream)))))) + (when (fd-stream-in-buffer stream) + ;; When we have an in-buffer (whether we have a + ;; string-buffer or not!), we need to adjust for + ;; the octets that have not yet been supplied. + ;; (This case happens with string-buffer when the + ;; in-buffer does not have enough octets to form a + ;; complete character.) If there's no + ;; string-buffer and no in-buffer, then the ibuf + ;; tail and head pointers contain all the + ;; information needed. + #+nil + (progn + (format t "in-buffer-length = ~D~%" in-buffer-length) + (format t "fd-stream-in-index = ~D~%" (fd-stream-in-index stream))) + (decf posn (- in-buffer-length + (fd-stream-in-index stream)))) + #+nil + (format t "fd-stream-unread = ~S~%" (fd-stream-unread stream)) (when (fd-stream-unread stream) ;;@@ (decf posn)) ;; Divide bytes by element size. Index: src/code/stream.lisp diff -u src/code/stream.lisp:1.101 src/code/stream.lisp:1.102 --- src/code/stream.lisp:1.101 Mon Jun 27 08:05:27 2011 +++ src/code/stream.lisp Tue Jun 28 17:55:04 2011 @@ -5,7 +5,7 @@ ;;; Carnegie Mellon University, and has been placed in the public domain. ;;; (ext:file-comment - "$Header: /project/cmucl/cvsroot/src/code/stream.lisp,v 1.101 2011/06/27 15:05:27 rtoy Exp $") + "$Header: /project/cmucl/cvsroot/src/code/stream.lisp,v 1.102 2011/06/29 00:55:04 rtoy Exp $") ;;; ;;; ********************************************************************** ;;; @@ -851,12 +851,6 @@ (setf (lisp-stream-string-buffer-len stream) (1+ char-count)) (setf (lisp-stream-string-index stream) 2) (setf (lisp-stream-in-index stream) octet-count) - ;; If we didn't convert all the octets, - ;; adjust the head pointer to indicate - ;; that we have unread octets left. - #+nil - (decf (lisp::fd-stream-ibuf-head stream) - (- (fd-stream-in-length stream) octet-count)) #+(or debug-frc-sr) (progn (format t "new in-index = ~A~%" (lisp-stream-in-index stream))