On Wed, Dec 2, 2015 at 11:48 AM, Auke Booij <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> >>> --- >>> 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 >>> [email protected] >>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel >> >> > _______________________________________________ > wayland-devel mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/wayland-devel _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
