X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=strings.lisp;h=9dbe1babdccd7950172033dc0d5c6d9614ff4921;hp=732e8f075b9ac501e94443ae0b0324c778b23781;hb=19190787da0e49afad011b90b4b6ce8608b22444;hpb=ab5f800e2939665c968b9e97519d99bddb39251d diff --git a/strings.lisp b/strings.lisp index 732e8f0..9dbe1ba 100644 --- a/strings.lisp +++ b/strings.lisp @@ -413,9 +413,9 @@ for characters in a string" (declare (type (integer 0 15) n)) (schar +hex-chars+ n)) -(defconstant +char-code-lower-a+ (char-code #\a)) -(defconstant +char-code-upper-a+ (char-code #\A)) -(defconstant +char-code-0+ (char-code #\0)) +(defconst +char-code-lower-a+ (char-code #\a)) +(defconst +char-code-upper-a+ (char-code #\A)) +(defconst +char-code-0+ (char-code #\0)) (declaim (type fixnum +char-code-0+ +char-code-upper-a+ +char-code-0)) @@ -476,9 +476,9 @@ for characters in a string" (eval-when (:compile-toplevel :load-toplevel :execute) - (defvar +unambigous-charset+ + (defvar +unambiguous-charset+ "abcdefghjkmnpqrstuvwxyz123456789ABCDEFGHJKLMNPQSRTUVWXYZ") - (defconstant +unambigous-length+ (length +unambigous-charset+))) + (defconstant +unambiguous-length+ (length +unambiguous-charset+))) (defun random-char (&optional (set :lower-alpha)) (ecase set @@ -491,8 +491,8 @@ for characters in a string" (code-char (+ +char-code-lower-a+ n))))) (:upper-alpha (code-char (+ +char-code-upper-a+ (random 26)))) - (:unambigous - (schar +unambigous-charset+ (random +unambigous-length+))) + (:unambiguous + (schar +unambiguous-charset+ (random +unambiguous-length+))) (:upper-lower-alpha (let ((n (random 52))) (if (>= n 26) @@ -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."