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. --- src/libvirt_private.syms | 2 + src/util/util.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++ src/util/util.h | 4 +++ 3 files changed, 59 insertions(+), 0 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 024b3f1..a444a40 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1031,6 +1031,7 @@ virSetNonBlock; virSetUIDGID; virSkipSpaces; virSkipSpacesAndBackslash; +virSkipSpacesBackwards; virStrToDouble; virStrToLong_i; virStrToLong_l; @@ -1042,6 +1043,7 @@ virStrcpy; virStrncpy; virTimeMs; virTimestamp; +virTrimSpaces; virVasprintf; diff --git a/src/util/util.c b/src/util/util.c index 27eefb2..f6601b9 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -1565,6 +1565,59 @@ virSkipSpacesAndBackslash(const char **str) } /** + * 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 + */ +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); +} + +/** * virParseNumber: * @str: pointer to the char pointer used * diff --git a/src/util/util.h b/src/util/util.h index 8dec78a..2ca592b 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -168,6 +168,10 @@ int virMacAddrCompare (const char *mac1, const char *mac2); void virSkipSpaces(const char **str); void virSkipSpacesAndBackslash(const char **str); +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 virParseVersionString(const char *str, unsigned long *version); int virAsprintf(char **strp, const char *fmt, ...) -- 1.7.4.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list