X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fsharpm.lisp;h=820d5f489baa71e99aa375252210b59ed368364d;hb=13883fd2914c2beaf3634a87b3379735e5f49a29;hp=3f898b0b41a7248c25925152f91a0b4fa5b92e15;hpb=c5159b9f0da46023e65b65a82c911d8d9816dc3e;p=sbcl.git diff --git a/src/code/sharpm.lisp b/src/code/sharpm.lisp index 3f898b0..820d5f4 100644 --- a/src/code/sharpm.lisp +++ b/src/code/sharpm.lisp @@ -347,35 +347,41 @@ (defun sharp-vertical-bar (stream sub-char numarg) (ignore-numarg sub-char numarg) - (let ((stream (in-synonym-of stream))) - (if (ansi-stream-p stream) - (prepare-for-fast-read-char stream + (handler-bind + ((character-decoding-error + #'(lambda (decoding-error) + (declare (ignorable decoding-error)) + (style-warn "Character decoding error in a #|-comment at position ~A reading source file ~A, resyncing." (file-position stream) stream) + (invoke-restart 'attempt-resync)))) + (let ((stream (in-synonym-of stream))) + (if (ansi-stream-p stream) + (prepare-for-fast-read-char stream + (do ((level 1) + (prev (fast-read-char) char) + (char (fast-read-char) (fast-read-char))) + (()) + (cond ((and (char= prev #\|) (char= char #\#)) + (setq level (1- level)) + (when (zerop level) + (done-with-fast-read-char) + (return (values))) + (setq char (fast-read-char))) + ((and (char= prev #\#) (char= char #\|)) + (setq char (fast-read-char)) + (setq level (1+ level)))))) + ;; fundamental-stream (do ((level 1) - (prev (fast-read-char) char) - (char (fast-read-char) (fast-read-char))) + (prev (read-char stream t) char) + (char (read-char stream t) (read-char stream t))) (()) (cond ((and (char= prev #\|) (char= char #\#)) (setq level (1- level)) (when (zerop level) - (done-with-fast-read-char) (return (values))) - (setq char (fast-read-char))) + (setq char (read-char stream t))) ((and (char= prev #\#) (char= char #\|)) - (setq char (fast-read-char)) - (setq level (1+ level)))))) - ;; fundamental-stream - (do ((level 1) - (prev (read-char stream t) char) - (char (read-char stream t) (read-char stream t))) - (()) - (cond ((and (char= prev #\|) (char= char #\#)) - (setq level (1- level)) - (when (zerop level) - (return (values))) - (setq char (read-char stream t))) - ((and (char= prev #\#) (char= char #\|)) - (setq char (read-char stream t)) - (setq level (1+ level)))))))) + (setq char (read-char stream t)) + (setq level (1+ level))))))))) ;;;; a grab bag of other sharp readmacros: #', #:, and #.