util: fix virSkipSpaces

Most clients of virSkipSpaces don't want to omit backslashes.
Also, open-coding the list of spaces is not as nice as using
c_isspace.

* src/util/util.c (virSkipSpaces): Use c_isspace.
(virSkipSpacesAndBackslash): New function.
* src/util/util.h (virSkipSpacesAndBackslash): New prototype.
* src/xen/xend_internal.c (sexpr_to_xend_topology): Update caller.
* src/libvirt_private.syms (util.h): Export new function.
This commit is contained in:
Eric Blake 2011-06-29 11:30:43 -06:00
parent 864e9457ca
commit 82162316b6
4 changed files with 23 additions and 6 deletions

View File

@ -1031,6 +1031,7 @@ virSetInherit;
virSetNonBlock;
virSetUIDGID;
virSkipSpaces;
virSkipSpacesAndBackslash;
virStrToDouble;
virStrToLong_i;
virStrToLong_l;

View File

@ -1532,16 +1532,31 @@ virHexToBin(unsigned char c)
* @str: pointer to the char pointer used
*
* Skip potential blanks, this includes space tabs, line feed,
* carriage returns and also '\\' which can be erronously emitted
* by xend
* carriage returns.
*/
void
virSkipSpaces(const char **str)
{
const char *cur = *str;
while ((*cur == ' ') || (*cur == '\t') || (*cur == '\n') ||
(*cur == '\r') || (*cur == '\\'))
while (c_isspace(*cur))
cur++;
*str = cur;
}
/**
* virSkipSpacesAndBackslash:
* @str: pointer to the char pointer used
*
* Like virSkipSpaces, but also skip backslashes erroneously emitted
* by xend
*/
void
virSkipSpacesAndBackslash(const char **str)
{
const char *cur = *str;
while (c_isspace(*cur) || *cur == '\\')
cur++;
*str = cur;
}

View File

@ -167,6 +167,7 @@ int virHexToBin(unsigned char c);
int virMacAddrCompare (const char *mac1, const char *mac2);
void virSkipSpaces(const char **str);
void virSkipSpacesAndBackslash(const char **str);
int virParseNumber(const char **str);
int virParseVersionString(const char *str, unsigned long *version,
bool allowMissing);

View File

@ -1199,11 +1199,11 @@ sexpr_to_xend_topology(const struct sexpr *root,
cell = virParseNumber(&cur);
if (cell < 0)
goto parse_error;
virSkipSpaces(&cur);
virSkipSpacesAndBackslash(&cur);
if (*cur != ':')
goto parse_error;
cur++;
virSkipSpaces(&cur);
virSkipSpacesAndBackslash(&cur);
if (STRPREFIX(cur, "no cpus")) {
nb_cpus = 0;
for (cpu = 0; cpu < numCpus; cpu++)