r4824: Auto commit for Debian build
[kmrcl.git] / strings.lisp
index a6db99b655ddde6af58900eab8b8d289167a3bcf..a9acdc27281ad98ef62d1d963d569f0e55fb20a0 100644 (file)
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Apr 2000
 ;;;;
-;;;; $Id: strings.lisp,v 1.18 2003/05/05 19:54:14 kevin Exp $
+;;;; $Id: strings.lisp,v 1.21 2003/05/06 01:43:14 kevin Exp $
 ;;;;
 ;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg
 ;;;;
@@ -66,23 +66,16 @@ my algorithm. Does allegro use assembly?"
        (output '())
        (pos 0)
        (end (position separator string :start pos :end len)
-            (position separator string :start pos :end len))
-       (previous nil))
+            (position separator string :start pos :end len)))
        ((null end)
-       (cond
-         ((null previous)
-          (list string))
-         (t
-          (incf previous)
-          (if (< previous len)
-              (push (subseq string previous) output)
-              (unless skip-terminal
-                (push "" output)))
-          (nreverse output))))
+       (if (< pos len)
+           (push (subseq string pos) output)
+           (when (or (not skip-terminal) (zerop len))
+             (push "" output)))
+       (nreverse output))
     (declare (type fixnum pos len)
-            (type (or null fixnum) end previous))
+            (type (or null fixnum) end))
     (push (subseq string pos end) output)
-    (setq previous end)
     (setq pos (1+ end))))
 
 
@@ -240,3 +233,20 @@ list of characters and replacement strings."
       (setf (aref vec i) (char-code (schar str i))))
     vec))
 
+(defun concat-separated-strings (separator &rest lists)
+  (format nil (format nil "~~{~~A~~^~A~~}" separator) (append-sublists lists)))
+
+(defun print-separated-strings (strm separator &rest lists)
+  (declare (optimize (speed 3) (safety 0) (space 0) (debug 0)
+                    (compilation-speed 0)))
+  (do* ((rest-lists lists (cdr rest-lists))
+       (list (car rest-lists) (car rest-lists))
+       (last-list (null (cdr rest-lists)) (null (cdr rest-lists))))
+       ((null list) strm)
+    (do* ((lst list (cdr lst))
+         (elem (car lst) (car lst))
+         (last-elem (null (cdr lst)) (null (cdr lst))))
+        ((null lst))
+      (write-string elem strm)
+      (unless (and last-elem last-list)
+       (write-string separator strm)))))