This breaks FcStrtod. I'd suggest one of two solutions:
1. Remove the locale check and rely on the fontconfig-provided strtod implementation in all cases, rather than using the libc one only if the decimal_point is ".". This seems preferable in general, as it prevents behavior from potentially differing based on locale.
2. Add a configure check for a working lconv struct containing a decimal_point field, and #ifdef out the check if it's not present. This maintains current behavior on locales where the decimal point is ".", but adds complexity, and any case where it causes problems would cause the same problems in other locales anyway.
Taking a look at the original code based on FcStrtod(), i.e. glib's code and I see they do ifdef with __BIONIC__ which was introduced to fix an issue on Android. does this patch work?
diff --git a/src/fcxml.c b/src/fcxml.c
index cd8fff1..f9b5975 100644
@@ -1352,7 +1352,11 @@ FcParseInt (FcConfigParse *parse)
FcStrtod (char *s, char **end)
struct lconv *locale_data;
+ const char *decimal_point;
+ int dlen;
@@ -1360,14 +1364,21 @@ FcStrtod (char *s, char **end)
* Have to swap the decimal point to match the current locale
* if that locale doesn't use 0x2e
+ locale_data = localeconv ();
+ decimal_point = locale_data->decimal_point;
+ dlen = strlen (decimal_point);
+ decimal_point = ".";
+ dlen = 1;
if ((dot = strchr (s, 0x2e)) &&
- (locale_data = localeconv ()) &&
- (locale_data->decimal_point != 0x2e ||
- locale_data->decimal_point != 0))
+ (decimal_point != 0x2e ||
+ decimal_point != 0))
int slen = strlen (s);
- int dlen = strlen (locale_data->decimal_point);
if (slen + dlen > (int) sizeof (buf))
(In reply to Akira TAGOH from comment #1)
> Taking a look at the original code based on FcStrtod(), i.e. glib's code and
meant "Taking a look at the original code of FcStrtod() borrowing from"
There's still a use of locale_data later in the function:
fcxml.c: In function 'FcStrtod':
fcxml.c:1388:31: error: 'locale_data' undeclared (first use in this function)
strcpy (buf + (dot - s), locale_data->decimal_point);
fcxml.c:1388:31: note: each undeclared identifier is reported only once for each function it appears in
I'd imagine you'll just want to change that to use the local `decimal_point` variable. Otherwise, looks fine.
Ah, yes. you're right.
Okay, committed the change in git after replacing one more locale_data thing.