提交 7f197559 编写于 作者: S Sage Weil 提交者: Eric Blake

buf: implement generic virBufferEscape

Implement a generic helper to escape a given set of characters with a
leading '\'.  Generalizes virBufferEscapeSexpr().
Signed-off-by: NSage Weil <sage@newdream.net>
上级 33b55fd8
...@@ -197,6 +197,7 @@ Patches have also been contributed by: ...@@ -197,6 +197,7 @@ Patches have also been contributed by:
Matthias Witte <witte@netzquadrat.de> Matthias Witte <witte@netzquadrat.de>
Tang Chen <tangchen@cn.fujitsu.com> Tang Chen <tangchen@cn.fujitsu.com>
Dan Horák <dan@danny.cz> Dan Horák <dan@danny.cz>
Sage Weil <sage@newdream.net>
[....send patches to get your name here....] [....send patches to get your name here....]
......
...@@ -25,6 +25,7 @@ virBufferAddChar; ...@@ -25,6 +25,7 @@ virBufferAddChar;
virBufferAsprintf; virBufferAsprintf;
virBufferContentAndReset; virBufferContentAndReset;
virBufferError; virBufferError;
virBufferEscape;
virBufferEscapeSexpr; virBufferEscapeSexpr;
virBufferEscapeString; virBufferEscapeString;
virBufferFreeAndReset; virBufferFreeAndReset;
......
...@@ -382,6 +382,25 @@ void ...@@ -382,6 +382,25 @@ void
virBufferEscapeSexpr(const virBufferPtr buf, virBufferEscapeSexpr(const virBufferPtr buf,
const char *format, const char *format,
const char *str) 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; int len;
char *escaped, *out; char *escaped, *out;
...@@ -394,7 +413,7 @@ virBufferEscapeSexpr(const virBufferPtr buf, ...@@ -394,7 +413,7 @@ virBufferEscapeSexpr(const virBufferPtr buf,
return; return;
len = strlen(str); len = strlen(str);
if (strcspn(str, "\\'") == len) { if (strcspn(str, toescape) == len) {
virBufferAsprintf(buf, format, str); virBufferAsprintf(buf, format, str);
return; return;
} }
...@@ -408,14 +427,9 @@ virBufferEscapeSexpr(const virBufferPtr buf, ...@@ -408,14 +427,9 @@ virBufferEscapeSexpr(const virBufferPtr buf,
cur = str; cur = str;
out = escaped; out = escaped;
while (*cur != 0) { while (*cur != 0) {
switch (*cur) { if (strchr(toescape, *cur))
case '\\':
case '\'':
*out++ = '\\'; *out++ = '\\';
/* fallthrough */ *out++ = *cur;
default:
*out++ = *cur;
}
cur++; cur++;
} }
*out = 0; *out = 0;
......
...@@ -50,6 +50,7 @@ void virBufferStrcat(const virBufferPtr buf, ...) ...@@ -50,6 +50,7 @@ void virBufferStrcat(const virBufferPtr buf, ...)
ATTRIBUTE_SENTINEL; ATTRIBUTE_SENTINEL;
void virBufferEscapeString(const virBufferPtr buf, const char *format, const char *str); void virBufferEscapeString(const virBufferPtr buf, const char *format, const char *str);
void virBufferEscapeSexpr(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); void virBufferURIEncodeString (const virBufferPtr buf, const char *str);
# define virBufferAddLit(buf_, literal_string_) \ # define virBufferAddLit(buf_, literal_string_) \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册