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);