Fix test-conf string to integer conversion.

The test-conf build_pattern attempted to convert known constant strings
into integer values. However, it did so by always converting the string
value to an integer if possible and then complaining if the key wasn't
of the expected type. This lead to error messages on "style": "Regular"
since "Regular" was recognized as "weight".

Instead, only attempt conversion from string to integer if the key is
the name of an object which can take an integer type. This eliminates
the spurious non-fatal errors reported when parsing
test-90-synthetic.json.

This also fixes an issue where the created value was given the type of
the object found, but the integer field was assigned. Instead, check
that the object type can take an integer and always set the value type
to integer.
This commit is contained in:
Ben Wagner 2020-12-15 16:30:14 -05:00
parent b35c72dbc7
commit 921ede9f46
1 changed files with 16 additions and 13 deletions

View File

@ -69,22 +69,25 @@ build_pattern (json_object *obj)
}
else if (json_object_get_type (iter.val) == json_type_string)
{
const FcConstant *c = FcNameGetConstant ((const FcChar8 *) json_object_get_string (iter.val));
FcBool b;
if (c)
const FcObjectType *o = FcNameGetObjectType (iter.key);
if (o && (o->type == FcTypeRange || o->type == FcTypeDouble || o->type == FcTypeInteger))
{
const FcObjectType *o;
if (strcmp (c->object, iter.key) != 0)
{
fprintf (stderr, "E: invalid object type for const\n");
fprintf (stderr, " actual result: %s\n", iter.key);
fprintf (stderr, " expected result: %s\n", c->object);
const FcConstant *c = FcNameGetConstant ((const FcChar8 *) json_object_get_string (iter.val));
if (!c) {
fprintf (stderr, "E: value is not a known constant\n");
fprintf (stderr, " key: %s\n", iter.key);
fprintf (stderr, " val: %s\n", json_object_get_string (iter.val));
continue;
}
o = FcNameGetObjectType (c->object);
v.type = o->type;
if (strcmp (c->object, iter.key) != 0)
{
fprintf (stderr, "E: value is a constant of different object\n");
fprintf (stderr, " key: %s\n", iter.key);
fprintf (stderr, " val: %s\n", json_object_get_string (iter.val));
fprintf (stderr, " key implied by value: %s\n", c->object);
continue;
}
v.type = FcTypeInteger;
v.u.i = c->value;
}
else if (strcmp (json_object_get_string (iter.val), "DontCare") == 0)