;;; -*-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
(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)))
+ (setf-default start 0 end (length string))
(let ((i start)
(q nil)
(e nil)
: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;
(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 --------------------------------------------------