From b058e053d494129ee861cd2ca1e0ea9a0cc9814f Mon Sep 17 00:00:00 2001
From: Olivier Matz <zer0@droids-corp.org>
Date: Wed, 28 Feb 2018 20:57:38 +0100
Subject: [PATCH] use EC_NO_ID instead of NULL

---
 lib/ecoli_node.c           |  4 ++++
 lib/ecoli_node.h           |  2 ++
 lib/ecoli_node_any.c       |  4 ++--
 lib/ecoli_node_cmd.c       | 36 ++++++++++++++++----------------
 lib/ecoli_node_dynamic.c   |  4 ++--
 lib/ecoli_node_empty.c     |  4 ++--
 lib/ecoli_node_expr.c      | 10 ++++-----
 lib/ecoli_node_expr_test.c | 16 +++++++--------
 lib/ecoli_node_file.c      |  2 +-
 lib/ecoli_node_int.c       |  8 ++++----
 lib/ecoli_node_many.c      |  8 ++++----
 lib/ecoli_node_none.c      |  4 ++--
 lib/ecoli_node_once.c      | 20 +++++++++---------
 lib/ecoli_node_option.c    |  4 ++--
 lib/ecoli_node_or.c        | 18 ++++++++--------
 lib/ecoli_node_re.c        |  2 +-
 lib/ecoli_node_re_lex.c    | 12 +++++------
 lib/ecoli_node_seq.c       | 14 ++++++-------
 lib/ecoli_node_sh_lex.c    | 26 +++++++++++------------
 lib/ecoli_node_space.c     |  4 ++--
 lib/ecoli_node_str.c       |  9 ++++----
 lib/ecoli_node_subset.c    | 24 +++++++++++-----------
 lib/main-readline.c        | 42 +++++++++++++++++++-------------------
 23 files changed, 141 insertions(+), 136 deletions(-)

diff --git a/lib/ecoli_node.c b/lib/ecoli_node.c
index 089c0bc..cde43b5 100644
--- a/lib/ecoli_node.c
+++ b/lib/ecoli_node.c
@@ -82,6 +82,10 @@ struct ec_node *__ec_node(const struct ec_node_type *type, const char *id)
 
 	EC_LOG(EC_LOG_DEBUG, "create node type=%s id=%s\n",
 		type->name, id);
+	if (id == NULL) {
+		errno = -EINVAL;
+		goto fail;
+	}
 
 	node = ec_calloc(1, type->size);
 	if (node == NULL)
diff --git a/lib/ecoli_node.h b/lib/ecoli_node.h
index 8afcdbc..ebd8323 100644
--- a/lib/ecoli_node.h
+++ b/lib/ecoli_node.h
@@ -69,6 +69,8 @@
 #include <sys/types.h>
 #include <stdio.h>
 
+#define EC_NO_ID "no-id"
+
 #define EC_NODE_ENDLIST ((void *)1)
 
 struct ec_node;
diff --git a/lib/ecoli_node_any.c b/lib/ecoli_node_any.c
index 7fef0c1..923ef99 100644
--- a/lib/ecoli_node_any.c
+++ b/lib/ecoli_node_any.c
@@ -73,7 +73,7 @@ static int ec_node_any_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = ec_node("any", NULL);
+	node = ec_node("any", EC_NO_ID);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -84,7 +84,7 @@ static int ec_node_any_testcase(void)
 	ec_node_free(node);
 
 	/* never completes */
-	node = ec_node("any", NULL);
+	node = ec_node("any", EC_NO_ID);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
diff --git a/lib/ecoli_node_cmd.c b/lib/ecoli_node_cmd.c
index b698f75..b206172 100644
--- a/lib/ecoli_node_cmd.c
+++ b/lib/ecoli_node_cmd.c
@@ -99,7 +99,7 @@ ec_node_cmd_eval_var(void **result, void *userctx,
 
 	/* ...or create a string node */
 	if (eval == NULL) {
-		eval = ec_node_str(NULL, str);
+		eval = ec_node_str(EC_NO_ID, str);
 		if (eval == NULL)
 			return -ENOMEM;
 	}
@@ -167,7 +167,7 @@ ec_node_cmd_eval_bin_op(void **result, void *userctx, void *operand1,
 		return -EINVAL;
 
 	if (!strcmp(ec_strvec_val(vec, 0), "|")) {
-		out = EC_NODE_OR(NULL, ec_node_clone(in1), ec_node_clone(in2));
+		out = EC_NODE_OR(EC_NO_ID, ec_node_clone(in1), ec_node_clone(in2));
 		if (out == NULL)
 			return -EINVAL;
 		ec_node_free(in1);
@@ -180,7 +180,7 @@ ec_node_cmd_eval_bin_op(void **result, void *userctx, void *operand1,
 			ec_node_free(in1);
 			*result = in2;
 		} else {
-			out = EC_NODE_SUBSET(NULL, ec_node_clone(in1),
+			out = EC_NODE_SUBSET(EC_NO_ID, ec_node_clone(in1),
 					ec_node_clone(in2));
 			if (out == NULL)
 				return -EINVAL;
@@ -216,7 +216,7 @@ ec_node_cmd_eval_parenthesis(void **result, void *userctx,
 		return -EINVAL;
 
 	if (!strcmp(ec_strvec_val(vec, 0), "[")) {
-		out = ec_node_option(NULL, ec_node_clone(in));
+		out = ec_node_option(EC_NO_ID, ec_node_clone(in));
 		if (out == NULL)
 			return -EINVAL;
 		ec_node_free(in);
@@ -296,34 +296,34 @@ static int ec_node_cmd_build(struct ec_node *gen_node)
 	expr = ec_node("expr", "expr");
 	if (expr == NULL)
 		goto fail;
-	ret = ec_node_expr_set_val_node(expr, ec_node_re(NULL, "[a-zA-Z0-9]+"));
+	ret = ec_node_expr_set_val_node(expr, ec_node_re(EC_NO_ID, "[a-zA-Z0-9]+"));
 	if (ret < 0)
 		goto fail;
-	ret = ec_node_expr_add_bin_op(expr, ec_node_str(NULL, ","));
+	ret = ec_node_expr_add_bin_op(expr, ec_node_str(EC_NO_ID, ","));
 	if (ret < 0)
 		goto fail;
-	ret = ec_node_expr_add_bin_op(expr, ec_node_str(NULL, "|"));
+	ret = ec_node_expr_add_bin_op(expr, ec_node_str(EC_NO_ID, "|"));
 	if (ret < 0)
 		goto fail;
-	ret = ec_node_expr_add_post_op(expr, ec_node_str(NULL, "+"));
+	ret = ec_node_expr_add_post_op(expr, ec_node_str(EC_NO_ID, "+"));
 	if (ret < 0)
 		goto fail;
-	ret = ec_node_expr_add_post_op(expr, ec_node_str(NULL, "*"));
+	ret = ec_node_expr_add_post_op(expr, ec_node_str(EC_NO_ID, "*"));
 	if (ret < 0)
 		goto fail;
-	ret = ec_node_expr_add_parenthesis(expr, ec_node_str(NULL, "["),
-		ec_node_str(NULL, "]"));
+	ret = ec_node_expr_add_parenthesis(expr, ec_node_str(EC_NO_ID, "["),
+		ec_node_str(EC_NO_ID, "]"));
 	if (ret < 0)
 		goto fail;
-	ec_node_expr_add_parenthesis(expr, ec_node_str(NULL, "("),
-		ec_node_str(NULL, ")"));
+	ec_node_expr_add_parenthesis(expr, ec_node_str(EC_NO_ID, "("),
+		ec_node_str(EC_NO_ID, ")"));
 	if (ret < 0)
 		goto fail;
 
 	/* prepend a lexer and a "many" to the expression node */
 	ret = -ENOMEM;
-	lex = ec_node_re_lex(NULL,
-		ec_node_many(NULL, ec_node_clone(expr), 1, 0));
+	lex = ec_node_re_lex(EC_NO_ID,
+		ec_node_many(EC_NO_ID, ec_node_clone(expr), 1, 0));
 	if (lex == NULL)
 		goto fail;
 
@@ -358,7 +358,7 @@ static int ec_node_cmd_build(struct ec_node *gen_node)
 		goto fail;
 
 	ret = -ENOMEM;
-	cmd = ec_node("seq", NULL);
+	cmd = ec_node("seq", EC_NO_ID);
 	if (cmd == NULL)
 		goto fail;
 
@@ -499,7 +499,7 @@ static int ec_node_cmd_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = EC_NODE_CMD(NULL,
+	node = EC_NODE_CMD(EC_NO_ID,
 		"command [option] (subset1, subset2, subset3) x|y",
 		ec_node_int("x", 0, 10, 10),
 		ec_node_int("y", 20, 30, 10)
@@ -515,7 +515,7 @@ static int ec_node_cmd_testcase(void)
 	ret |= EC_TEST_CHECK_PARSE(node, -1, "foo");
 	ec_node_free(node);
 
-	node = EC_NODE_CMD(NULL, "good morning [count] bob|bobby|michael",
+	node = EC_NODE_CMD(EC_NO_ID, "good morning [count] bob|bobby|michael",
 			ec_node_int("count", 0, 10, 10));
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
diff --git a/lib/ecoli_node_dynamic.c b/lib/ecoli_node_dynamic.c
index e4cdb71..c9c5bfa 100644
--- a/lib/ecoli_node_dynamic.c
+++ b/lib/ecoli_node_dynamic.c
@@ -176,8 +176,8 @@ static int ec_node_dynamic_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	/* XXX use EC_NO_ID instead of NULL */
-	node = ec_node_many(NULL, ec_node_dynamic(NULL, build_counter, NULL),
+	node = ec_node_many(EC_NO_ID,
+			ec_node_dynamic(EC_NO_ID, build_counter, NULL),
 			1, 3);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
diff --git a/lib/ecoli_node_empty.c b/lib/ecoli_node_empty.c
index 5e220aa..2f7600a 100644
--- a/lib/ecoli_node_empty.c
+++ b/lib/ecoli_node_empty.c
@@ -70,7 +70,7 @@ static int ec_node_empty_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = ec_node("empty", NULL);
+	node = ec_node("empty", EC_NO_ID);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -81,7 +81,7 @@ static int ec_node_empty_testcase(void)
 	ec_node_free(node);
 
 	/* never completes */
-	node = ec_node("empty", NULL);
+	node = ec_node("empty", EC_NO_ID);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
diff --git a/lib/ecoli_node_expr.c b/lib/ecoli_node_expr.c
index 4c546a7..72c121e 100644
--- a/lib/ecoli_node_expr.c
+++ b/lib/ecoli_node_expr.c
@@ -160,12 +160,12 @@ static int ec_node_expr_build(struct ec_node *gen_node)
 	if (ec_node_or_add(post, ec_node_clone(node->val_node)) < 0)
 		goto fail;
 	if (ec_node_or_add(post,
-		EC_NODE_SEQ(NULL,
+		EC_NODE_SEQ(EC_NO_ID,
 			ec_node_clone(pre_op),
 			ec_node_clone(weak))) < 0)
 		goto fail;
 	for (i = 0; i < node->paren_len; i++) {
-		if (ec_node_or_add(post, EC_NODE_SEQ(NULL,
+		if (ec_node_or_add(post, EC_NODE_SEQ(EC_NO_ID,
 					ec_node_clone(node->open_ops[i]),
 					ec_node_clone(weak),
 					ec_node_clone(node->close_ops[i]))) < 0)
@@ -173,7 +173,7 @@ static int ec_node_expr_build(struct ec_node *gen_node)
 	}
 	term = EC_NODE_SEQ("term",
 		ec_node_clone(post),
-		ec_node_many(NULL, ec_node_clone(post_op), 0, 0)
+		ec_node_many(EC_NO_ID, ec_node_clone(post_op), 0, 0)
 	);
 	if (term == NULL)
 		goto fail;
@@ -181,8 +181,8 @@ static int ec_node_expr_build(struct ec_node *gen_node)
 	for (i = 0; i < node->bin_ops_len; i++) {
 		next = EC_NODE_SEQ("next",
 			ec_node_clone(term),
-			ec_node_many(NULL,
-				EC_NODE_SEQ(NULL,
+			ec_node_many(EC_NO_ID,
+				EC_NODE_SEQ(EC_NO_ID,
 					ec_node_clone(node->bin_ops[i]),
 					ec_node_clone(term)
 				),
diff --git a/lib/ecoli_node_expr_test.c b/lib/ecoli_node_expr_test.c
index 748256b..f14cf50 100644
--- a/lib/ecoli_node_expr_test.c
+++ b/lib/ecoli_node_expr_test.c
@@ -228,13 +228,13 @@ static int ec_node_expr_testcase(void)
 	if (node == NULL)
 		return -1;
 
-	ec_node_expr_set_val_node(node, ec_node_int(NULL, 0, UCHAR_MAX, 0));
-	ec_node_expr_add_bin_op(node, ec_node_str(NULL, "+"));
-	ec_node_expr_add_bin_op(node, ec_node_str(NULL, "*"));
-	ec_node_expr_add_pre_op(node, ec_node_str(NULL, "!"));  /* not */
-	ec_node_expr_add_post_op(node, ec_node_str(NULL, "^")); /* square */
-	ec_node_expr_add_parenthesis(node, ec_node_str(NULL, "("),
-		ec_node_str(NULL, ")"));
+	ec_node_expr_set_val_node(node, ec_node_int(EC_NO_ID, 0, UCHAR_MAX, 0));
+	ec_node_expr_add_bin_op(node, ec_node_str(EC_NO_ID, "+"));
+	ec_node_expr_add_bin_op(node, ec_node_str(EC_NO_ID, "*"));
+	ec_node_expr_add_pre_op(node, ec_node_str(EC_NO_ID, "!"));  /* not */
+	ec_node_expr_add_post_op(node, ec_node_str(EC_NO_ID, "^")); /* square */
+	ec_node_expr_add_parenthesis(node, ec_node_str(EC_NO_ID, "("),
+		ec_node_str(EC_NO_ID, ")"));
 	ret |= EC_TEST_CHECK_PARSE(node, 1, "1");
 	ret |= EC_TEST_CHECK_PARSE(node, 1, "1", "1");
 	ret |= EC_TEST_CHECK_PARSE(node, 1, "1", "*");
@@ -250,7 +250,7 @@ static int ec_node_expr_testcase(void)
 	ret |= EC_TEST_CHECK_PARSE(node, 5, "1", "+", "!", "1", "^");
 
 	/* prepend a lexer to the expression node */
-	lex_node = ec_node_re_lex(NULL, ec_node_clone(node));
+	lex_node = ec_node_re_lex(EC_NO_ID, ec_node_clone(node));
 	if (lex_node == NULL)
 		goto fail;
 
diff --git a/lib/ecoli_node_file.c b/lib/ecoli_node_file.c
index 8bb7edd..a92c629 100644
--- a/lib/ecoli_node_file.c
+++ b/lib/ecoli_node_file.c
@@ -268,7 +268,7 @@ static int ec_node_file_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = ec_node("file", NULL);
+	node = ec_node("file", EC_NO_ID);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
diff --git a/lib/ecoli_node_int.c b/lib/ecoli_node_int.c
index bd262fa..cf81fb6 100644
--- a/lib/ecoli_node_int.c
+++ b/lib/ecoli_node_int.c
@@ -237,7 +237,7 @@ static int ec_node_int_testcase(void)
 	const char *s;
 	int ret = 0;
 
-	node = ec_node_uint(NULL, 0, 256, 0);
+	node = ec_node_uint(EC_NO_ID, 0, 256, 0);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -260,7 +260,7 @@ static int ec_node_int_testcase(void)
 	ec_parsed_free(p);
 	ec_node_free(node);
 
-	node = ec_node_int(NULL, -1, LLONG_MAX, 16);
+	node = ec_node_int(EC_NO_ID, -1, LLONG_MAX, 16);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -277,7 +277,7 @@ static int ec_node_int_testcase(void)
 	ec_parsed_free(p);
 	ec_node_free(node);
 
-	node = ec_node_int(NULL, LLONG_MIN, 0, 10);
+	node = ec_node_int(EC_NO_ID, LLONG_MIN, 0, 10);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -290,7 +290,7 @@ static int ec_node_int_testcase(void)
 	ec_node_free(node);
 
 	/* test completion */
-	node = ec_node_int(NULL, 0, 10, 0);
+	node = ec_node_int(EC_NO_ID, 0, 10, 0);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
diff --git a/lib/ecoli_node_many.c b/lib/ecoli_node_many.c
index c718890..31d0eb2 100644
--- a/lib/ecoli_node_many.c
+++ b/lib/ecoli_node_many.c
@@ -223,7 +223,7 @@ static int ec_node_many_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = ec_node_many(NULL, ec_node_str(NULL, "foo"), 0, 0);
+	node = ec_node_many(EC_NO_ID, ec_node_str(EC_NO_ID, "foo"), 0, 0);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -235,7 +235,7 @@ static int ec_node_many_testcase(void)
 	ret |= EC_TEST_CHECK_PARSE(node, 0);
 	ec_node_free(node);
 
-	node = ec_node_many(NULL, ec_node_str(NULL, "foo"), 1, 0);
+	node = ec_node_many(EC_NO_ID, ec_node_str(EC_NO_ID, "foo"), 1, 0);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -246,7 +246,7 @@ static int ec_node_many_testcase(void)
 	ret |= EC_TEST_CHECK_PARSE(node, -1);
 	ec_node_free(node);
 
-	node = ec_node_many(NULL, ec_node_str(NULL, "foo"), 1, 2);
+	node = ec_node_many(EC_NO_ID, ec_node_str(EC_NO_ID, "foo"), 1, 2);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -259,7 +259,7 @@ static int ec_node_many_testcase(void)
 	ec_node_free(node);
 
 	/* test completion */
-	node = ec_node_many(NULL, ec_node_str(NULL, "foo"), 2, 4);
+	node = ec_node_many(EC_NO_ID, ec_node_str(EC_NO_ID, "foo"), 2, 4);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
diff --git a/lib/ecoli_node_none.c b/lib/ecoli_node_none.c
index 7c93708..e635ac4 100644
--- a/lib/ecoli_node_none.c
+++ b/lib/ecoli_node_none.c
@@ -83,7 +83,7 @@ static int ec_node_none_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = ec_node("none", NULL);
+	node = ec_node("none", EC_NO_ID);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -94,7 +94,7 @@ static int ec_node_none_testcase(void)
 	ec_node_free(node);
 
 	/* never completes */
-	node = ec_node("none", NULL);
+	node = ec_node("none", EC_NO_ID);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
diff --git a/lib/ecoli_node_once.c b/lib/ecoli_node_once.c
index b01640d..9ecfa98 100644
--- a/lib/ecoli_node_once.c
+++ b/lib/ecoli_node_once.c
@@ -172,10 +172,10 @@ static int ec_node_once_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = ec_node_many(NULL,
-			EC_NODE_OR(NULL,
-				ec_node_once(NULL, ec_node_str(NULL, "foo")),
-				ec_node_str(NULL, "bar")
+	node = ec_node_many(EC_NO_ID,
+			EC_NODE_OR(EC_NO_ID,
+				ec_node_once(EC_NO_ID, ec_node_str(EC_NO_ID, "foo")),
+				ec_node_str(EC_NO_ID, "bar")
 				), 0, 0
 		);
 	if (node == NULL) {
@@ -196,12 +196,12 @@ static int ec_node_once_testcase(void)
 
 #if 0 //XXX no completion test for node_once
 	/* test completion */
-	node = EC_NODE_OR(NULL,
-		ec_node_str(NULL, "foo"),
-		ec_node_str(NULL, "bar"),
-		ec_node_str(NULL, "bar2"),
-		ec_node_str(NULL, "toto"),
-		ec_node_str(NULL, "titi")
+	node = EC_NODE_OR(EC_NO_ID,
+		ec_node_str(EC_NO_ID, "foo"),
+		ec_node_str(EC_NO_ID, "bar"),
+		ec_node_str(EC_NO_ID, "bar2"),
+		ec_node_str(EC_NO_ID, "toto"),
+		ec_node_str(EC_NO_ID, "titi")
 	);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
diff --git a/lib/ecoli_node_option.c b/lib/ecoli_node_option.c
index 3f79754..6f8d229 100644
--- a/lib/ecoli_node_option.c
+++ b/lib/ecoli_node_option.c
@@ -122,7 +122,7 @@ static int ec_node_option_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = ec_node_option(NULL, ec_node_str(NULL, "foo"));
+	node = ec_node_option(EC_NO_ID, ec_node_str(EC_NO_ID, "foo"));
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -134,7 +134,7 @@ static int ec_node_option_testcase(void)
 	ec_node_free(node);
 
 	/* test completion */
-	node = ec_node_option(NULL, ec_node_str(NULL, "foo"));
+	node = ec_node_option(EC_NO_ID, ec_node_str(EC_NO_ID, "foo"));
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
diff --git a/lib/ecoli_node_or.c b/lib/ecoli_node_or.c
index 7e6b49e..20999c6 100644
--- a/lib/ecoli_node_or.c
+++ b/lib/ecoli_node_or.c
@@ -196,9 +196,9 @@ static int ec_node_or_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = EC_NODE_OR(NULL,
-		ec_node_str(NULL, "foo"),
-		ec_node_str(NULL, "bar")
+	node = EC_NODE_OR(EC_NO_ID,
+		ec_node_str(EC_NO_ID, "foo"),
+		ec_node_str(EC_NO_ID, "bar")
 	);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
@@ -214,12 +214,12 @@ static int ec_node_or_testcase(void)
 	ec_node_free(node);
 
 	/* test completion */
-	node = EC_NODE_OR(NULL,
-		ec_node_str(NULL, "foo"),
-		ec_node_str(NULL, "bar"),
-		ec_node_str(NULL, "bar2"),
-		ec_node_str(NULL, "toto"),
-		ec_node_str(NULL, "titi")
+	node = EC_NODE_OR(EC_NO_ID,
+		ec_node_str(EC_NO_ID, "foo"),
+		ec_node_str(EC_NO_ID, "bar"),
+		ec_node_str(EC_NO_ID, "bar2"),
+		ec_node_str(EC_NO_ID, "toto"),
+		ec_node_str(EC_NO_ID, "titi")
 	);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
diff --git a/lib/ecoli_node_re.c b/lib/ecoli_node_re.c
index 7444aa7..85ac921 100644
--- a/lib/ecoli_node_re.c
+++ b/lib/ecoli_node_re.c
@@ -146,7 +146,7 @@ static int ec_node_re_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = ec_node_re(NULL, "fo+|bar");
+	node = ec_node_re(EC_NO_ID, "fo+|bar");
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
diff --git a/lib/ecoli_node_re_lex.c b/lib/ecoli_node_re_lex.c
index 14b3e46..d543178 100644
--- a/lib/ecoli_node_re_lex.c
+++ b/lib/ecoli_node_re_lex.c
@@ -225,12 +225,12 @@ static int ec_node_re_lex_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = ec_node_re_lex(NULL,
-		ec_node_many(NULL,
-			EC_NODE_OR(NULL,
-				ec_node_str(NULL, "foo"),
-				ec_node_str(NULL, "bar"),
-				ec_node_int(NULL, 0, 1000, 0)
+	node = ec_node_re_lex(EC_NO_ID,
+		ec_node_many(EC_NO_ID,
+			EC_NODE_OR(EC_NO_ID,
+				ec_node_str(EC_NO_ID, "foo"),
+				ec_node_str(EC_NO_ID, "bar"),
+				ec_node_int(EC_NO_ID, 0, 1000, 0)
 			), 0, 0
 		)
 	);
diff --git a/lib/ecoli_node_seq.c b/lib/ecoli_node_seq.c
index 9e0440b..0fc8eec 100644
--- a/lib/ecoli_node_seq.c
+++ b/lib/ecoli_node_seq.c
@@ -291,9 +291,9 @@ static int ec_node_seq_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = EC_NODE_SEQ(NULL,
-		ec_node_str(NULL, "foo"),
-		ec_node_str(NULL, "bar")
+	node = EC_NODE_SEQ(EC_NO_ID,
+		ec_node_str(EC_NO_ID, "foo"),
+		ec_node_str(EC_NO_ID, "bar")
 	);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
@@ -309,10 +309,10 @@ static int ec_node_seq_testcase(void)
 	ec_node_free(node);
 
 	/* test completion */
-	node = EC_NODE_SEQ(NULL,
-		ec_node_str(NULL, "foo"),
-		ec_node_option(NULL, ec_node_str(NULL, "toto")),
-		ec_node_str(NULL, "bar")
+	node = EC_NODE_SEQ(EC_NO_ID,
+		ec_node_str(EC_NO_ID, "foo"),
+		ec_node_option(EC_NO_ID, ec_node_str(EC_NO_ID, "toto")),
+		ec_node_str(EC_NO_ID, "bar")
 	);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
diff --git a/lib/ecoli_node_sh_lex.c b/lib/ecoli_node_sh_lex.c
index e3580d7..b51069a 100644
--- a/lib/ecoli_node_sh_lex.c
+++ b/lib/ecoli_node_sh_lex.c
@@ -400,13 +400,13 @@ static int ec_node_sh_lex_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = ec_node_sh_lex(NULL,
-		EC_NODE_SEQ(NULL,
-			ec_node_str(NULL, "foo"),
-			ec_node_option(NULL,
-				ec_node_str(NULL, "toto")
+	node = ec_node_sh_lex(EC_NO_ID,
+		EC_NODE_SEQ(EC_NO_ID,
+			ec_node_str(EC_NO_ID, "foo"),
+			ec_node_option(EC_NO_ID,
+				ec_node_str(EC_NO_ID, "toto")
 			),
-			ec_node_str(NULL, "bar")
+			ec_node_str(EC_NO_ID, "bar")
 		)
 	);
 	if (node == NULL) {
@@ -421,14 +421,14 @@ static int ec_node_sh_lex_testcase(void)
 	ec_node_free(node);
 
 	/* test completion */
-	node = ec_node_sh_lex(NULL,
-		EC_NODE_SEQ(NULL,
-			ec_node_str(NULL, "foo"),
-			ec_node_option(NULL,
-				ec_node_str(NULL, "toto")
+	node = ec_node_sh_lex(EC_NO_ID,
+		EC_NODE_SEQ(EC_NO_ID,
+			ec_node_str(EC_NO_ID, "foo"),
+			ec_node_option(EC_NO_ID,
+				ec_node_str(EC_NO_ID, "toto")
 			),
-			ec_node_str(NULL, "bar"),
-			ec_node_str(NULL, "titi")
+			ec_node_str(EC_NO_ID, "bar"),
+			ec_node_str(EC_NO_ID, "titi")
 		)
 	);
 	if (node == NULL) {
diff --git a/lib/ecoli_node_space.c b/lib/ecoli_node_space.c
index 0552d1b..32662ff 100644
--- a/lib/ecoli_node_space.c
+++ b/lib/ecoli_node_space.c
@@ -83,7 +83,7 @@ static int ec_node_space_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = ec_node("space", NULL);
+	node = ec_node("space", EC_NO_ID);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -96,7 +96,7 @@ static int ec_node_space_testcase(void)
 	ec_node_free(node);
 
 	/* test completion */
-	node = ec_node("space", NULL);
+	node = ec_node("space", EC_NO_ID);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
diff --git a/lib/ecoli_node_str.c b/lib/ecoli_node_str.c
index ab7ff11..5755ec7 100644
--- a/lib/ecoli_node_str.c
+++ b/lib/ecoli_node_str.c
@@ -175,8 +175,7 @@ static int ec_node_str_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	/* XXX use EC_NO_ID instead of NULL */
-	node = ec_node_str(NULL, "foo");
+	node = ec_node_str(EC_NO_ID, "foo");
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -188,7 +187,7 @@ static int ec_node_str_testcase(void)
 	ret |= EC_TEST_CHECK_PARSE(node, -1, "");
 	ec_node_free(node);
 
-	node = ec_node_str(NULL, "Здравствуйте");
+	node = ec_node_str(EC_NO_ID, "Здравствуйте");
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -201,7 +200,7 @@ static int ec_node_str_testcase(void)
 	ec_node_free(node);
 
 	/* an empty string node always matches */
-	node = ec_node_str(NULL, "");
+	node = ec_node_str(EC_NO_ID, "");
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
@@ -212,7 +211,7 @@ static int ec_node_str_testcase(void)
 	ec_node_free(node);
 
 	/* test completion */
-	node = ec_node_str(NULL, "foo");
+	node = ec_node_str(EC_NO_ID, "foo");
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
 		return -1;
diff --git a/lib/ecoli_node_subset.c b/lib/ecoli_node_subset.c
index 8fe4b65..53b1a89 100644
--- a/lib/ecoli_node_subset.c
+++ b/lib/ecoli_node_subset.c
@@ -351,12 +351,12 @@ static int ec_node_subset_testcase(void)
 	struct ec_node *node;
 	int ret = 0;
 
-	node = EC_NODE_SUBSET(NULL,
-		EC_NODE_OR(NULL,
-			ec_node_str(NULL, "foo"),
-			ec_node_str(NULL, "bar")),
-		ec_node_str(NULL, "bar"),
-		ec_node_str(NULL, "toto")
+	node = EC_NODE_SUBSET(EC_NO_ID,
+		EC_NODE_OR(EC_NO_ID,
+			ec_node_str(EC_NO_ID, "foo"),
+			ec_node_str(EC_NO_ID, "bar")),
+		ec_node_str(EC_NO_ID, "bar"),
+		ec_node_str(EC_NO_ID, "toto")
 	);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
@@ -375,12 +375,12 @@ static int ec_node_subset_testcase(void)
 	ec_node_free(node);
 
 	/* test completion */
-	node = EC_NODE_SUBSET(NULL,
-		ec_node_str(NULL, "foo"),
-		ec_node_str(NULL, "bar"),
-		ec_node_str(NULL, "bar2"),
-		ec_node_str(NULL, "toto"),
-		ec_node_str(NULL, "titi")
+	node = EC_NODE_SUBSET(EC_NO_ID,
+		ec_node_str(EC_NO_ID, "foo"),
+		ec_node_str(EC_NO_ID, "bar"),
+		ec_node_str(EC_NO_ID, "bar2"),
+		ec_node_str(EC_NO_ID, "toto"),
+		ec_node_str(EC_NO_ID, "titi")
 	);
 	if (node == NULL) {
 		EC_LOG(EC_LOG_ERR, "cannot create node\n");
diff --git a/lib/main-readline.c b/lib/main-readline.c
index 9dc0380..304b074 100644
--- a/lib/main-readline.c
+++ b/lib/main-readline.c
@@ -251,19 +251,19 @@ static int create_commands(void)
 {
 	struct ec_node *cmdlist = NULL, *cmd = NULL;
 
-	cmdlist = ec_node("or", NULL);
+	cmdlist = ec_node("or", EC_NO_ID);
 	if (cmdlist == NULL)
 		goto fail;
 
 
-	cmd = EC_NODE_SEQ(NULL,
-		ec_node_str(NULL, "hello"),
+	cmd = EC_NODE_SEQ(EC_NO_ID,
+		ec_node_str(EC_NO_ID, "hello"),
 		EC_NODE_OR("name",
 			ec_node_str("john", "john"),
-			ec_node_str(NULL, "johnny"),
-			ec_node_str(NULL, "mike")
+			ec_node_str(EC_NO_ID, "johnny"),
+			ec_node_str(EC_NO_ID, "mike")
 		),
-		ec_node_option(NULL, ec_node_int("int", 0, 10, 10))
+		ec_node_option(EC_NO_ID, ec_node_int("int", 0, 10, 10))
 	);
 	if (cmd == NULL)
 		goto fail;
@@ -279,7 +279,7 @@ static int create_commands(void)
 		goto fail;
 
 
-	cmd = EC_NODE_CMD(NULL, "good morning name [count]",
+	cmd = EC_NODE_CMD(EC_NO_ID, "good morning name [count]",
 			EC_NODE_CMD("name", "bob|bobby|michael"),
 			ec_node_int("count", 0, 10, 10));
 	if (cmd == NULL)
@@ -294,7 +294,7 @@ static int create_commands(void)
 		goto fail;
 
 
-	cmd = EC_NODE_CMD(NULL,
+	cmd = EC_NODE_CMD(EC_NO_ID,
 			"buy potatoes,carrots,pumpkins");
 	if (cmd == NULL)
 		goto fail;
@@ -304,14 +304,14 @@ static int create_commands(void)
 		goto fail;
 
 
-	cmd = EC_NODE_CMD(NULL, "eat vegetables",
+	cmd = EC_NODE_CMD(EC_NO_ID, "eat vegetables",
 			ec_node_many("vegetables",
-				EC_NODE_OR(NULL,
-					ec_node_str(NULL, "potatoes"),
-					ec_node_once(NULL,
-						ec_node_str(NULL, "carrots")),
-					ec_node_once(NULL,
-						ec_node_str(NULL, "pumpkins"))),
+				EC_NODE_OR(EC_NO_ID,
+					ec_node_str(EC_NO_ID, "potatoes"),
+					ec_node_once(EC_NO_ID,
+						ec_node_str(EC_NO_ID, "carrots")),
+					ec_node_once(EC_NO_ID,
+						ec_node_str(EC_NO_ID, "pumpkins"))),
 			1, 0));
 	if (cmd == NULL)
 		goto fail;
@@ -321,24 +321,24 @@ static int create_commands(void)
 		goto fail;
 
 
-	cmd = EC_NODE_SEQ(NULL,
-		ec_node_str(NULL, "bye")
+	cmd = EC_NODE_SEQ(EC_NO_ID,
+		ec_node_str(EC_NO_ID, "bye")
 	);
 	ec_keyval_set(ec_node_attrs(cmd), "help", "say bye", NULL);
 	if (ec_node_or_add(cmdlist, cmd) < 0)
 		goto fail;
 
 
-	cmd = EC_NODE_SEQ(NULL,
-		ec_node_str(NULL, "load"),
-		ec_node("file", NULL)
+	cmd = EC_NODE_SEQ(EC_NO_ID,
+		ec_node_str(EC_NO_ID, "load"),
+		ec_node("file", EC_NO_ID)
 	);
 	ec_keyval_set(ec_node_attrs(cmd), "help", "load a file", NULL);
 	if (ec_node_or_add(cmdlist, cmd) < 0)
 		goto fail;
 
 
-	commands = ec_node_sh_lex(NULL, cmdlist);
+	commands = ec_node_sh_lex(EC_NO_ID, cmdlist);
 	if (commands == NULL)
 		goto fail;
 
-- 
2.39.5