summaryrefslogtreecommitdiff
path: root/lisp/subr.el
diff options
context:
space:
mode:
authorNick Roberts <nickrob@snap.net.nz>2007-07-08 06:49:02 +0000
committerNick Roberts <nickrob@snap.net.nz>2007-07-08 06:49:02 +0000
commitd0b15d36793fd0ecb79f8dec78afb46b7e674af1 (patch)
treeba0505097bde3cc6c184c6c837bbff87aa08cb74 /lisp/subr.el
parenta80a334ec31740354c57622739c681431830ade4 (diff)
downloademacs-d0b15d36793fd0ecb79f8dec78afb46b7e674af1.tar.gz
* pcvs-util.el (cvs-strings->string, cvs-string->strings):
Rename and move to... * subr.el (strings->string, string->strings): ...here.
Diffstat (limited to 'lisp/subr.el')
-rw-r--r--lisp/subr.el30
1 files changed, 30 insertions, 0 deletions
diff --git a/lisp/subr.el b/lisp/subr.el
index a05c1d15780..9ce4758a746 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -2759,6 +2759,36 @@ Modifies the match data; use `save-match-data' if necessary."
(cons (substring string start)
list)))
(nreverse list)))
+
+;; (string->strings (strings->string X)) == X
+(defun strings->string (strings &optional separator)
+ "Concatenate the STRINGS, adding the SEPARATOR (default \" \").
+This tries to quote the strings to avoid ambiguity such that
+ (string->strings (strings->string strs)) == strs
+Only some SEPARATORs will work properly."
+ (let ((sep (or separator " ")))
+ (mapconcat
+ (lambda (str)
+ (if (string-match "[\\\"]" str)
+ (concat "\"" (replace-regexp-in-string "[\\\"]" "\\\\\\&" str) "\"")
+ str))
+ strings sep)))
+
+;; (string->strings (strings->string X)) == X
+(defun string->strings (string &optional separator)
+ "Split the STRING into a list of strings.
+It understands elisp style quoting within STRING such that
+ (string->strings (strings->string strs)) == strs
+The SEPARATOR regexp defaults to \"\\s-+\"."
+ (let ((sep (or separator "\\s-+"))
+ (i (string-match "[\"]" string)))
+ (if (null i) (split-string string sep t) ; no quoting: easy
+ (append (unless (eq i 0) (split-string (substring string 0 i) sep t))
+ (let ((rfs (read-from-string string i)))
+ (cons (car rfs)
+ (string->strings (substring string (cdr rfs))
+ sep)))))))
+
;;;; Replacement in strings.