X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Freader.lisp;h=3ec10599c7f9623014002b964d73bacba4ad257a;hb=f8893c7c658bf9d9e0757c63e47af2fdea810f04;hp=49a0ba0aaa466d9b6d9a6955e4a2223347b7857d;hpb=22b819c0cd0ca0ea5be52ba280b9e9e0b8e86210;p=sbcl.git diff --git a/src/code/reader.lisp b/src/code/reader.lisp index 49a0ba0..3ec1059 100644 --- a/src/code/reader.lisp +++ b/src/code/reader.lisp @@ -316,7 +316,7 @@ (defvar *ouch-ptr*) (declaim (type index *read-buffer-length* *inch-ptr* *ouch-ptr*)) -(declaim (simple-string *read-buffer*)) +(declaim (type (simple-array character (*)) *read-buffer*)) (defmacro reset-read-buffer () ;; Turn *READ-BUFFER* into an empty read buffer. @@ -736,7 +736,8 @@ (colons 0) (possibly-rational t) (possibly-float t) - (escapes ())) + (escapes ()) + (seen-multiple-escapes nil)) (reset-read-buffer) (prog ((char firstchar)) (case (char-class3 char attribute-table) @@ -956,6 +957,7 @@ (#.+char-attr-package-delimiter+ (go COLON)) (t (go SYMBOL))) MULT-ESCAPE + (setq seen-multiple-escapes t) (do ((char (read-char stream t) (read-char stream t))) ((multiple-escape-p char)) (if (escapep char) (setq char (read-char stream t))) @@ -983,7 +985,9 @@ ;; a FIND-PACKAGE* function analogous to INTERN* ;; and friends? (read-buffer-to-string) - *keyword-package*)) + (if seen-multiple-escapes + (read-buffer-to-string) + *keyword-package*))) (reset-read-buffer) (setq escapes ()) (setq char (read-char stream nil nil)) @@ -1427,7 +1431,7 @@ `(error 'simple-parse-error :format-control ,format-control :format-arguments (list string)))) - (with-array-data ((string string) + (with-array-data ((string string :offset-var offset) (start start) (end (%check-vector-sequence-bounds string start end))) (let ((index (do ((i start (1+ i))) @@ -1456,10 +1460,10 @@ found-digit t)) (junk-allowed (return nil)) ((whitespacep char) - (do ((jndex (1+ index) (1+ jndex))) - ((= jndex end)) - (declare (fixnum jndex)) - (unless (whitespacep (char string jndex)) + (loop + (incf index) + (when (= index end) (return)) + (unless (whitespacep (char string index)) (parse-error "junk in string ~S"))) (return nil)) (t @@ -1471,7 +1475,7 @@ (if junk-allowed nil (parse-error "no digits in string ~S"))) - index))))) + (- index offset)))))) ;;;; reader initialization code