]> xenbits.xensource.com Git - libvirt.git/commitdiff
buf: implement generic virBufferEscape
authorSage Weil <sage@newdream.net>
Tue, 20 Sep 2011 04:13:42 +0000 (21:13 -0700)
committerEric Blake <eblake@redhat.com>
Wed, 12 Oct 2011 17:05:41 +0000 (11:05 -0600)
Implement a generic helper to escape a given set of characters with a
leading '\'.  Generalizes virBufferEscapeSexpr().

Signed-off-by: Sage Weil <sage@newdream.net>
AUTHORS
src/libvirt_private.syms
src/util/buf.c
src/util/buf.h

diff --git a/AUTHORS b/AUTHORS
index fd4314f8661e368d5e3409a98a38e0481f18a8cd..0b7f76afcc058492840220f51b5baed11c279f56 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -197,6 +197,7 @@ Patches have also been contributed by:
   Matthias Witte       <witte@netzquadrat.de>
   Tang Chen            <tangchen@cn.fujitsu.com>
   Dan HorĂ¡k            <dan@danny.cz>
+  Sage Weil            <sage@newdream.net>
 
   [....send patches to get your name here....]
 
index 11ff7053ff9054ebd8897ab1bdad5b5462f27cab..4f965185d880f2ab523857fc842c9b3eb94b2e10 100644 (file)
@@ -25,6 +25,7 @@ virBufferAddChar;
 virBufferAsprintf;
 virBufferContentAndReset;
 virBufferError;
+virBufferEscape;
 virBufferEscapeSexpr;
 virBufferEscapeString;
 virBufferFreeAndReset;
index 500248683e6df21a53e2d22497c655a42059c0e5..fa12855a72d2b9c202ab58c0178bb216892951c4 100644 (file)
@@ -382,6 +382,25 @@ void
 virBufferEscapeSexpr(const virBufferPtr buf,
                      const char *format,
                      const char *str)
+{
+    virBufferEscape(buf, "\\'", format, str);
+}
+
+/**
+ * virBufferEscape:
+ * @buf:  the buffer to dump
+ * @toescape: NULL-terminated list of characters to escape
+ * @format: a printf like format string but with only one %s parameter
+ * @str:  the string argument which need to be escaped
+ *
+ * Do a formatted print with a single string to a buffer.  Any characters
+ * in the provided list are escaped with a preceeding \.
+ */
+void
+virBufferEscape(const virBufferPtr buf,
+                const char *toescape,
+                const char *format,
+                const char *str)
 {
     int len;
     char *escaped, *out;
@@ -394,7 +413,7 @@ virBufferEscapeSexpr(const virBufferPtr buf,
         return;
 
     len = strlen(str);
-    if (strcspn(str, "\\'") == len) {
+    if (strcspn(str, toescape) == len) {
         virBufferAsprintf(buf, format, str);
         return;
     }
@@ -408,14 +427,9 @@ virBufferEscapeSexpr(const virBufferPtr buf,
     cur = str;
     out = escaped;
     while (*cur != 0) {
-        switch (*cur) {
-        case '\\':
-        case '\'':
+        if (strchr(toescape, *cur))
             *out++ = '\\';
-            /* fallthrough */
-        default:
-            *out++ = *cur;
-        }
+        *out++ = *cur;
         cur++;
     }
     *out = 0;
index 06d01baeef23e5892cb1fbe19cd75df6881a03de..e545ed902da17a96b3374454a0e2e8f5df5c8d4b 100644 (file)
@@ -50,6 +50,7 @@ void virBufferStrcat(const virBufferPtr buf, ...)
   ATTRIBUTE_SENTINEL;
 void virBufferEscapeString(const virBufferPtr buf, const char *format, const char *str);
 void virBufferEscapeSexpr(const virBufferPtr buf, const char *format, const char *str);
+void virBufferEscape(const virBufferPtr buf, const char *toescape, const char *format, const char *str);
 void virBufferURIEncodeString (const virBufferPtr buf, const char *str);
 
 # define virBufferAddLit(buf_, literal_string_) \