r8614: add string-elide, new tests
[kmrcl.git] / strings.lisp
index 179bdb3ccea252a7c415f58259aea1fe0bb44734..732e8f075b9ac501e94443ae0b0324c778b23781 100644 (file)
@@ -427,7 +427,7 @@ for characters in a string"
        (+ 10 (- code +char-code-upper-a+))
        (- code +char-code-0+))))
 
-(defun uriencode-string (query)
+(defun encode-uri-string (query)
   "Escape non-alphanumeric characters for URI fields"
   (declare (simple-string query)
           (optimize (speed 3) (safety 0) (space 0)))
@@ -450,7 +450,7 @@ for characters in a string"
            (setf (schar str dpos) (hexchar (logand c 15))))
        (setf (schar str dpos) ch)))))
 
-(defun uridecode-string (query)
+(defun decode-uri-string (query)
   "Unescape non-alphanumeric characters for URI fields"
   (declare (simple-string query)
           (optimize (speed 3) (safety 0) (space 0)))
@@ -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
@@ -627,3 +640,10 @@ for characters in a string"
         (t
          (setq in-white nil)
          (write-char c stream)))))))
+
+(defun string->list (string)
+  (let ((eof (list nil)))
+    (with-input-from-string (stream string)
+      (do ((x (read stream nil eof) (read stream nil eof))
+           (l nil (cons x l)))
+          ((eq x eof) (nreverse l))))))