diff options
Diffstat (limited to 'src/scanner.c')
-rw-r--r-- | src/scanner.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/scanner.c b/src/scanner.c index 48eea25..bdb9a56 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -57,6 +57,7 @@ struct interface { char *name; char *uppercase_name; int version; + int since; struct wl_list request_list; struct wl_list event_list; struct wl_list enumeration_list; @@ -73,6 +74,7 @@ struct message { int type_index; int all_null; int destructor; + int since; struct description *description; }; @@ -189,7 +191,8 @@ start_element(void *data, const char *element_name, const char **atts) struct enumeration *enumeration; struct entry *entry; struct description *description; - const char *name, *type, *interface_name, *value, *summary; + const char *name, *type, *interface_name, *value, *summary, *since; + char *end; int i, version; name = NULL; @@ -199,6 +202,7 @@ start_element(void *data, const char *element_name, const char **atts) value = NULL; summary = NULL; description = NULL; + since = NULL; for (i = 0; atts[i]; i += 2) { if (strcmp(atts[i], "name") == 0) name = atts[i + 1]; @@ -212,6 +216,8 @@ start_element(void *data, const char *element_name, const char **atts) interface_name = atts[i + 1]; if (strcmp(atts[i], "summary") == 0) summary = atts[i + 1]; + if (strcmp(atts[i], "since") == 0) + since = atts[i + 1]; } ctx->character_data_length = 0; @@ -236,6 +242,7 @@ start_element(void *data, const char *element_name, const char **atts) interface->uppercase_name = uppercase_dup(name); interface->version = version; interface->description = NULL; + interface->since = 1; wl_list_init(&interface->request_list); wl_list_init(&interface->event_list); wl_list_init(&interface->enumeration_list); @@ -266,6 +273,17 @@ start_element(void *data, const char *element_name, const char **atts) else message->destructor = 0; + if (since != NULL) { + version = strtol(since, &end, 0); + if (errno == EINVAL || end == since || *end != '\0') + fail(ctx, "invalid integer\n"); + if (version <= ctx->interface->since) + fail(ctx, "since version not increasing\n"); + ctx->interface->since = version; + } + + message->since = ctx->interface->since; + if (strcmp(name, "destroy") == 0 && !message->destructor) fail(ctx, "destroy request should be destructor type"); @@ -704,6 +722,9 @@ emit_structs(struct wl_list *message_list, struct interface *interface) desc_dump(mdesc->text, 8); printf("\n"); } + if (m->since > 1) { + printf("\t * @since: %d\n", m->since); + } printf("\t */\n"); printf("\tvoid (*%s)(", m->name); |