shared: add nm_g_ascii_strtod() to workaround bug

This commit is contained in:
Thomas Haller 2020-04-01 12:26:20 +02:00
parent f4446e34c6
commit 35a9f632a8
2 changed files with 40 additions and 0 deletions

View file

@ -1021,6 +1021,43 @@ again:
return v;
}
/* see nm_g_ascii_strtoll(). */
double
nm_g_ascii_strtod (const char *nptr,
char **endptr)
{
int try_count = 2;
double v;
int errsv;
nm_assert (nptr);
again:
v = g_ascii_strtod (nptr, endptr);
errsv = errno;
if (errsv == 0)
return v;
if (errsv == ERANGE)
return v;
if (try_count-- > 0)
goto again;
#if NM_MORE_ASSERTS
g_critical ("g_ascii_strtod() for \"%s\" failed with errno=%d (%s) and v=%f",
nptr,
errsv,
nm_strerror_native (errsv),
v);
#endif
/* Not really much else to do. Return the parsed value and leave errno set
* to the unexpected value. */
return v;
}
/* _nm_utils_ascii_str_to_int64:
*
* A wrapper for g_ascii_strtoll, that checks whether the whole string

View file

@ -661,6 +661,9 @@ gint64 nm_g_ascii_strtoll (const char *nptr,
char **endptr,
guint base);
double nm_g_ascii_strtod (const char *nptr,
char **endptr);
gint64 _nm_utils_ascii_str_to_int64 (const char *str, guint base, gint64 min, gint64 max, gint64 fallback);
guint64 _nm_utils_ascii_str_to_uint64 (const char *str, guint base, guint64 min, guint64 max, guint64 fallback);