[libvirt] [PATCH 1/2] util: implement virStrToDoubleSafe().
Julio Faracco
jcfaracco at gmail.com
Thu Jun 15 20:51:42 UTC 2017
Thanks to share the commit SHA, Martin.
My only doubt is: I speak Brazilian portuguese (so pt_BR-Latin
America and we use comma as separator). Should libvirt consider
it as a separator? Or only dot? Because this approach fails to parse
12,34 (12.34 US) for example.
2017-06-15 5:27 GMT-03:00 Martin Kletzander <mkletzan at redhat.com>:
> On Wed, Jun 14, 2017 at 01:24:42PM -0300, Julio Faracco wrote:
>>
>> Following the GNU Documentation, functions to convert double/float to
>> string
>> and vice versa, use the locale to set the mantissa separator. Some
>> languages
>> use comma and other use dot as a separator.
>>
>> For example: 1,212.67 (en_US) = 1.112,67 (pt_BR).
>>
>> This can be used to parse values in float/double from XML and other
>> definition
>> files.
>>
>> Signed-off-by: Julio Faracco <jcfaracco at gmail.com>
>> ---
>> src/libvirt_private.syms | 1 +
>> src/util/virstring.c | 31 +++++++++++++++++++++++++++++++
>> src/util/virstring.h | 4 ++++
>> 3 files changed, 36 insertions(+)
>>
>> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>> index 044510f..9d791e6 100644
>> --- a/src/libvirt_private.syms
>> +++ b/src/libvirt_private.syms
>> @@ -2659,6 +2659,7 @@ virStringTrimOptionalNewline;
>> virStrncpy;
>> virStrndup;
>> virStrToDouble;
>> +virStrToDoubleSafe;
>> virStrToLong_i;
>> virStrToLong_l;
>> virStrToLong_ll;
>> diff --git a/src/util/virstring.c b/src/util/virstring.c
>> index 089b539..6dad00f 100644
>> --- a/src/util/virstring.c
>> +++ b/src/util/virstring.c
>> @@ -537,6 +537,37 @@ virStrToDouble(char const *s,
>> }
>>
>> int
>> +virStrToDoubleSafe(char const *s,
>> + char **end_ptr,
>> + double *result)
>> +{
>> + char *cur_locale = NULL;
>> + char *saved_locale = NULL;
>> + int ret = -1;
>> +
>> + cur_locale = setlocale (LC_ALL, NULL);
>> + if (!cur_locale)
>> + return ret;
>> +
>> + if (VIR_STRDUP(saved_locale, cur_locale) < 0)
>> + goto cleanup;
>> +
>> + if (!setlocale (LC_ALL, "C"))
>> + goto cleanup;
>> +
>
>
> This is MT-Unsafe. We cannot set this for the whole process, so NACK to
> this approach. You need to use uselocale() as in commit 43bfa23e6f96
> (or just see virDoubleToStr()).
>
> Martin
More information about the libvir-list
mailing list