[PATCH wayland v2 1/2] scanner: refactor creating objects

Derek Foreman derekf at osg.samsung.com
Thu Jul 23 10:59:08 PDT 2015


These both look OK to me now...

Reviewed-By: Derek Foreman <derekf at osg.samsung.com>

On 23/07/15 12:39 AM, Marek Chalupa wrote:
> wrap creating and initializing objects (structures)
> into functions and use them in the code.
> 
> Signed-off-by: Marek Chalupa <mchqwerty at gmail.com>
> ---
>  src/scanner.c | 158 ++++++++++++++++++++++++++++++++++++++--------------------
>  1 file changed, 105 insertions(+), 53 deletions(-)
> 
> diff --git a/src/scanner.c b/src/scanner.c
> index 7d8cfb9..85c283b 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,102 @@ 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, const char *type)
> +{
> +	struct arg *arg;
> +
> +	arg = xmalloc(sizeof *arg);
> +	arg->name = xstrdup(name);
> +	arg->summary = NULL;
> +	arg->interface_name = NULL;
> +
> +	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 NULL;
> +
> +	return arg;
> +}
> +
> +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 +473,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 +521,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, type);
> +		if (!arg)
>  			fail(&ctx->loc, "unknown type (%s)", type);
> -		}
>  
>  		switch (arg->type) {
>  		case NEW_ID:
> @@ -472,8 +534,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 +551,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 +560,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 +569,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
> 



More information about the wayland-devel mailing list