Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/make make(1): document IfState in more detail
details: https://anonhg.NetBSD.org/src/rev/0904aa928d16
branches: trunk
changeset: 956967:0904aa928d16
user: rillig <rillig%NetBSD.org@localhost>
date: Thu Nov 12 20:01:27 2020 +0000
description:
make(1): document IfState in more detail
diffstat:
usr.bin/make/cond.c | 50 +++++++++++++++++++++++++++++++++-----------------
1 files changed, 33 insertions(+), 17 deletions(-)
diffs (90 lines):
diff -r 203f1f10bf90 -r 0904aa928d16 usr.bin/make/cond.c
--- a/usr.bin/make/cond.c Thu Nov 12 19:46:36 2020 +0000
+++ b/usr.bin/make/cond.c Thu Nov 12 20:01:27 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: cond.c,v 1.206 2020/11/12 08:12:07 rillig Exp $ */
+/* $NetBSD: cond.c,v 1.207 2020/11/12 20:01:27 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -93,7 +93,7 @@
#include "dir.h"
/* "@(#)cond.c 8.2 (Berkeley) 1/2/94" */
-MAKE_RCSID("$NetBSD: cond.c,v 1.206 2020/11/12 08:12:07 rillig Exp $");
+MAKE_RCSID("$NetBSD: cond.c,v 1.207 2020/11/12 20:01:27 rillig Exp $");
/*
* The parsing of conditional expressions is based on this grammar:
@@ -1067,6 +1067,7 @@
}
/* Evaluate the conditional directive in the passed line, which is one of:
+ *
* .if <cond>
* .ifmake <cond>
* .ifnmake <cond>
@@ -1079,14 +1080,16 @@
* .elifndef <cond>
* .else
* .endif
- * In this line, <cond> consists of &&, ||, !, function(arg), comparisons
- * and parenthetical groupings thereof.
+ *
+ * In these directives, <cond> consists of &&, ||, !, function(arg),
+ * comparisons, expressions, bare words, numbers and strings, and
+ * parenthetical groupings thereof.
*
* Results:
- * COND_PARSE to continue parsing the lines after the conditional
- * (when .if or .else returns TRUE)
+ * COND_PARSE to continue parsing the lines that follow the
+ * conditional (when <cond> evaluates to TRUE)
* COND_SKIP to skip the lines after the conditional
- * (when .if or .elif returns FALSE, or when a previous
+ * (when <cond> evaluates to FALSE, or when a previous
* branch has already been taken)
* COND_INVALID if the conditional was not valid, either because of
* a syntax error or because some variable was undefined
@@ -1095,18 +1098,31 @@
CondEvalResult
Cond_EvalLine(const char *line)
{
- /*
- * Note that the states IF_ACTIVE and ELSE_ACTIVE are only different in order
- * to detect spurious .else lines (as are SKIP_TO_ELSE and SKIP_TO_ENDIF),
- * otherwise .else could be treated as '.elif 1'.
- */
typedef enum IfState {
- IF_ACTIVE, /* .if or .elif part active */
- ELSE_ACTIVE, /* .else part active */
- SEARCH_FOR_ELIF, /* searching for .elif/else to execute */
- SKIP_TO_ELSE, /* has been true, but not seen '.else' */
- SKIP_TO_ENDIF /* nothing else to execute */
+
+ /* The previous <cond> evaluated to TRUE. The lines following this
+ * condition are interpreted. */
+ IF_ACTIVE,
+
+ /* The previous '.else' evaluated to TRUE. The lines following this
+ * condition are interpreted. The only difference to IF_ACTIVE is
+ * that no other '.else' may follow. */
+ ELSE_ACTIVE,
+
+ /* None of the previous <cond> evaluated to TRUE. Still searching
+ * for an '.elif' or an 'else' that evaluates to TRUE. */
+ SEARCH_FOR_ELIF,
+
+ /* One of the previous <cond> evaluated to TRUE. There was no '.else'
+ * yet. */
+ SKIP_TO_ELSE,
+
+ /* One of the previous <cond> evaluated to TRUE, and '.else' was
+ * already seen. No other '.else' may follow. */
+ SKIP_TO_ENDIF
+
} IfState;
+
static enum IfState *cond_states = NULL;
static unsigned int cond_states_cap = 128;
Home |
Main Index |
Thread Index |
Old Index