1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2024-12-26 03:21:44 +03:00

util: add virTrimSpaces

The next patch wants to adjust an end pointer to trim trailing
spaces but without modifying the underlying string, but a more
generally useful ability to trim trailing spaces in place is
also worth providing.

* src/util/util.h (virTrimSpaces, virSkipSpacesBackwards): New
prototypes.
* src/util/util.c (virTrimSpaces, virSkipSpacesBackwards): New
functions.
* src/libvirt_private.syms (util.h): Export new functions.
Inspired by a patch by Minoru Usui.
This commit is contained in:
Eric Blake 2011-06-29 11:47:08 -06:00
parent 82162316b6
commit 01374ec8b1
3 changed files with 64 additions and 2 deletions

View File

@ -1032,6 +1032,7 @@ virSetNonBlock;
virSetUIDGID; virSetUIDGID;
virSkipSpaces; virSkipSpaces;
virSkipSpacesAndBackslash; virSkipSpacesAndBackslash;
virSkipSpacesBackwards;
virStrToDouble; virStrToDouble;
virStrToLong_i; virStrToLong_i;
virStrToLong_l; virStrToLong_l;
@ -1043,6 +1044,7 @@ virStrcpy;
virStrncpy; virStrncpy;
virTimeMs; virTimeMs;
virTimestamp; virTimestamp;
virTrimSpaces;
virVasprintf; virVasprintf;

View File

@ -1561,6 +1561,62 @@ virSkipSpacesAndBackslash(const char **str)
*str = cur; *str = cur;
} }
/**
* virTrimSpaces:
* @str: string to modify to remove all trailing spaces
* @endp: track the end of the string
*
* If @endp is NULL on entry, then all spaces prior to the trailing
* NUL in @str are removed, by writing NUL into the appropriate
* location. If @endp is non-NULL but points to a NULL pointer,
* then all spaces prior to the trailing NUL in @str are removed,
* NUL is written to the new string end, and endp is set to the
* location of the (new) string end. If @endp is non-NULL and
* points to a non-NULL pointer, then that pointer is used as
* the end of the string, endp is set to the (new) location, but
* no NUL pointer is written into the string.
*/
void
virTrimSpaces(char *str, char **endp)
{
char *end;
if (!endp || !*endp)
end = str + strlen(str);
else
end = *endp;
while (end > str && c_isspace(end[-1]))
end--;
if (endp) {
if (!*endp)
*end = '\0';
*endp = end;
} else {
*end = '\0';
}
}
/**
* virSkipSpacesBackwards:
* @str: start of string
* @endp: on entry, *endp must be NULL or a location within @str, on exit,
* will be adjusted to skip trailing spaces, or to NULL if @str had nothing
* but spaces.
*/
void
virSkipSpacesBackwards(const char *str, char **endp)
{
/* Casting away const is safe, since virTrimSpaces does not
* modify string with this particular usage. */
char *s = (char*) str;
if (!*endp)
*endp = s + strlen(s);
virTrimSpaces(s, endp);
if (s == *endp)
*endp = NULL;
}
/** /**
* virParseNumber: * virParseNumber:
* @str: pointer to the char pointer used * @str: pointer to the char pointer used

View File

@ -166,8 +166,12 @@ int virHexToBin(unsigned char c);
int virMacAddrCompare (const char *mac1, const char *mac2); int virMacAddrCompare (const char *mac1, const char *mac2);
void virSkipSpaces(const char **str); void virSkipSpaces(const char **str) ATTRIBUTE_NONNULL(1);
void virSkipSpacesAndBackslash(const char **str); void virSkipSpacesAndBackslash(const char **str) ATTRIBUTE_NONNULL(1);
void virTrimSpaces(char *str, char **endp) ATTRIBUTE_NONNULL(1);
void virSkipSpacesBackwards(const char *str, char **endp)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int virParseNumber(const char **str); int virParseNumber(const char **str);
int virParseVersionString(const char *str, unsigned long *version, int virParseVersionString(const char *str, unsigned long *version,
bool allowMissing); bool allowMissing);