[PATCH v2 3/4] scanner: enforce correct argument type for enums

Auke Booij auke at tulcod.com
Wed Oct 21 06:23:53 PDT 2015


On 20 October 2015 at 08:57, Bryce Harrington <bryce at osg.samsung.com> wrote:
> On Mon, Oct 19, 2015 at 11:21:25PM +0100, Auke Booij wrote:
>> Signed-off-by: Auke Booij <auke at tulcod.com>
>> ---
>>  src/scanner.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 70 insertions(+)
>>
>> diff --git a/src/scanner.c b/src/scanner.c
>> index f456aa5..9856475 100644
>> --- a/src/scanner.c
>> +++ b/src/scanner.c
>> @@ -128,6 +128,7 @@ struct arg {
>>       char *interface_name;
>>       struct wl_list link;
>>       char *summary;
>> +     char *enumeration_name;
>>  };
>>
>>  struct enumeration {
>> @@ -136,6 +137,7 @@ struct enumeration {
>>       struct wl_list entry_list;
>>       struct wl_list link;
>>       struct description *description;
>> +     int bitfield;
>
> Looks like this code only sets this to 0 or 1; may as well make this bool.
> Other places in scanner.c use bool, so seems to be perfectly allowable.

Sure, I will change this.

>>  };
>>
>>  struct entry {
>> @@ -540,6 +542,8 @@ start_element(void *data, const char *element_name, const char **atts)
>>       const char *summary = NULL;
>>       const char *since = NULL;
>>       const char *allow_null = NULL;
>> +     const char *enumeration_name = NULL;
>> +     const char *bitfield = NULL;
>>       int i, version = 0;
>>
>>       ctx->loc.line_number = XML_GetCurrentLineNumber(ctx->parser);
>> @@ -562,6 +566,10 @@ start_element(void *data, const char *element_name, const char **atts)
>>                       since = atts[i + 1];
>>               if (strcmp(atts[i], "allow-null") == 0)
>>                       allow_null = atts[i + 1];
>> +             if (strcmp(atts[i], "enum") == 0)
>> +                     enumeration_name = atts[i + 1];
>> +             if (strcmp(atts[i], "bitfield") == 0)
>> +                     bitfield = atts[i + 1];
>>       }
>>
>>       ctx->character_data_length = 0;
>> @@ -655,6 +663,14 @@ start_element(void *data, const char *element_name, const char **atts)
>>                                    "allow-null is only valid for objects, strings, and arrays");
>>               }
>>
>> +             if (enumeration_name == NULL || strcmp(enumeration_name, "") == 0)
>> +                     arg->enumeration_name = NULL;
>> +             else
>> +                     arg->enumeration_name = xstrdup(enumeration_name);
>> +
>> +             if (allow_null != NULL && !is_nullable_type(arg))
>> +                     fail(&ctx->loc, "allow-null is only valid for objects, strings, and arrays");
>> +
>>               if (summary)
>>                       arg->summary = xstrdup(summary);
>>
>> @@ -665,6 +681,14 @@ start_element(void *data, const char *element_name, const char **atts)
>>                       fail(&ctx->loc, "no enum name given");
>>
>>               enumeration = create_enumeration(name);
>> +
>> +             if (bitfield == NULL || strcmp(bitfield, "false") == 0)
>> +                     enumeration->bitfield = 0;
>> +             else if (strcmp(bitfield, "true") == 0)
>> +                     enumeration->bitfield =1;
>
> Would it be worth allowing True/False as well?

Well this might be worth thinking about a bit more. I don't think
there are any boolean fields in other wayland configuration (correct
me if I'm wrong), so whatever we choose, it will set a precedence.
Should I also allow 0/1? Yes/No? (Xorg seems to be rather lax in all
this.)

>> +             else
>> +                     fail(&ctx->loc, "invalid value for bitfield attribute (%s)", bitfield);
>
> May as well say here that only true/false are accepted in bitfields.
> Might save anyone that hits this from a trip to the documentation.

I will fix this.


More information about the wayland-devel mailing list