;;;; 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
;;;;
(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))))
(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)))))