[PATCH v2 wayland] protocol: add support for cross-interface enum attributes
Nils Chr. Brause
nilschrbrause at gmail.com
Wed Dec 2 07:19:52 PST 2015
On Wed, Dec 2, 2015 at 11:48 AM, Auke Booij <auke at tulcod.com> wrote:
> I'd be happy to rebase against that, but since that hasn't been merged
> yet, I thought I'd take the current tree as a a basis.
>
> If you think having the interface:: prefix everywhere makes sense, I
> can change that if you want.
I think that would be very nice for consistency. :)
>
> On 2 December 2015 at 03:09, Bill Spitzak <spitzak at gmail.com> wrote:
>> Looks correct to me.
>>
>> I had a slightly different patch in patchwork which changes
>> protocol-to-docbook. It puts the enumeration into it's own statement, rather
>> than a nested if statement, and it adds the object:: prefix to the
>> documentation for all enumerations, not just the cross-object ones.
>>
>> On Sun, Nov 29, 2015 at 5:54 AM, Auke Booij <auke at tulcod.com> wrote:
>>>
>>> The enum attribute, for which scanner support was introduced in
>>> 1771299, can be used to link message arguments to <enum>s. However,
>>> some arguments refer to <enum>s in a different <interface>.
>>>
>>> This adds scanner support for referring to an <enum> in a different
>>> <interface> using dot notation. It also sets the attributes in this
>>> style in the wayland XML protocol (wl_shm_pool::create_buffer::format
>>> to wl_shm::format, and wl_surface::set_buffer_transform::transform to
>>> wl_output::transform), and updates the documentation XSL so that this
>>> new style is supported.
>>>
>>> Changes since v1:
>>> - several implementation bugs fixed
>>>
>>> Signed-off-by: Auke Booij <auke at tulcod.com>
>>> ---
>>> doc/publican/protocol-to-docbook.xsl | 17 +++++++++--
>>> protocol/wayland.xml | 4 +--
>>> src/scanner.c | 59
>>> +++++++++++++++++++++++++++---------
>>> 3 files changed, 61 insertions(+), 19 deletions(-)
>>>
>>> diff --git a/doc/publican/protocol-to-docbook.xsl
>>> b/doc/publican/protocol-to-docbook.xsl
>>> index fad207a..1fa066d 100644
>>> --- a/doc/publican/protocol-to-docbook.xsl
>>> +++ b/doc/publican/protocol-to-docbook.xsl
>>> @@ -103,9 +103,20 @@
>>> <listitem>
>>> <simpara>
>>> <xsl:if test="@enum">
>>> - <link linkend="protocol-spec-{../../@name}-enum-{@enum}">
>>> - <xsl:value-of select="@enum"/>
>>> - </link>
>>> + <xsl:choose>
>>> + <xsl:when test="contains(@enum, '.')">
>>> + <link linkend="protocol-spec-{substring-before(@enum,
>>> '.')}-enum-{substring-after(@enum, '.')}">
>>> + <xsl:value-of select="substring-before(@enum, '.')"/>
>>> + <xsl:text>::</xsl:text>
>>> + <xsl:value-of select="substring-after(@enum, '.')"/>
>>> + </link>
>>> + </xsl:when>
>>> + <xsl:otherwise>
>>> + <link linkend="protocol-spec-{../../@name}-enum-{@enum}">
>>> + <xsl:value-of select="@enum"/>
>>> + </link>
>>> + </xsl:otherwise>
>>> + </xsl:choose>
>>> <xsl:text> </xsl:text>
>>> </xsl:if>
>>> <xsl:value-of select="@type"/>
>>> diff --git a/protocol/wayland.xml b/protocol/wayland.xml
>>> index f9e6d76..0873553 100644
>>> --- a/protocol/wayland.xml
>>> +++ b/protocol/wayland.xml
>>> @@ -229,7 +229,7 @@
>>> <arg name="width" type="int"/>
>>> <arg name="height" type="int"/>
>>> <arg name="stride" type="int"/>
>>> - <arg name="format" type="uint"/>
>>> + <arg name="format" type="uint" enum="wl_shm.format"/>
>>> </request>
>>>
>>> <request name="destroy" type="destructor">
>>> @@ -1292,7 +1292,7 @@
>>> wl_output.transform enum the invalid_transform protocol error
>>> is raised.
>>> </description>
>>> - <arg name="transform" type="int"/>
>>> + <arg name="transform" type="int" enum="wl_output.transform"/>
>>> </request>
>>>
>>> <!-- Version 3 additions -->
>>> diff --git a/src/scanner.c b/src/scanner.c
>>> index 406519f..e69bd2a 100644
>>> --- a/src/scanner.c
>>> +++ b/src/scanner.c
>>> @@ -785,32 +785,62 @@ start_element(void *data, const char *element_name,
>>> const char **atts)
>>> }
>>> }
>>>
>>> +static struct enumeration *
>>> +find_enumeration(struct protocol *protocol, struct interface *interface,
>>> char *enum_attribute)
>>> +{
>>> + struct interface *i;
>>> + struct enumeration *e, *f = NULL;
>>> + char *enum_name;
>>> + int idx = 0, j;
>>> +
>>> + for (j = 0; j + 1 < (int)strlen(enum_attribute); j++) {
>>> + if (enum_attribute[j] == '.') {
>>> + idx = j;
>>> + }
>>> + }
>>> +
>>> + if (idx > 0) {
>>> + enum_name = enum_attribute + idx + 1;
>>> +
>>> + wl_list_for_each(i, &protocol->interface_list, link)
>>> + if (strncmp(i->name, enum_attribute, idx) == 0)
>>> + wl_list_for_each(e, &i->enumeration_list,
>>> link)
>>> + if(strcmp(e->name, enum_name) ==
>>> 0)
>>> + f = e;
>>> + } else if (interface) {
>>> + enum_name = enum_attribute;
>>> +
>>> + wl_list_for_each(e, &interface->enumeration_list, link)
>>> + if(strcmp(e->name, enum_name) == 0)
>>> + f = e;
>>> + }
>>> +
>>> + return f;
>>> +}
>>> +
>>> static void
>>> -verify_arguments(struct parse_context *ctx, struct wl_list *messages,
>>> struct wl_list *enumerations)
>>> +verify_arguments(struct parse_context *ctx, struct interface *interface,
>>> struct wl_list *messages, struct wl_list *enumerations)
>>> {
>>> struct message *m;
>>> wl_list_for_each(m, messages, link) {
>>> struct arg *a;
>>> wl_list_for_each(a, &m->arg_list, link) {
>>> - struct enumeration *e, *f;
>>> + struct enumeration *e;
>>>
>>> if (!a->enumeration_name)
>>> continue;
>>>
>>> - f = NULL;
>>> - wl_list_for_each(e, enumerations, link) {
>>> - if(strcmp(e->name, a->enumeration_name) ==
>>> 0)
>>> - f = e;
>>> - }
>>>
>>> - if (f == NULL)
>>> + e = find_enumeration(ctx->protocol, interface,
>>> a->enumeration_name);
>>> +
>>> + if (e == NULL)
>>> fail(&ctx->loc,
>>> "could not find enumeration %s",
>>> a->enumeration_name);
>>>
>>> switch (a->type) {
>>> case INT:
>>> - if (f->bitfield)
>>> + if (e->bitfield)
>>> fail(&ctx->loc,
>>> "bitfield-style enum must
>>> only be referenced by uint");
>>> break;
>>> @@ -848,12 +878,13 @@ end_element(void *data, const XML_Char *name)
>>> ctx->enumeration->name);
>>> }
>>> ctx->enumeration = NULL;
>>> - } else if (strcmp(name, "interface") == 0) {
>>> - struct interface *i = ctx->interface;
>>> -
>>> - verify_arguments(ctx, &i->request_list,
>>> &i->enumeration_list);
>>> - verify_arguments(ctx, &i->event_list,
>>> &i->enumeration_list);
>>> + } else if (strcmp(name, "protocol") == 0) {
>>> + struct interface *i;
>>>
>>> + wl_list_for_each(i, &ctx->protocol->interface_list, link)
>>> {
>>> + verify_arguments(ctx, i, &i->request_list,
>>> &i->enumeration_list);
>>> + verify_arguments(ctx, i, &i->event_list,
>>> &i->enumeration_list);
>>> + }
>>> }
>>> }
>>>
>>> --
>>> 2.6.2
>>>
>>> _______________________________________________
>>> wayland-devel mailing list
>>> wayland-devel at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>>
>>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list