mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
util: Extract locale-related fixes into separate functions
Signed-off-by: Martin Kletzander <mkletzan@redhat.com> Signed-off-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
parent
c578b515cb
commit
8110b4e073
@ -521,19 +521,81 @@ virStrToLong_ullp(char const *s, char **end_ptr, int base,
|
|||||||
/* In case thread-safe locales are available */
|
/* In case thread-safe locales are available */
|
||||||
#if HAVE_NEWLOCALE
|
#if HAVE_NEWLOCALE
|
||||||
|
|
||||||
static locale_t virLocale;
|
typedef locale_t virLocale;
|
||||||
|
static virLocale virLocaleRaw;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virLocaleOnceInit(void)
|
virLocaleOnceInit(void)
|
||||||
{
|
{
|
||||||
virLocale = newlocale(LC_ALL_MASK, "C", (locale_t)0);
|
virLocaleRaw = newlocale(LC_ALL_MASK, "C", (locale_t)0);
|
||||||
if (!virLocale)
|
if (!virLocaleRaw)
|
||||||
return -1;
|
return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
VIR_ONCE_GLOBAL_INIT(virLocale);
|
VIR_ONCE_GLOBAL_INIT(virLocale);
|
||||||
#endif
|
|
||||||
|
/**
|
||||||
|
* virLocaleSetRaw:
|
||||||
|
*
|
||||||
|
* @oldlocale: set to old locale pointer
|
||||||
|
*
|
||||||
|
* Sets the locale to 'C' to allow operating on non-localized objects.
|
||||||
|
* Returns 0 on success -1 on error.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
virLocaleSetRaw(virLocale *oldlocale)
|
||||||
|
{
|
||||||
|
if (virLocaleInitialize() < 0)
|
||||||
|
return -1;
|
||||||
|
*oldlocale = uselocale(virLocaleRaw);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
virLocaleRevert(virLocale *oldlocale)
|
||||||
|
{
|
||||||
|
uselocale(*oldlocale);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
virLocaleFixupRadix(char **strp ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* !HAVE_NEWLOCALE */
|
||||||
|
|
||||||
|
typedef int virLocale;
|
||||||
|
|
||||||
|
static int
|
||||||
|
virLocaleSetRaw(virLocale *oldlocale ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
virLocaleRevert(virLocale *oldlocale ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
virLocaleFixupRadix(char **strp)
|
||||||
|
{
|
||||||
|
char *radix, *tmp;
|
||||||
|
struct lconv *lc;
|
||||||
|
|
||||||
|
lc = localeconv();
|
||||||
|
radix = lc->decimal_point;
|
||||||
|
tmp = strstr(*strp, radix);
|
||||||
|
if (tmp) {
|
||||||
|
*tmp = '.';
|
||||||
|
if (strlen(radix) > 1)
|
||||||
|
memmove(tmp + 1, tmp + strlen(radix), strlen(*strp) - (tmp - *strp));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !HAVE_NEWLOCALE */
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virStrToDouble
|
* virStrToDouble
|
||||||
@ -547,22 +609,17 @@ virStrToDouble(char const *s,
|
|||||||
char **end_ptr,
|
char **end_ptr,
|
||||||
double *result)
|
double *result)
|
||||||
{
|
{
|
||||||
|
virLocale oldlocale;
|
||||||
double val;
|
double val;
|
||||||
char *p;
|
char *p;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
#if HAVE_NEWLOCALE
|
if (virLocaleSetRaw(&oldlocale) < 0)
|
||||||
locale_t old_loc;
|
|
||||||
if (virLocaleInitialize() < 0)
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
old_loc = uselocale(virLocale);
|
|
||||||
#endif
|
|
||||||
val = strtod(s, &p); /* exempt from syntax-check */
|
val = strtod(s, &p); /* exempt from syntax-check */
|
||||||
#if HAVE_NEWLOCALE
|
virLocaleRevert(&oldlocale);
|
||||||
uselocale(old_loc);
|
|
||||||
#endif
|
|
||||||
err = (errno || (!end_ptr && *p) || p == s);
|
err = (errno || (!end_ptr && *p) || p == s);
|
||||||
if (end_ptr)
|
if (end_ptr)
|
||||||
*end_ptr = p;
|
*end_ptr = p;
|
||||||
@ -582,38 +639,17 @@ virStrToDouble(char const *s,
|
|||||||
int
|
int
|
||||||
virDoubleToStr(char **strp, double number)
|
virDoubleToStr(char **strp, double number)
|
||||||
{
|
{
|
||||||
|
virLocale oldlocale;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
#if HAVE_NEWLOCALE
|
if (virLocaleSetRaw(&oldlocale) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
locale_t old_loc;
|
|
||||||
|
|
||||||
if (virLocaleInitialize() < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
old_loc = uselocale(virLocale);
|
|
||||||
ret = virAsprintf(strp, "%lf", number);
|
ret = virAsprintf(strp, "%lf", number);
|
||||||
uselocale(old_loc);
|
|
||||||
|
|
||||||
#else
|
virLocaleRevert(&oldlocale);
|
||||||
|
virLocaleFixupRadix(strp);
|
||||||
|
|
||||||
char *radix, *tmp;
|
|
||||||
struct lconv *lc;
|
|
||||||
|
|
||||||
if ((ret = virAsprintf(strp, "%lf", number) < 0))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
lc = localeconv();
|
|
||||||
radix = lc->decimal_point;
|
|
||||||
tmp = strstr(*strp, radix);
|
|
||||||
if (tmp) {
|
|
||||||
*tmp = '.';
|
|
||||||
if (strlen(radix) > 1)
|
|
||||||
memmove(tmp + 1, tmp + strlen(radix), strlen(*strp) - (tmp - *strp));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* HAVE_NEWLOCALE */
|
|
||||||
error:
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user