shithub: scc

Download patch

ref: 8a299a6aad02762c54b653af2551edae7cd62e53
parent: a0eb6b42c41d7bf2f7a30374f975f927aa78b1d9
author: Roberto E. Vargas Caballero <[email protected]>
date: Wed Aug 15 17:03:10 EDT 2012

Added nodes of type node_comp

These nodes will be used later for the compound blocks, which are a set of
expressions. So this new node has a realloc'ed buffer of childs, instead of
having dedicated pointer for them.

--- a/syntax.h
+++ b/syntax.h
@@ -10,7 +10,7 @@
 	OSHR, OLT, OGT, OGE, OLE, OEQ, ONE, OBAND, OBXOR,
 	OBOR, OAND, OOR, OTERN, OASSIGN, OA_MUL, OA_DIV,
 	OA_MOD, OA_ADD, OA_SUB, OA_SHL, OA_SHR, OA_AND,
-	OA_XOR, OA_OR, OSYM
+	OA_XOR, OA_OR, OSYM, OCOMP
 };
 
 struct node;
@@ -21,17 +21,15 @@
 extern unsigned char decl(void);
 extern void type_name(void);
 
-extern struct node *
-node3(unsigned char op, struct node *l, struct node *i, struct node *r);
+extern struct node *node3(unsigned char op,
+			  struct node *l, struct node *i, struct node *r);
+extern struct node *node2(unsigned char op, struct node *l, struct node *r);
+extern struct node *node1(unsigned char op, struct node *i);
 
-extern struct node *
-node2(unsigned char op, struct node *l, struct node *r);
+extern struct node *nodesym(struct symbol *sym);
+extern struct node *nodecomp(void);
+extern struct node *addstmt(struct node *np, struct node *stmt);
 
-extern struct node *
-node1(unsigned char op, struct node *i);
-
-extern struct node *
-nodesym(struct symbol *sym);
-
 extern void prtree(register struct node *np);
+
 #endif
--- a/tree.c
+++ b/tree.c
@@ -2,6 +2,7 @@
 #include <assert.h>
 #include <stddef.h>
 #include <stdio.h>
+#include <stdint.h>
 
 #include "cc.h"
 #include "syntax.h"
@@ -34,6 +35,12 @@
 	struct symbol *sym;
 };
 
+struct node_comp {
+	struct node base;
+	uint8_t nr, alloc;
+	struct node **body;
+};
+
 struct node *
 nodesym(struct symbol *sym)
 {
@@ -80,6 +87,39 @@
 	return (struct node *) np;
 }
 
+struct node *
+nodecomp(void)
+{
+	register struct node_comp *np = xmalloc(sizeof(*np));
+
+	np->base.op = OCOMP;
+	np->alloc = np->nr = 0;
+	np->body = NULL;
+
+	return (struct node *) np;
+}
+
+struct node *
+addstmt(struct node *p, struct node *stmt)
+{
+	register uint8_t nr, alloc;
+	register struct node_comp *np = (struct node_comp *) p;
+
+	assert(np && np->base.op == OCOMP);
+	nr = ++np->nr, alloc = np->alloc;
+
+#define alloc_nr(x) ((((x)+16)*3)/2)
+	if (nr > alloc) {
+		alloc = alloc_nr(nr);
+		np->body = xrealloc(np->body, alloc * sizeof(*np->body));
+	}
+#undef alloc_nr
+
+	np->body[nr - 1] = stmt;
+	np->alloc = alloc;
+	return p;
+}
+
 void
 prtree(register struct node *np)
 {
@@ -131,7 +171,8 @@
 		[OA_AND] = {2, "&="},
 		[OA_XOR] = {2, "^="},
 		[OA_OR] = {2, "|="},
-		[OSYM] = {0, "sym"}
+		[OSYM] = {0, "sym"},
+		[OCOMP] = {255, "comp"}
 	};
 
 	assert(np && np->op < ARRAY_SIZE(optab));
@@ -157,6 +198,15 @@
 		prtree(((struct node_op3 *) np)->infix);
 		prtree(((struct node_op3 *) np)->rigth);
 		break;
+	case 255: {
+		register struct node **bp, **lim;
+
+		bp = ((struct node_comp *) np)->body;
+		lim = bp + ((struct node_comp *) np)->nr;
+		while (bp < lim)
+			prtree(*bp++);
+		break;
+	}
 	}
 	putchar(')');
 }