[PATCH v2 2/7] builtin: extract do_define() from do_handle_define()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



So it can be resused to declare builtin macros.

Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx>
---
 pre-process.c | 67 ++++++++++++++++++++++++++++-----------------------
 1 file changed, 37 insertions(+), 30 deletions(-)

diff --git a/pre-process.c b/pre-process.c
index 403d899c3..f1ee36cec 100644
--- a/pre-process.c
+++ b/pre-process.c
@@ -1327,40 +1327,16 @@ Earg:
 	return NULL;
 }
 
-static int do_handle_define(struct stream *stream, struct token **line, struct token *token, int attr)
+static int do_define(struct position pos, struct token *token, struct ident *name,
+		     struct token *arglist, struct token *expansion, int attr)
 {
-	struct token *arglist, *expansion;
-	struct token *left = token->next;
 	struct symbol *sym;
-	struct ident *name;
-	int ret;
-
-	if (token_type(left) != TOKEN_IDENT) {
-		sparse_error(token->pos, "expected identifier to 'define'");
-		return 1;
-	}
-
-	name = left->ident;
-
-	arglist = NULL;
-	expansion = left->next;
-	if (!expansion->pos.whitespace) {
-		if (match_op(expansion, '(')) {
-			arglist = expansion;
-			expansion = parse_arguments(expansion);
-			if (!expansion)
-				return 1;
-		} else if (!eof_token(expansion)) {
-			warning(expansion->pos,
-				"no whitespace before object-like macro body");
-		}
-	}
+	int ret = 1;
 
 	expansion = parse_expansion(expansion, arglist, name);
 	if (!expansion)
 		return 1;
 
-	ret = 1;
 	sym = lookup_symbol(name, NS_MACRO | NS_UNDEF);
 	if (sym) {
 		int clean;
@@ -1375,7 +1351,7 @@ static int do_handle_define(struct stream *stream, struct token **line, struct t
 			ret = 0;
 			if ((clean && attr == SYM_ATTR_NORMAL)
 					|| sym->used_in == file_scope) {
-				warning(left->pos, "preprocessor token %.*s redefined",
+				warning(pos, "preprocessor token %.*s redefined",
 						name->len, name->name);
 				info(sym->pos, "this was the original definition");
 			}
@@ -1384,7 +1360,7 @@ static int do_handle_define(struct stream *stream, struct token **line, struct t
 	}
 
 	if (!sym || sym->scope != file_scope) {
-		sym = alloc_symbol(left->pos, SYM_NODE);
+		sym = alloc_symbol(pos, SYM_NODE);
 		bind_symbol(sym, name, NS_MACRO);
 		add_ident(&macros, name);
 		ret = 0;
@@ -1393,7 +1369,8 @@ static int do_handle_define(struct stream *stream, struct token **line, struct t
 	if (!ret) {
 		sym->expansion = expansion;
 		sym->arglist = arglist;
-		__free_token(token);	/* Free the "define" token, but not the rest of the line */
+		if (token) /* Free the "define" token, but not the rest of the line */
+			__free_token(token);
 	}
 
 	sym->namespace = NS_MACRO;
@@ -1403,6 +1380,36 @@ out:
 	return ret;
 }
 
+static int do_handle_define(struct stream *stream, struct token **line, struct token *token, int attr)
+{
+	struct token *arglist, *expansion;
+	struct token *left = token->next;
+	struct ident *name;
+
+	if (token_type(left) != TOKEN_IDENT) {
+		sparse_error(token->pos, "expected identifier to 'define'");
+		return 1;
+	}
+
+	name = left->ident;
+
+	arglist = NULL;
+	expansion = left->next;
+	if (!expansion->pos.whitespace) {
+		if (match_op(expansion, '(')) {
+			arglist = expansion;
+			expansion = parse_arguments(expansion);
+			if (!expansion)
+				return 1;
+		} else if (!eof_token(expansion)) {
+			warning(expansion->pos,
+				"no whitespace before object-like macro body");
+		}
+	}
+
+	return do_define(left->pos, token, name, arglist, expansion, attr);
+}
+
 static int handle_define(struct stream *stream, struct token **line, struct token *token)
 {
 	return do_handle_define(stream, line, token, SYM_ATTR_NORMAL);
-- 
2.17.1

--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux