ref: 529349a0c7457739a1d78497a0ccc7e7d7b20dd7
parent: b98160148d250038b96881edf166880a2eb3d76e
	author: Roberto E. Vargas Caballero <k0ga@shike2.com>
	date: Thu Oct 31 03:59:12 EDT 2013
	
Simplify listdcl function We have two different cases in listdcl, variables and functions. When we have a variable we can find a initializer, but when you have a function you can have the body of the function. This simplification allows to have a linear code and a common exit point. Since this construction is very uncommon, I think isn't a big problem and we can 'extend' the language in this direction ;).
--- a/decl.c
+++ b/decl.c
@@ -266,6 +266,9 @@
static struct node *
initializer(register struct ctype *tp)
 {+	if (!accept('='))+ return NULL;
+ next();
 	if (accept('{')) {struct compound c;
@@ -287,11 +290,12 @@
listdcl(struct ctype *base, struct storage *store)
 {struct compound c;
+ char fun;
c.tree = NULL;
 	do {- struct node *np;
+ struct node *np, *aux;
register struct ctype *tp;
declarator(base, NS_IDEN);
@@ -301,15 +305,13 @@
 			error("declaration of variable with incomplete type");np = nodesym(cursym);
-		if (tp->type == FTN && yytoken == '{') {- np = node(ODEF, np, function(cursym));
- return addstmt(&c, np);
- }
-		np = node(ODEF, np, accept('=') ? initializer(tp) : NULL);- addstmt(&c, np);
-	} while (accept(','));+		fun = tp->type == FTN && yytoken == '{';+ aux = fun ? function(cursym) : initializer(tp);
+ addstmt(&c, node(ODEF, np, aux));
+	} while (!fun && accept(','));-	expect(';');+ if (!fun)
+		expect(';');return c.tree;
}
--
⑨