r8614: add string-elide, new tests
[kmrcl.git] / strings.lisp
index 8eb08f74e9faa7ac1b243ee78988db6b2a239444..732e8f075b9ac501e94443ae0b0324c778b23781 100644 (file)
@@ -552,11 +552,24 @@ for characters in a string"
        
 
 (defun string-maybe-shorten (str maxlen)
-  (let ((len (length str)))
-    (if (<= len maxlen)
-       str
-      (concatenate 'string (subseq str 0 (- maxlen 3)) "..."))))
+  (string-elide str maxlen :end))
 
+(defun string-elide (str maxlen position)
+  (declare (fixnum maxlen))
+  (let ((len (length str)))
+    (declare (fixnum len))
+    (cond
+     ((<= len maxlen)
+      str)
+     ((<= maxlen 3)
+      "...")
+     ((eq position :middle)
+      (multiple-value-bind (mid remain) (truncate maxlen 2)
+       (let ((end1 (- mid 1))
+             (start2 (- len (- mid 2) remain))) 
+         (concatenate 'string (subseq str 0 end1) "..." (subseq str start2)))))
+     ((or (eq position :end) t)
+      (concatenate 'string (subseq str 0 (- maxlen 3)) "...")))))
 
 (defun shrink-vector (str size)
   #+allegro