spa: add locale independent spa_dtoa

And use this in spa_json_format_float() where we also avoid invalid
json floats.
Use json float format in some places where we serialize json floats.
Add a unit test.

See #2223
This commit is contained in:
Wim Taymans 2022-03-21 10:41:44 +01:00
parent 5f4d031db0
commit 2b16df4e89
6 changed files with 40 additions and 13 deletions

View file

@ -258,14 +258,17 @@ static inline int spa_json_get_float(struct spa_json *iter, float *res)
return spa_json_parse_float(value, len, res);
}
static inline char *spa_json_format_double(char *str, int size, const double val)
static inline char *spa_json_format_float(char *str, int size, float val)
{
int i, l;
l = snprintf(str, size, "%f", val);
for (i = 0; i < l; i++)
if (str[i] == ',')
str[i] = '.';
return str;
if (SPA_UNLIKELY(!isnormal(val))) {
if (val == INFINITY)
val = FLT_MAX;
else if (val == -INFINITY)
val = FLT_MIN;
else
val = 0.0f;
}
return spa_dtoa(str, size, val);
}
/* int */

View file

@ -354,6 +354,16 @@ static inline bool spa_atod(const char *str, double *val)
return true;
}
static inline char *spa_dtoa(char *str, size_t size, double val)
{
int i, l;
l = spa_scnprintf(str, size, "%f", val);
for (i = 0; i < l; i++)
if (str[i] == ',')
str[i] = '.';
return str;
}
/**
* \}
*/