[PATCH wayland v3 1/3] scanner: refactor creating objects
Bryce Harrington
bryce at osg.samsung.com
Thu Jul 30 17:58:05 PDT 2015
On Thu, Jul 30, 2015 at 03:07:20PM +0200, Marek Chalupa wrote:
> wrap creating and initializing objects (structures)
> into functions and use them in the code.
>
> v2. make create_.* functions consistent
> (no func will return NULL)
>
> Signed-off-by: Marek Chalupa <mchqwerty at gmail.com>
Looks good
Reviewed-by: Bryce Harrington <bryce at osg.samsung.com>
> ---
> src/scanner.c | 164 +++++++++++++++++++++++++++++++++++++++-------------------
> 1 file changed, 111 insertions(+), 53 deletions(-)
>
> diff --git a/src/scanner.c b/src/scanner.c
> index 7d8cfb9..da33818 100644
> --- a/src/scanner.c
> +++ b/src/scanner.c
> @@ -1,6 +1,7 @@
> /*
> * Copyright © 2008-2011 Kristian Høgsberg
> * Copyright © 2011 Intel Corporation
> + * Copyright © 2015 Red Hat, Inc.
> *
> * Permission is hereby granted, free of charge, to any person obtaining
> * a copy of this software and associated documentation files (the
> @@ -315,6 +316,108 @@ is_nullable_type(struct arg *arg)
> }
> }
>
> +static struct message *
> +create_message(struct location loc, const char *name)
> +{
> + struct message *message;
> +
> + message = xmalloc(sizeof *message);
> + message->loc = loc;
> + message->name = xstrdup(name);
> + message->uppercase_name = uppercase_dup(name);
> + wl_list_init(&message->arg_list);
> + message->arg_count = 0;
> + message->new_id_count = 0;
> + message->description = NULL;
> +
> + return message;
> +}
> +
> +static struct arg *
> +create_arg(const char *name)
> +{
> + struct arg *arg;
> +
> + arg = xmalloc(sizeof *arg);
> + arg->name = xstrdup(name);
> + arg->summary = NULL;
> + arg->interface_name = NULL;
> +
> + return arg;
> +}
> +
> +static bool
> +set_arg_type(struct arg *arg, const char *type)
> +{
> + if (strcmp(type, "int") == 0)
> + arg->type = INT;
> + else if (strcmp(type, "uint") == 0)
> + arg->type = UNSIGNED;
> + else if (strcmp(type, "fixed") == 0)
> + arg->type = FIXED;
> + else if (strcmp(type, "string") == 0)
> + arg->type = STRING;
> + else if (strcmp(type, "array") == 0)
> + arg->type = ARRAY;
> + else if (strcmp(type, "fd") == 0)
> + arg->type = FD;
> + else if (strcmp(type, "new_id") == 0)
> + arg->type = NEW_ID;
> + else if (strcmp(type, "object") == 0)
> + arg->type = OBJECT;
> + else
> + return false;
> +
> + return true;
> +}
> +
> +static struct enumeration *
> +create_enumeration(const char *name)
> +{
> + struct enumeration *enumeration;
> +
> + enumeration = xmalloc(sizeof *enumeration);
> + enumeration->name = xstrdup(name);
> + enumeration->uppercase_name = uppercase_dup(name);
> + enumeration->description = NULL;
> +
> + wl_list_init(&enumeration->entry_list);
> +
> + return enumeration;
> +}
> +
> +static struct entry *
> +create_entry(const char *name, const char *value)
> +{
> + struct entry *entry;
> +
> + entry = xmalloc(sizeof *entry);
> + entry->name = xstrdup(name);
> + entry->uppercase_name = uppercase_dup(name);
> + entry->value = xstrdup(value);
> +
> + return entry;
> +}
> +
> +static struct interface *
> +create_interface(struct location loc, const char *name, int version)
> +{
> + struct interface *interface;
> +
> + interface = xmalloc(sizeof *interface);
> + interface->loc = loc;
> + interface->name = xstrdup(name);
> + 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);
> +
> + return interface;
> +}
> +
> static void
> start_element(void *data, const char *element_name, const char **atts)
> {
> @@ -376,32 +479,16 @@ start_element(void *data, const char *element_name, const char **atts)
> if (version == 0)
> fail(&ctx->loc, "no interface version given");
>
> - interface = xmalloc(sizeof *interface);
> - interface->loc = ctx->loc;
> - interface->name = xstrdup(name);
> - 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);
> + interface = create_interface(ctx->loc, name, version);
> + ctx->interface = interface;
> wl_list_insert(ctx->protocol->interface_list.prev,
> &interface->link);
> - ctx->interface = interface;
> } else if (strcmp(element_name, "request") == 0 ||
> strcmp(element_name, "event") == 0) {
> if (name == NULL)
> fail(&ctx->loc, "no request name given");
>
> - message = xmalloc(sizeof *message);
> - message->loc = ctx->loc;
> - message->name = xstrdup(name);
> - message->uppercase_name = uppercase_dup(name);
> - wl_list_init(&message->arg_list);
> - message->arg_count = 0;
> - message->new_id_count = 0;
> - message->description = NULL;
> + message = create_message(ctx->loc, name);
>
> if (strcmp(element_name, "request") == 0)
> wl_list_insert(ctx->interface->request_list.prev,
> @@ -440,28 +527,9 @@ start_element(void *data, const char *element_name, const char **atts)
> if (name == NULL)
> fail(&ctx->loc, "no argument name given");
>
> - arg = xmalloc(sizeof *arg);
> - arg->name = xstrdup(name);
> -
> - if (strcmp(type, "int") == 0)
> - arg->type = INT;
> - else if (strcmp(type, "uint") == 0)
> - arg->type = UNSIGNED;
> - else if (strcmp(type, "fixed") == 0)
> - arg->type = FIXED;
> - else if (strcmp(type, "string") == 0)
> - arg->type = STRING;
> - else if (strcmp(type, "array") == 0)
> - arg->type = ARRAY;
> - else if (strcmp(type, "fd") == 0)
> - arg->type = FD;
> - else if (strcmp(type, "new_id") == 0) {
> - arg->type = NEW_ID;
> - } else if (strcmp(type, "object") == 0) {
> - arg->type = OBJECT;
> - } else {
> + arg = create_arg(name);
> + if (!set_arg_type(arg, type))
> fail(&ctx->loc, "unknown type (%s)", type);
> - }
>
> switch (arg->type) {
> case NEW_ID:
> @@ -472,8 +540,6 @@ start_element(void *data, const char *element_name, const char **atts)
> case OBJECT:
> if (interface_name)
> arg->interface_name = xstrdup(interface_name);
> - else
> - arg->interface_name = NULL;
> break;
> default:
> if (interface_name != NULL)
> @@ -491,7 +557,6 @@ start_element(void *data, const char *element_name, const char **atts)
> if (allow_null != NULL && !is_nullable_type(arg))
> fail(&ctx->loc, "allow-null is only valid for objects, strings, and arrays");
>
> - arg->summary = NULL;
> if (summary)
> arg->summary = xstrdup(summary);
>
> @@ -501,12 +566,7 @@ start_element(void *data, const char *element_name, const char **atts)
> if (name == NULL)
> fail(&ctx->loc, "no enum name given");
>
> - enumeration = xmalloc(sizeof *enumeration);
> - enumeration->name = xstrdup(name);
> - enumeration->uppercase_name = uppercase_dup(name);
> - enumeration->description = NULL;
> - wl_list_init(&enumeration->entry_list);
> -
> + enumeration = create_enumeration(name);
> wl_list_insert(ctx->interface->enumeration_list.prev,
> &enumeration->link);
>
> @@ -515,10 +575,8 @@ start_element(void *data, const char *element_name, const char **atts)
> if (name == NULL)
> fail(&ctx->loc, "no entry name given");
>
> - entry = xmalloc(sizeof *entry);
> - entry->name = xstrdup(name);
> - entry->uppercase_name = uppercase_dup(name);
> - entry->value = xstrdup(value);
> + entry = create_entry(name, value);
> +
> if (summary)
> entry->summary = xstrdup(summary);
> else
> --
> 2.4.3
>
> _______________________________________________
> 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