[PATCH v2 wayland] protocol: add support for cross-interface enum attributes
Bill Spitzak
spitzak at gmail.com
Tue Dec 1 19:09:48 PST 2015
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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20151201/95660469/attachment-0001.html>
More information about the wayland-devel
mailing list