dep.lisp (%dep-value): Force the dep before registering a dependents.
[lisp] / str.lisp
index 9f43ed8..aff11a8 100644 (file)
--- a/str.lisp
+++ b/str.lisp
@@ -1,7 +1,5 @@
 ;;; -*-lisp-*-
 ;;;
-;;; $Id$
-;;;
 ;;; String utilities of various kinds
 ;;;
 ;;; (c) 2005 Straylight/Edgeware
 ;;; it under the terms of the GNU General Public License as published by
 ;;; the Free Software Foundation; either version 2 of the License, or
 ;;; (at your option) any later version.
-;;; 
+;;;
 ;;; This program is distributed in the hope that it will be useful,
 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;;; GNU General Public License for more details.
-;;; 
+;;;
 ;;; You should have received a copy of the GNU General Public License
 ;;; along with this program; if not, write to the Free Software Foundation,
 ;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 (defpackage #:mdw.str
-  (:use #:common-lisp #:mdw.base)
-  (:export #:join-strings #:str-next-word #:str-split-words))
+  (:use #:common-lisp #:mdw.base))
 (in-package #:mdw.str)
 
+(export 'join-strings)
 (defun join-strings (del strs)
   "Join together the strings STRS with DEL between them.  All the arguments
-are first converted to strings, as if by `stringify'.  Otherwise, this is
-like Perl's join operator."
+   are first converted to strings, as if by `stringify'.  Otherwise, this is
+   like Perl's join operator."
   (setf del (stringify del))
   (with-output-to-string (s)
     (when strs
       (loop
-        (princ (stringify (pop strs)) s)
+       (princ (stringify (pop strs)) s)
        (unless strs
          (return))
        (princ del s)))))
 
+(export 'str-next-word)
 (defun str-next-word (string &key quotedp start end)
   "Extract a whitespace-delimited word from STRING, returning it and the
-index to continue parsing from.  If no word is found, return nil twice.  If
-QUOTEDP, then allow quoting and backslashifying; otherwise don't.  The START
-and END arguments limit the portion of the string to be processed; the
-default to 0 and nil (end of string), as usual."
-  (unless start (setf start 0))
-  (unless end (setf end (length string)))
+   index to continue parsing from.  If no word is found, return nil twice.
+   If QUOTEDP, then allow quoting and backslashifying; otherwise don't.  The
+   START and END arguments limit the portion of the string to be processed;
+   the default to 0 and nil (end of string), as usual."
+  (setf-default start 0 end (length string))
   (let ((i start)
        (q nil)
        (e nil)
@@ -108,13 +106,14 @@ default to 0 and nil (end of string), as usual."
                        :initial-contents w)
            i)))
 
+(export 'str-split-words)
 (defun str-split-words (string &key quotedp start end max)
   "Break STRING into words, like str-next-word does, returning the list of
-the individual words.  If QUOTEDP, then allow quoting and backslashifying;
-otherwise don't.  No more than MAX `words' are returned: if the maximum is
-hit, then the last `word' is unbroken, and may still contain quotes and
-escape characters.  The START and END arguments limit the portion of the
-string to be processed in the usual way."
+   the individual words.  If QUOTEDP, then allow quoting and backslashifying;
+   otherwise don't.  No more than MAX `words' are returned: if the maximum is
+   hit, then the last `word' is unbroken, and may still contain quotes and
+   escape characters.  The START and END arguments limit the portion of the
+   string to be processed in the usual way."
   (when (equal max 0)
     (return-from str-split-words nil))
   (let ((l nil) (n 0))
@@ -135,4 +134,32 @@ string to be processed in the usual way."
         (incf n)))
     (nreverse l)))
 
+(export 'str-beginsp)
+(declaim (inline str-beginsp))
+(defun str-beginsp (string prefix &key (start1 0) end1 (start2 0) end2)
+  "Returns true if STRING (or the appropriate substring of it) begins with
+   PREFIX."
+  (setf-default end1 (length string)
+               end2 (length prefix))
+  (let ((strlen (- end1 start1))
+       (prelen (- end2 start2)))
+    (and (>= strlen prelen)
+        (string= string prefix
+                 :start1 start1 :end1 (+ start1 prelen)
+                 :start2 start2 :end2 end2))))
+
+(export 'str-endsp)
+(declaim (inline str-endsp))
+(defun str-endsp (string suffix &key (start1 0) end1 (start2 0) end2)
+  "Returns true if STRING (or the appropriate substring of it) ends with
+   SUFFIX."
+  (setf-default end1 (length string)
+               end2 (length suffix))
+  (let ((strlen (- end1 start1))
+       (suflen (- end2 start2)))
+    (and (>= strlen suflen)
+        (string= string suffix
+                 :start1 (- end1 suflen) :end1 end1
+                 :start2 start2 :end2 end2))))
+
 ;;;----- That's all, folks --------------------------------------------------