From 3de116e48d3a1a02743c85253db5db77682416ba Mon Sep 17 00:00:00 2001 From: Michael Spang Date: Sun, 13 Dec 2009 02:53:53 -0500 Subject: [PATCH] Allow predicates to be negated Signed-off-by: Michael Spang --- inapt.cc | 9 +++++++-- parser.rl | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/inapt.cc b/inapt.cc index c74df8c..f968d2e 100644 --- a/inapt.cc +++ b/inapt.cc @@ -183,6 +183,11 @@ static void usage() { exit(2); } +static bool test_macro(const char *macro, set *defines) { + return (*macro != '!' && defines->find(macro) != defines->end()) + || (*macro == '!' && defines->find(macro + 1) == defines->end()); +} + static void eval_block(inapt_block *block, set *defines, std::vector *final_actions) { if (!block) return; @@ -190,7 +195,7 @@ static void eval_block(inapt_block *block, set *defines, std::vector::iterator i = block->actions.begin(); i < block->actions.end(); i++) { bool ok = true; for (vector::iterator j = (*i)->predicates.begin(); j < (*i)->predicates.end(); j++) { - if (defines->find(*j) == defines->end()) { + if (!test_macro(*j, defines)) { ok = false; break; } @@ -200,7 +205,7 @@ static void eval_block(inapt_block *block, set *defines, std::vector::iterator i = block->children.begin(); i < block->children.end(); i++) { - if (defines->find((*i)->condition) != defines->end()) + if (test_macro((*i)->condition, defines)) eval_block((*i)->then_block, defines, final_actions); else eval_block((*i)->else_block, defines, final_actions); diff --git a/parser.rl b/parser.rl index f09a6e3..6c38e5b 100644 --- a/parser.rl +++ b/parser.rl @@ -103,7 +103,7 @@ using namespace std; newline = '\n' @newline; comment = '#' (any - '\n')* newline; whitespace = [\t\v\f\r ] | comment | newline; - macro = alpha (alpha | digit | '-' | '+' | '.')*; + macro = '!'? alpha (alpha | digit | '-' | '+' | '.')*; package_name = ((lower | digit) (lower | digit | '+' | '-' | '.')+) >strstart; pkg_predicate = '@' macro >strstart %pkg_predicate whitespace+; cmd_predicate = '@' macro >strstart %cmd_predicate whitespace+; -- 2.11.0