about summary refs log tree commit diff
path: root/lr.c
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2015-10-23 14:47:32 +0200
committerChristian Neukirchen <chneukirchen@gmail.com>2015-10-23 14:47:32 +0200
commit7444f77df97dcf98be62e13ff2e3fbe7aae77de1 (patch)
tree0d007108a5eb75b41886ac5036043c5b7293c5e9 /lr.c
parent2393ba0a6df5de8839ec30e80cac58ef404585f5 (diff)
downloadlr-7444f77df97dcf98be62e13ff2e3fbe7aae77de1.tar.gz
lr-7444f77df97dcf98be62e13ff2e3fbe7aae77de1.tar.xz
lr-7444f77df97dcf98be62e13ff2e3fbe7aae77de1.zip
collect expr mallocs
Diffstat (limited to 'lr.c')
-rw-r--r--lr.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/lr.c b/lr.c
index fe756d4..7a953f5 100644
--- a/lr.c
+++ b/lr.c
@@ -153,6 +153,16 @@ parse_error(const char *msg)
 	exit(2);
 }
 
+struct expr *
+mkexpr(enum op op)
+{
+	struct expr *e = malloc (sizeof (struct expr));
+	if (!e)
+		parse_error("out of memory");
+	e->op = op;
+	return e;
+}
+
 void
 ws()
 {
@@ -235,13 +245,11 @@ struct expr *
 parse_inner()
 {
 	if (token("prune")) {
-		struct expr *e = malloc (sizeof (struct expr));
-		e->op = EXPR_PRUNE;
+		struct expr *e = mkexpr(EXPR_PRUNE);
 		return e;
 	} else if (token("!")) {
 		struct expr *e = parse_cmp();
-		struct expr *not = malloc (sizeof (struct expr));
-		not->op = EXPR_NOT;
+		struct expr *not = mkexpr(EXPR_NOT);
 		not->a.expr = e;
 		return not;
 	} else if (token("(")) {
@@ -259,8 +267,7 @@ parse_type()
 {
 	if (token("type")) {
 		if(token("==")) {  // TODO !=
-			struct expr *e = malloc (sizeof (struct expr));
-			e->op = EXPR_TYPE;
+			struct expr *e = mkexpr(EXPR_TYPE);
 			if (token("b"))
 				e->a.filetype = TYPE_BLOCK;
 			else if (token("c"))
@@ -333,8 +340,7 @@ parse_strcmp()
 
 	char *s;
 	if (parse_string(&s)) {
-		struct expr *e = malloc(sizeof (struct expr));
-		e->op = op;
+		struct expr *e = mkexpr(op);
 		e->a.prop = prop;
 		if (op == EXPR_REGEX) {
 			e->b.regex = malloc (sizeof (regex_t));
@@ -355,7 +361,7 @@ parse_strcmp()
 struct expr *
 parse_mode()
 {
-	struct expr *e = malloc(sizeof (struct expr));
+	struct expr *e = mkexpr(0);
 	long n;
 
 	e->a.prop = PROP_MODE;
@@ -413,8 +419,7 @@ parse_cmp()
 
 	long n;
 	if (parse_num(&n)) {
-		struct expr *e = malloc(sizeof (struct expr));
-		e->op = op;
+		struct expr *e = mkexpr(op);
 		e->a.prop = prop;
 		e->b.num = n;
 		return e;
@@ -433,14 +438,12 @@ parse_and()
 	while (token("&&")) {
 		struct expr *e2 = parse_cmp();
 		if (!l) {
-			l = malloc(sizeof (struct expr));
-			l->op = EXPR_AND;
+			l = mkexpr(EXPR_AND);
 			l->a.expr = e1;
 			l->b.expr = e2;
 			r = l;
 		} else {
-			a = malloc(sizeof (struct expr));
-			a->op = EXPR_AND;
+			a = mkexpr(EXPR_AND);
 			a->a.expr = l->b.expr;
 			a->b.expr = e2;
 			l->b.expr = a;
@@ -462,14 +465,12 @@ parse_or()
 	while (token("||")) {
 		struct expr *e2 = parse_and();
 		if (!l) {
-			l = malloc(sizeof (struct expr));
-			l->op = EXPR_OR;
+			l = mkexpr(EXPR_OR);
 			l->a.expr = e1;
 			l->b.expr = e2;
 			r = l;
 		} else {
-			o = malloc(sizeof (struct expr));
-			o->op = EXPR_OR;
+			o = mkexpr(EXPR_OR);
 			o->a.expr = l->b.expr;
 			o->b.expr = e2;
 			l->b.expr = o;