Commit 17424bc8310775169a1a8fa2248b341a6598f578

Thomas de Grivel 2017-06-17T21:27:45

stream-read-element-from-buffer

diff --git a/cl-stream.lisp b/cl-stream.lisp
index 3dbd9f5..dc3947e 100644
--- a/cl-stream.lisp
+++ b/cl-stream.lisp
@@ -245,22 +245,24 @@ Returns NIL if successful, or
 (defmethod (setf stream-input-buffer) (value (stream buffered-input-stream))
   (setf (slot-value stream 'input-buffer) value))
 
+(defgeneric stream-read-element-from-buffer (stream))
+
+(defmethod stream-read-element-from-buffer ((stream buffered-input-stream))
+  (let ((element (aref (stream-input-buffer stream)
+		       (stream-input-index stream))))
+    (assert (typep element (stream-element-type stream)))
+    (incf (stream-input-index stream))
+    (values element nil)))
+
 (defmethod read ((stream buffered-input-stream))
   (check-if-open stream)
-  (let ((buffer (stream-input-buffer stream)))
-    (flet ((read-element ()
-	     (let ((element (aref buffer (stream-input-index stream))))
-	       (assert (typep element (stream-element-type stream)))
-	       (incf (stream-input-index stream))
-	       (values element nil))))
-      (if (< (stream-input-index stream) (stream-input-length stream))
-	  (read-element)
-	  (case (stream-fill-input-buffer stream)
-	    ((nil) (read-element))
-	    ((:eof) (return-from read (values nil :eof)))
-	    ((:non-blocking) (return-from read
-			       (values nil :non-blocking)))
-	    (:otherwise (error 'stream-input-error :stream stream)))))))
+  (if (< (stream-input-index stream) (stream-input-length stream))
+      (stream-read-element-from-buffer stream)
+      (ecase (stream-fill-input-buffer stream)
+	((nil) (stream-read-element-from-buffer stream))
+	((:eof) (values nil :eof))
+	((:non-blocking) (values nil :non-blocking))
+	(otherwise (error 'stream-input-error :stream stream)))))
 
 (defmethod close :after ((stream buffered-input-stream))
   (setf (stream-input-buffer stream) nil))
diff --git a/package.lisp b/package.lisp
index b5e7e62..e6612f9 100644
--- a/package.lisp
+++ b/package.lisp
@@ -69,6 +69,7 @@
    #:stream-output-buffer-size
    #:stream-output-index
    #:stream-output-length
+   #:stream-read-element-from-buffer
    #:stream-write-element-to-buffer
    #:with-input-from-sequence
    #:with-input-from-string