Module Name:    src
Committed By:   rillig
Date:           Sat Dec 11 10:01:16 UTC 2021

Modified Files:
        src/usr.bin/make: cond.c

Log Message:
make: separate handling of 'empty' and the other functions

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.289 -r1.290 src/usr.bin/make/cond.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/make/cond.c
diff -u src/usr.bin/make/cond.c:1.289 src/usr.bin/make/cond.c:1.290
--- src/usr.bin/make/cond.c:1.289	Fri Dec 10 23:56:17 2021
+++ src/usr.bin/make/cond.c	Sat Dec 11 10:01:16 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: cond.c,v 1.289 2021/12/10 23:56:17 rillig Exp $	*/
+/*	$NetBSD: cond.c,v 1.290 2021/12/11 10:01:16 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -95,7 +95,7 @@
 #include "dir.h"
 
 /*	"@(#)cond.c	8.2 (Berkeley) 1/2/94"	*/
-MAKE_RCSID("$NetBSD: cond.c,v 1.289 2021/12/10 23:56:17 rillig Exp $");
+MAKE_RCSID("$NetBSD: cond.c,v 1.290 2021/12/11 10:01:16 rillig Exp $");
 
 /*
  * The parsing of conditional expressions is based on this grammar:
@@ -761,6 +761,35 @@ FuncEmpty(size_t arglen, const char *arg
 	return arglen == 1;
 }
 
+static bool
+CondParser_FuncCallEmpty(CondParser *par, bool doEval, Token *out_token)
+{
+	char *arg = NULL;
+	size_t arglen;
+	const char *cp = par->p;
+
+	if (!is_token(cp, "empty", 5))
+		return false;
+	cp += 5;
+
+	cpp_skip_whitespace(&cp);
+	if (*cp != '(')
+		return false;
+
+	arglen = ParseEmptyArg(par, &cp, doEval, "empty", &arg);
+	if (arglen == 0 || arglen == (size_t)-1) {
+		par->p = cp;
+		*out_token = arglen == 0 ? TOK_FALSE : TOK_ERROR;
+		return true;
+	}
+
+	/* Evaluate the argument using the required function. */
+	*out_token = ToToken(!doEval || FuncEmpty(arglen, arg));
+	free(arg);
+	par->p = cp;
+	return true;
+}
+
 /* Parse a function call expression, such as 'defined(${file})'. */
 static bool
 CondParser_FuncCall(CondParser *par, bool doEval, Token *out_token)
@@ -768,16 +797,13 @@ CondParser_FuncCall(CondParser *par, boo
 	static const struct fn_def {
 		const char fn_name[9];
 		unsigned char fn_name_len;
-		size_t (*fn_parse)(CondParser *, const char **, bool,
-				   const char *, char **);
 		bool (*fn_eval)(size_t, const char *);
 	} fns[] = {
-		{ "defined",  7, ParseFuncArg,  FuncDefined },
-		{ "make",     4, ParseFuncArg,  FuncMake },
-		{ "exists",   6, ParseFuncArg,  FuncExists },
-		{ "empty",    5, ParseEmptyArg, FuncEmpty },
-		{ "target",   6, ParseFuncArg,  FuncTarget },
-		{ "commands", 8, ParseFuncArg,  FuncCommands }
+		{ "defined",  7, FuncDefined },
+		{ "make",     4, FuncMake },
+		{ "exists",   6, FuncExists },
+		{ "target",   6, FuncTarget },
+		{ "commands", 8, FuncCommands }
 	};
 	const struct fn_def *fn;
 	char *arg = NULL;
@@ -794,7 +820,7 @@ CondParser_FuncCall(CondParser *par, boo
 	if (*cp != '(')
 		return false;
 
-	arglen = fn->fn_parse(par, &cp, doEval, fn->fn_name, &arg);
+	arglen = ParseFuncArg(par, &cp, doEval, fn->fn_name, &arg);
 	if (arglen == 0 || arglen == (size_t)-1) {
 		par->p = cp;
 		*out_token = arglen == 0 ? TOK_FALSE : TOK_ERROR;
@@ -917,6 +943,8 @@ CondParser_Token(CondParser *par, bool d
 		return CondParser_Comparison(par, doEval);
 
 	default:
+		if (CondParser_FuncCallEmpty(par, doEval, &t))
+			return t;
 		if (CondParser_FuncCall(par, doEval, &t))
 			return t;
 		return CondParser_ComparisonOrLeaf(par, doEval);

Reply via email to