[PATCH wayland v3 1/3] scanner: refactor creating objects

Marek Chalupa mchqwerty at gmail.com
Thu Jul 30 06:07:20 PDT 2015


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>
---
 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



More information about the wayland-devel mailing list