X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=strings.lisp;h=179bdb3ccea252a7c415f58259aea1fe0bb44734;hb=1738d41053dae41266d5740385be9aac03a864ad;hp=1832ff2a5dfa58f94564ee87f7b59587527c7b6e;hpb=d60bf2d464b393bdff8482bcaacd8d49957467ce;p=kmrcl.git diff --git a/strings.lisp b/strings.lisp index 1832ff2..179bdb3 100644 --- a/strings.lisp +++ b/strings.lisp @@ -153,12 +153,16 @@ (defun is-string-empty (str) (zerop (length str))) -(defvar *whitespace-chars* '(#\space #\tab #\return #\linefeed)) +(defvar *whitespace-chars* '(#\space #\tab #\return #\linefeed + #+allegro #\%space + #+lispworks #\No-Break-Space)) (defun is-char-whitespace (c) (declare (character c) (optimize (speed 3) (safety 0))) (or (char= c #\Space) (char= c #\Tab) (char= c #\Return) - (char= c #\Linefeed))) + (char= c #\Linefeed) + #+allegro (char= c #\%space) + #+lispworks (char= c #\No-Break-Space))) (defun is-string-whitespace (str) "Return t if string is all whitespace" @@ -602,20 +606,24 @@ for characters in a string" (push (subseq string token-start token-end) tokens))))) -(defun match-unique-abbreviation (abbr strings) - "Returns position of ABBR in STRINGS. ABBR may be a unique abbreviation. -Returns NIL if no match found." - (let ((len (length abbr)) - (matches nil)) - (dotimes (i (length strings)) - (let* ((s (nth i strings)) - (l (length s))) + +(defun collapse-whitespace (s) + "Convert multiple whitespace characters to a single space character." + (declare (simple-string s) + (optimize (speed 3) (safety 0))) + (with-output-to-string (stream) + (do ((pos 0 (1+ pos)) + (in-white nil) + (len (length s))) + ((= pos len)) + (declare (fixnum pos len)) + (let ((c (schar s pos))) + (declare (character c)) (cond - ((= len l) - (when (string= abbr s) - (push (cons s i) matches))) - ((< len l) - (when (string= abbr (subseq s 0 len)) - (push (cons s i) matches)))))) - (when (= 1 (length matches)) - (cdr (first matches))))) + ((kl:is-char-whitespace c) + (unless in-white + (write-char #\space stream)) + (setq in-white t)) + (t + (setq in-white nil) + (write-char c stream)))))))