X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=strings.lisp;h=8201a98b2d209fda6cde8a98d4e0d08248fe400b;hp=4ef18f0134e586755ab1cb9177e82ff53ca11b10;hb=7218cf73c0c074deb473571ce0a766473791cf0d;hpb=8513c6f273613b0ceb2b48c07da6a0b1803c32a5 diff --git a/strings.lisp b/strings.lisp index 4ef18f0..8201a98 100644 --- a/strings.lisp +++ b/strings.lisp @@ -604,7 +604,12 @@ for characters in a string" (defun split-alphanumeric-string (string) "Separates a string at any non-alphanumeric chararacter" - (flet ((is-sep (char) (non-alphanumericp char))) + (declare (simple-string string) + (optimize (speed 3) (safety 0))) + (flet ((is-sep (char) + (declare (character char)) + (and (non-alphanumericp char) + (not (char= #\_ char))))) (let ((tokens nil)) (do* ((token-start (position-if-not #'is-sep string) @@ -619,6 +624,30 @@ for characters in a string" (push (subseq string token-start token-end) tokens))))) +(defun trim-non-alphanumeric (word) + "Strip non-alphanumeric characters from beginning and end of a word." + (declare (simple-string word) + (optimize (speed 3) (safety 0) (space 0))) + (let* ((start 0) + (len (length word)) + (end len)) + (declare (fixnum start end len)) + (do ((done nil)) + ((or done (= start end))) + (if (alphanumericp (schar word start)) + (setq done t) + (incf start))) + (when (> end start) + (do ((done nil)) + ((or done (= start end))) + (if (alphanumericp (schar word (1- end))) + (setq done t) + (decf end)))) + (if (or (plusp start) (/= len end)) + (subseq word start end) + word))) + + (defun collapse-whitespace (s) "Convert multiple whitespace characters to a single space character."