r5066: *** empty log message ***
[kmrcl.git] / strings.lisp
index f933fe824033312ea1a618cb6c56f889f2b1c36c..a070731a2afff44463a1def6f1bae6619e2c4fc2 100644 (file)
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Apr 2000
 ;;;;
-;;;; $Id: strings.lisp,v 1.35 2003/06/06 21:59:30 kevin Exp $
+;;;; $Id: strings.lisp,v 1.36 2003/06/07 05:45:14 kevin Exp $
 ;;;;
 ;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;;
     (declare (fixnum i))
     (when (char= char (schar string i)) (return i))))
 
+(defun position-not-char (char string start max)
+  (declare (optimize (speed 3) (safety 0) (space 0))
+          (fixnum start max) (simple-string string))
+  (do* ((i start (1+ i)))
+       ((= i max) nil)
+    (declare (fixnum i))
+    (when (char/= char (schar string i)) (return i))))
+
 (defun delimited-string-to-list (string &optional (separator #\space) 
                                                  skip-terminal)
   "split a string with delimiter"
@@ -286,7 +294,40 @@ Leading zeros are present."
        (pos (1- len) (1- pos))
        (mod (mod val 10) (mod val 10)))
       ((or (zerop val) (minusp pos))
-       (when minus? (setf (schar result (if pchar 1 0)) #\-))
+       (when minus? (setf (schar result 0) #\-))
        result)
     (declare (fixnum mod zero-code pos) (simple-string result) (integer val))
     (setf (schar result pos) (code-char (+ zero-code mod)))))
+
+(defun fast-string-search (substr str substr-length startpos endpos)
+  "Optimized search for a substring in a simple-string"
+  (declare (simple-string substr str)
+          (fixnum substr-length startpos endpos)
+          (optimize (speed 3) (space 0) (safety 0)))
+  (do* ((pos startpos (1+ pos))
+       (lastpos (- endpos substr-length)))
+       ((> pos lastpos) nil)
+    (declare (fixnum pos lastpos))
+    (do ((i 0 (1+ i)))
+       ((= i substr-length)
+        (return-from fast-string-search pos))
+      (declare (fixnum i))
+      (unless (char= (schar str (+ i pos)) (schar substr i))
+       (return nil)))))
+
+(defun string-to-list-skip-delimiter (str &optional (delim #\space))
+  "Return a list of strings, delimited by spaces, skipping spaces."
+  (declare (simple-string str)
+          (optimize (speed 0) (space 0) (safety 0)))
+  (do* ((results '())
+       (end (length str))
+       (i (position-not-char delim str 0 end)
+          (position-not-char delim str j end))
+       (j (when i (position-char delim str i end))
+          (when i (position-char delim str i end))))
+       ((or (null i) (null j))
+       (when (and i (< i end))
+         (push (subseq str i end) results))
+       (nreverse results))
+    (declare (fixnum i j end))
+    (push (subseq str i j) results)))