From: Nick Roberts Date: Thu, 28 Jun 2007 01:35:10 +0000 (+0000) Subject: * pcvs-util.el (cvs-strings->string, cvs-string->strings): Rename X-Git-Tag: emacs-pretest-23.0.90~12086 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=0b93ff3a2c2cec8987fa64255558558c278fb7b6;p=emacs.git * pcvs-util.el (cvs-strings->string, cvs-string->strings): Rename and move to... * subr.el (strings->string, string->strings): ...here. --- diff --git a/lisp/subr.el b/lisp/subr.el index 7ce7071f2f7..86616265c59 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -2768,6 +2768,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.