X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=strings.lisp;h=533bf013a5c663fba805486f07927344f7f39afd;hp=4ef18f0134e586755ab1cb9177e82ff53ca11b10;hb=5f3fba52fd7c9984a7f797c4720ec93799d6d786;hpb=6edcb840b821b4be95925fe39ce34ee5e1f229d7 diff --git a/strings.lisp b/strings.lisp index 4ef18f0..533bf01 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) (size 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."