[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/lisp/subr.el,v
From: |
Nick Roberts |
Subject: |
[Emacs-diffs] Changes to emacs/lisp/subr.el,v |
Date: |
Thu, 28 Jun 2007 01:35:11 +0000 |
CVSROOT: /sources/emacs
Module name: emacs
Changes by: Nick Roberts <nickrob> 07/06/28 01:35:10
Index: subr.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/subr.el,v
retrieving revision 1.555
retrieving revision 1.556
diff -u -b -r1.555 -r1.556
--- subr.el 13 Jun 2007 00:03:28 -0000 1.555
+++ subr.el 28 Jun 2007 01:35:10 -0000 1.556
@@ -2769,6 +2769,36 @@
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.
(defun subst-char-in-string (fromchar tochar string &optional inplace)