X-Git-Url: https://git.distorted.org.uk/~mdw/lisp/blobdiff_plain/0ff9df03bb54ba792cefa551face51748ae34259..0eed4749891adf0a7be89e786b8968ee805a8d41:/str.lisp diff --git a/str.lisp b/str.lisp index 1cb0cc7..a943bae 100644 --- a/str.lisp +++ b/str.lisp @@ -13,19 +13,20 @@ ;;; 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)) + (:export #:join-strings #:str-next-word #:str-split-words + #:str-beginsp #:str-endsp)) (in-package #:mdw.str) (defun join-strings (del strs) @@ -36,7 +37,7 @@ (with-output-to-string (s) (when strs (loop - (princ (stringify (pop strs)) s) + (princ (stringify (pop strs)) s) (unless strs (return)) (princ del s))))) @@ -47,8 +48,7 @@ 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) @@ -135,4 +135,30 @@ (incf n))) (nreverse l))) +(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)))) + +(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 --------------------------------------------------