;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: Apr 2000
;;;;
-;;;; $Id: buff-input.lisp,v 1.3 2002/10/10 16:23:48 kevin Exp $
+;;;; $Id$
;;;;
;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg
;;;;
(in-package :kmrcl)
-(declaim (optimize (speed 3) (safety 0) (space 0) (debug 0)))
+(eval-when (:compile-toplevel)
+ (declaim (optimize (speed 3) (safety 0) (space 0) (debug 0))))
(defconstant +max-field+ 10000)
(defconstant +max-fields-per-line+ 20)
(setf (aref bufs i) (make-array max-field-len :element-type 'character :fill-pointer 0 :adjustable nil)))
bufs))
-(defun read-buffered-fields (fields strm &optional (field-delim +field-delim+))
+(defun read-buffered-fields (fields strm &optional (field-delim +field-delim+)
+ (eof 'eof))
"Read a line from a stream into a field buffers"
(declare (type base-char field-delim)
(type vector fields))
(setf (fill-pointer fields) 0)
(do ((ifield 0 (1+ ifield))
(linedone nil)
- (eof nil))
- (linedone (if eof 'eof fields))
+ (is-eof nil))
+ (linedone (if is-eof eof fields))
(declare (type fixnum ifield)
- (type boolean linedone eof))
+ (type boolean linedone is-eof))
(let ((field (aref fields ifield)))
(declare (type base-string field))
(do ((ipos 0)
(setf (fill-pointer fields) ifield)
(setq fielddone t)
(setq linedone t)
- (setq eof t))
+ (setq is-eof t))
(t
(setf (char field ipos) rc)
(incf ipos)))))))
(buffers)
(field-lengths))
-(defmethod print-object ((f field-buffers) s)
- (format s "#<~d>~%" (field-buffers-nfields f)))
-
(defun make-fields-buffer2 (&optional (max-fields +max-fields-per-line+)
(max-field-len +max-field+))
(let ((bufs (make-array max-fields :element-type 'vector :fill-pointer nil :adjustable nil))
bufstruct))
-(defun read-buffered-fields2 (fields strm &optional (field-delim +field-delim+))
+(defun read-buffered-fields2 (fields strm &optional (field-delim +field-delim+)
+ (eof 'eof))
"Read a line from a stream into a field buffers"
(declare (character field-delim))
(setf (field-buffers-nfields fields) 0)
(do ((ifield 0 (1+ ifield))
(linedone nil)
- (eof nil))
- (linedone (if eof 'eof fields))
+ (is-eof nil))
+ (linedone (if is-eof eof fields))
(declare (fixnum ifield)
- (t linedone eof))
+ (t linedone is-eof))
(let ((field (aref (field-buffers-buffers fields) ifield)))
(declare (simple-string field))
(do ((ipos 0)
(setf (field-buffers-nfields fields) ifield)
(setq fielddone t)
(setq linedone t)
- (setq eof t))
+ (setq is-eof t))
(t
(setf (char field ipos) rc)
(incf ipos)))))))
(let ((linebuffer (make-array +max-line+
:element-type 'character
:fill-pointer 0)))
- (defun read-buffered-line (strm)
+ (defun read-buffered-line (strm eof)
"Read a line from astream into a vector buffer"
+ (declare (optimize (speed 3) (space 0) (safety 0)))
(let ((pos 0)
(done nil))
- (declare (fixnum pos) (t done))
+ (declare (fixnum pos) (type boolean done))
(setf (fill-pointer linebuffer) 0)
(do ((c (read-char strm nil +eof-char+)
(read-char strm nil +eof-char+)))
(done (progn
(unless (eql c +eof-char+) (unread-char c strm))
- (if (eql c +eof-char+) 'eof linebuffer)))
+ (if (eql c +eof-char+) eof linebuffer)))
(declare (character c))
(cond
- ((char= c #\Newline)
- (unless (zerop pos)
- (setf (fill-pointer linebuffer) (1- pos)))
- (setf done t))
- ((char= +eof-char+)
- (setf done t))
- (t
- (setf (char linebuffer pos) c)
- (incf pos)))))))
+ ((>= pos +max-line+)
+ (warn "Line overflow")
+ (setf done t))
+ ((char= c #\Newline)
+ (when (plusp pos)
+ (setf (fill-pointer linebuffer) (1- pos)))
+ (setf done t))
+ ((char= +eof-char+)
+ (setf done t))
+ (t
+ (setf (char linebuffer pos) c)
+ (incf pos)))))))