[libvirt] [PATCH v2 03/12] util: Add virStringTrimOptionalNewline

Martin Kletzander mkletzan at redhat.com
Thu Apr 6 12:27:38 UTC 2017


On Thu, Apr 06, 2017 at 01:32:13PM +0200, Erik Skultety wrote:
>On Wed, Apr 05, 2017 at 04:36:26PM +0200, Martin Kletzander wrote:
>> And use it in virFileRead*
>>
>> Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
>> ---
>>  src/util/virfile.c    | 18 +++++++-----------
>>  src/util/virhostcpu.c |  4 ++--
>>  src/util/virstring.h  |  8 ++++++++
>>  src/util/virsysfs.c   |  2 ++
>>  4 files changed, 19 insertions(+), 13 deletions(-)
>>
>> diff --git a/src/util/virfile.c b/src/util/virfile.c
>> index c0f448d3437d..cbfa3849d793 100644
>> --- a/src/util/virfile.c
>> +++ b/src/util/virfile.c
>> @@ -3811,7 +3811,6 @@ int
>>  virFileReadValueInt(const char *path, int *value)
>>  {
>>      char *str = NULL;
>> -    char *endp = NULL;
>>
>>      if (!virFileExists(path))
>>          return -2;
>> @@ -3819,8 +3818,9 @@ virFileReadValueInt(const char *path, int *value)
>>      if (virFileReadAll(path, INT_STRLEN_BOUND(*value), &str) < 0)
>>          return -1;
>>
>> -    if (virStrToLong_i(str, &endp, 10, value) < 0 ||
>> -        (endp && !c_isspace(*endp))) {
>> +    virStringTrimOptionalNewline(str);
>> +
>> +    if (virStrToLong_i(str, NULL, 10, value) < 0) {
>>          virReportError(VIR_ERR_INTERNAL_ERROR,
>>                         _("Invalid integer value '%s' in file '%s'"),
>>                         str, path);
>> @@ -3847,7 +3847,6 @@ int
>>  virFileReadValueUint(const char *path, unsigned int *value)
>>  {
>>      char *str = NULL;
>> -    char *endp = NULL;
>>
>>      if (!virFileExists(path))
>>          return -2;
>> @@ -3855,8 +3854,9 @@ virFileReadValueUint(const char *path, unsigned int *value)
>>      if (virFileReadAll(path, INT_STRLEN_BOUND(*value), &str) < 0)
>>          return -1;
>>
>> -    if (virStrToLong_uip(str, &endp, 10, value) < 0 ||
>> -        (endp && !c_isspace(*endp))) {
>> +    virStringTrimOptionalNewline(str);
>> +
>> +    if (virStrToLong_uip(str, NULL, 10, value)) {
>>          virReportError(VIR_ERR_INTERNAL_ERROR,
>>                         _("Invalid unsigned integer value '%s' in file '%s'"),
>>                         str, path);
>> @@ -3886,7 +3886,6 @@ virFileReadValueBitmap(const char *path,
>>  {
>>      char *buf = NULL;
>>      int ret = -1;
>> -    char *tmp = NULL;
>>
>>      if (!virFileExists(path))
>>          return -2;
>> @@ -3894,10 +3893,7 @@ virFileReadValueBitmap(const char *path,
>>      if (virFileReadAll(path, maxlen, &buf) < 0)
>>          goto cleanup;
>>
>> -    /* trim optinoal newline at the end */
>> -    tmp = buf + strlen(buf) - 1;
>> -    if (*tmp == '\n')
>> -        *tmp = '\0';
>> +    virStringTrimOptionalNewline(buf);
>>
>>      *value = virBitmapParseUnlimited(buf);
>>      if (!*value)
>> diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c
>> index 02b9fc8eb94f..a660e3f4dbe5 100644
>> --- a/src/util/virhostcpu.c
>> +++ b/src/util/virhostcpu.c
>> @@ -847,13 +847,13 @@ virHostCPUParseCountLinux(void)
>>      tmp = str;
>>      do {
>>          if (virStrToLong_i(tmp, &tmp, 10, &ret) < 0 ||
>> -            !strchr(",-\n", *tmp)) {
>> +            !strchr(",-", *tmp)) {
>>              virReportError(VIR_ERR_NO_SUPPORT,
>>                             _("failed to parse %s"), str);
>>              ret = -1;
>>              goto cleanup;
>>          }
>> -    } while (*tmp++ != '\n');
>> +    } while (*tmp++ && *tmp);
>>      ret++;
>>
>>   cleanup:
>> diff --git a/src/util/virstring.h b/src/util/virstring.h
>> index a5550e30d2e2..603650aa1588 100644
>> --- a/src/util/virstring.h
>> +++ b/src/util/virstring.h
>> @@ -288,4 +288,12 @@ bool virStringBufferIsPrintable(const uint8_t *buf, size_t buflen);
>>
>>  char *virStringEncodeBase64(const uint8_t *buf, size_t buflen);
>>
>> +static inline void
>> +virStringTrimOptionalNewline(char *str)
>> +{
>> +    char *tmp = str + strlen(str) - 1;
>> +    if (*tmp == '\n')
>> +        *tmp = '\0';
>> +}
>
>Is there any other reason for using this instead of virTrimSpaces than just
>being a bit faster? Because I think the performance gain in this case compared
>to 1 iteration of the while loop is very small, thus if possible I would avoid
>creating a function for it when there is virTrimSpaces (and I think
>virSkipSpacesBackwards would be usable too).
>

So, several factors:

  1) I wasn't looking for functions that would do what I do here, I just
     didn't want to be open-coding these three lines all the time.

  2) I didn't want it to be a separate function (hence static inline in
     the header file).

  3) I didn't know we have functions like this.

  4) Looking at these function I really don't like them.  It's the
     precise example on how trying to do everything makes it more
     useless.  It's doing super easy tiny thing that you want, but
     because it "configurable", the code is..., well, let's say "not
     very nice".

Having said that, I'm perfectly fine with changing it to using
virTrimSpaces() and hating those functions in my own free time.  I'll
just add them to my list.

>Other than that, it makes perfect sense to me, ACK.
>
>Erik
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20170406/bc2725c6/attachment-0001.sig>


More information about the libvir-list mailing list