History log of /netbsd-current/usr.bin/make/cond.c
Revision (<<< Hide revision tags) (Show revision tags >>>) Date Author Comments
# 1.365 02-Jun-2024 rillig

make: sync VarEvalMode constant names with their debug log names


# 1.364 25-May-2024 rillig

make: fix a few more memory leaks


# 1.363 23-Apr-2024 rillig

make: clean up comments, code and tests


# 1.362 07-Feb-2024 rillig

make: remove redundant comments

No functional change.


# 1.361 21-Jan-2024 rillig

make: refactor CondParser_Term to be inlinable

No functional change.


# 1.360 21-Jan-2024 rillig

make: clean up parsing of conditions

No functional change.


# 1.359 29-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.358 29-Dec-2023 rillig

make: simplify memory allocation for string buffers

In edge cases and short-lived buffers, the initial buffer size is
irrelevant, so use the default.

No functional change.


# 1.357 19-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.356 17-Dec-2023 rillig

make: clean up names of local variables

No binary change.


# 1.355 19-Nov-2023 rillig

make: replace 'variable expression' with 'expression' in comments

No binary change.


# 1.354 11-Aug-2023 rillig

make: clean up multiple-inclusion guards

No functional change.


# 1.353 23-Jun-2023 rillig

make: clean up variable and function names

No functional change.


# 1.352 23-Jun-2023 rillig

make: warn about malformed patterns in ':M', ':N' and '.if make(...)'

These patterns shouldn't occur in practice, as their results are tricky
to predict. Generate a warning for now, and maybe an error later.

Reviewed by sjg@.


# 1.351 21-Jun-2023 sjg

Allow guard targets to use variables.

I commonly use __${.PARSEDIR:tA}__ where a unique guard
is needed, __${.PARSEDIR}__ is also useful in many cases.

Combination of patch from rillig and mine


# 1.350 20-Jun-2023 rillig

make: allow targets to be used as multiple-inclusion guards

This style is used by FreeBSD, among others.


# 1.349 19-Jun-2023 rillig

make: add tests for full code coverage of multiple-inclusion guards


# 1.348 19-Jun-2023 rillig

make: clean up code for skipping files with multiple-inclusion guard

No functional change.


# 1.347 19-Jun-2023 rillig

make: if a makefile is protected by a guard, only include it once

"looks reasonable" sjg@


# 1.346 16-Jun-2023 rillig

make: remove parameter names from function declarations

No binary change.


# 1.345 01-Jun-2023 rillig

make: shorten function names, clean up comments

No functional change.


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-0-RELEASE netbsd-10-0-RC6 netbsd-10-0-RC5 netbsd-10-0-RC4 netbsd-10-0-RC3 netbsd-10-0-RC2 netbsd-10-0-RC1 netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-8-3-RELEASE netbsd-9-4-RELEASE netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.364 25-May-2024 rillig

make: fix a few more memory leaks


# 1.363 23-Apr-2024 rillig

make: clean up comments, code and tests


# 1.362 07-Feb-2024 rillig

make: remove redundant comments

No functional change.


# 1.361 21-Jan-2024 rillig

make: refactor CondParser_Term to be inlinable

No functional change.


# 1.360 21-Jan-2024 rillig

make: clean up parsing of conditions

No functional change.


# 1.359 29-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.358 29-Dec-2023 rillig

make: simplify memory allocation for string buffers

In edge cases and short-lived buffers, the initial buffer size is
irrelevant, so use the default.

No functional change.


# 1.357 19-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.356 17-Dec-2023 rillig

make: clean up names of local variables

No binary change.


# 1.355 19-Nov-2023 rillig

make: replace 'variable expression' with 'expression' in comments

No binary change.


# 1.354 11-Aug-2023 rillig

make: clean up multiple-inclusion guards

No functional change.


# 1.353 23-Jun-2023 rillig

make: clean up variable and function names

No functional change.


# 1.352 23-Jun-2023 rillig

make: warn about malformed patterns in ':M', ':N' and '.if make(...)'

These patterns shouldn't occur in practice, as their results are tricky
to predict. Generate a warning for now, and maybe an error later.

Reviewed by sjg@.


# 1.351 21-Jun-2023 sjg

Allow guard targets to use variables.

I commonly use __${.PARSEDIR:tA}__ where a unique guard
is needed, __${.PARSEDIR}__ is also useful in many cases.

Combination of patch from rillig and mine


# 1.350 20-Jun-2023 rillig

make: allow targets to be used as multiple-inclusion guards

This style is used by FreeBSD, among others.


# 1.349 19-Jun-2023 rillig

make: add tests for full code coverage of multiple-inclusion guards


# 1.348 19-Jun-2023 rillig

make: clean up code for skipping files with multiple-inclusion guard

No functional change.


# 1.347 19-Jun-2023 rillig

make: if a makefile is protected by a guard, only include it once

"looks reasonable" sjg@


# 1.346 16-Jun-2023 rillig

make: remove parameter names from function declarations

No binary change.


# 1.345 01-Jun-2023 rillig

make: shorten function names, clean up comments

No functional change.


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-0-RELEASE netbsd-10-0-RC6 netbsd-10-0-RC5 netbsd-10-0-RC4 netbsd-10-0-RC3 netbsd-10-0-RC2 netbsd-10-0-RC1 netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-8-3-RELEASE netbsd-9-4-RELEASE netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.363 23-Apr-2024 rillig

make: clean up comments, code and tests


# 1.362 07-Feb-2024 rillig

make: remove redundant comments

No functional change.


# 1.361 21-Jan-2024 rillig

make: refactor CondParser_Term to be inlinable

No functional change.


# 1.360 21-Jan-2024 rillig

make: clean up parsing of conditions

No functional change.


# 1.359 29-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.358 29-Dec-2023 rillig

make: simplify memory allocation for string buffers

In edge cases and short-lived buffers, the initial buffer size is
irrelevant, so use the default.

No functional change.


# 1.357 19-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.356 17-Dec-2023 rillig

make: clean up names of local variables

No binary change.


# 1.355 19-Nov-2023 rillig

make: replace 'variable expression' with 'expression' in comments

No binary change.


# 1.354 11-Aug-2023 rillig

make: clean up multiple-inclusion guards

No functional change.


# 1.353 23-Jun-2023 rillig

make: clean up variable and function names

No functional change.


# 1.352 23-Jun-2023 rillig

make: warn about malformed patterns in ':M', ':N' and '.if make(...)'

These patterns shouldn't occur in practice, as their results are tricky
to predict. Generate a warning for now, and maybe an error later.

Reviewed by sjg@.


# 1.351 21-Jun-2023 sjg

Allow guard targets to use variables.

I commonly use __${.PARSEDIR:tA}__ where a unique guard
is needed, __${.PARSEDIR}__ is also useful in many cases.

Combination of patch from rillig and mine


# 1.350 20-Jun-2023 rillig

make: allow targets to be used as multiple-inclusion guards

This style is used by FreeBSD, among others.


# 1.349 19-Jun-2023 rillig

make: add tests for full code coverage of multiple-inclusion guards


# 1.348 19-Jun-2023 rillig

make: clean up code for skipping files with multiple-inclusion guard

No functional change.


# 1.347 19-Jun-2023 rillig

make: if a makefile is protected by a guard, only include it once

"looks reasonable" sjg@


# 1.346 16-Jun-2023 rillig

make: remove parameter names from function declarations

No binary change.


# 1.345 01-Jun-2023 rillig

make: shorten function names, clean up comments

No functional change.


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-0-RELEASE netbsd-10-0-RC6 netbsd-10-0-RC5 netbsd-10-0-RC4 netbsd-10-0-RC3 netbsd-10-0-RC2 netbsd-10-0-RC1 netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-4-RELEASE netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.362 07-Feb-2024 rillig

make: remove redundant comments

No functional change.


# 1.361 21-Jan-2024 rillig

make: refactor CondParser_Term to be inlinable

No functional change.


# 1.360 21-Jan-2024 rillig

make: clean up parsing of conditions

No functional change.


# 1.359 29-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.358 29-Dec-2023 rillig

make: simplify memory allocation for string buffers

In edge cases and short-lived buffers, the initial buffer size is
irrelevant, so use the default.

No functional change.


# 1.357 19-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.356 17-Dec-2023 rillig

make: clean up names of local variables

No binary change.


# 1.355 19-Nov-2023 rillig

make: replace 'variable expression' with 'expression' in comments

No binary change.


# 1.354 11-Aug-2023 rillig

make: clean up multiple-inclusion guards

No functional change.


# 1.353 23-Jun-2023 rillig

make: clean up variable and function names

No functional change.


# 1.352 23-Jun-2023 rillig

make: warn about malformed patterns in ':M', ':N' and '.if make(...)'

These patterns shouldn't occur in practice, as their results are tricky
to predict. Generate a warning for now, and maybe an error later.

Reviewed by sjg@.


# 1.351 21-Jun-2023 sjg

Allow guard targets to use variables.

I commonly use __${.PARSEDIR:tA}__ where a unique guard
is needed, __${.PARSEDIR}__ is also useful in many cases.

Combination of patch from rillig and mine


# 1.350 20-Jun-2023 rillig

make: allow targets to be used as multiple-inclusion guards

This style is used by FreeBSD, among others.


# 1.349 19-Jun-2023 rillig

make: add tests for full code coverage of multiple-inclusion guards


# 1.348 19-Jun-2023 rillig

make: clean up code for skipping files with multiple-inclusion guard

No functional change.


# 1.347 19-Jun-2023 rillig

make: if a makefile is protected by a guard, only include it once

"looks reasonable" sjg@


# 1.346 16-Jun-2023 rillig

make: remove parameter names from function declarations

No binary change.


# 1.345 01-Jun-2023 rillig

make: shorten function names, clean up comments

No functional change.


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-0-RC4 netbsd-10-0-RC3 netbsd-10-0-RC2 netbsd-10-0-RC1 netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.361 21-Jan-2024 rillig

make: refactor CondParser_Term to be inlinable

No functional change.


# 1.360 21-Jan-2024 rillig

make: clean up parsing of conditions

No functional change.


# 1.359 29-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.358 29-Dec-2023 rillig

make: simplify memory allocation for string buffers

In edge cases and short-lived buffers, the initial buffer size is
irrelevant, so use the default.

No functional change.


# 1.357 19-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.356 17-Dec-2023 rillig

make: clean up names of local variables

No binary change.


# 1.355 19-Nov-2023 rillig

make: replace 'variable expression' with 'expression' in comments

No binary change.


# 1.354 11-Aug-2023 rillig

make: clean up multiple-inclusion guards

No functional change.


# 1.353 23-Jun-2023 rillig

make: clean up variable and function names

No functional change.


# 1.352 23-Jun-2023 rillig

make: warn about malformed patterns in ':M', ':N' and '.if make(...)'

These patterns shouldn't occur in practice, as their results are tricky
to predict. Generate a warning for now, and maybe an error later.

Reviewed by sjg@.


# 1.351 21-Jun-2023 sjg

Allow guard targets to use variables.

I commonly use __${.PARSEDIR:tA}__ where a unique guard
is needed, __${.PARSEDIR}__ is also useful in many cases.

Combination of patch from rillig and mine


# 1.350 20-Jun-2023 rillig

make: allow targets to be used as multiple-inclusion guards

This style is used by FreeBSD, among others.


# 1.349 19-Jun-2023 rillig

make: add tests for full code coverage of multiple-inclusion guards


# 1.348 19-Jun-2023 rillig

make: clean up code for skipping files with multiple-inclusion guard

No functional change.


# 1.347 19-Jun-2023 rillig

make: if a makefile is protected by a guard, only include it once

"looks reasonable" sjg@


# 1.346 16-Jun-2023 rillig

make: remove parameter names from function declarations

No binary change.


# 1.345 01-Jun-2023 rillig

make: shorten function names, clean up comments

No functional change.


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-0-RC3 netbsd-10-0-RC2 netbsd-10-0-RC1 netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.361 21-Jan-2024 rillig

make: refactor CondParser_Term to be inlinable

No functional change.


# 1.360 21-Jan-2024 rillig

make: clean up parsing of conditions

No functional change.


# 1.359 29-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.358 29-Dec-2023 rillig

make: simplify memory allocation for string buffers

In edge cases and short-lived buffers, the initial buffer size is
irrelevant, so use the default.

No functional change.


# 1.357 19-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.356 17-Dec-2023 rillig

make: clean up names of local variables

No binary change.


# 1.355 19-Nov-2023 rillig

make: replace 'variable expression' with 'expression' in comments

No binary change.


# 1.354 11-Aug-2023 rillig

make: clean up multiple-inclusion guards

No functional change.


# 1.353 23-Jun-2023 rillig

make: clean up variable and function names

No functional change.


# 1.352 23-Jun-2023 rillig

make: warn about malformed patterns in ':M', ':N' and '.if make(...)'

These patterns shouldn't occur in practice, as their results are tricky
to predict. Generate a warning for now, and maybe an error later.

Reviewed by sjg@.


# 1.351 21-Jun-2023 sjg

Allow guard targets to use variables.

I commonly use __${.PARSEDIR:tA}__ where a unique guard
is needed, __${.PARSEDIR}__ is also useful in many cases.

Combination of patch from rillig and mine


# 1.350 20-Jun-2023 rillig

make: allow targets to be used as multiple-inclusion guards

This style is used by FreeBSD, among others.


# 1.349 19-Jun-2023 rillig

make: add tests for full code coverage of multiple-inclusion guards


# 1.348 19-Jun-2023 rillig

make: clean up code for skipping files with multiple-inclusion guard

No functional change.


# 1.347 19-Jun-2023 rillig

make: if a makefile is protected by a guard, only include it once

"looks reasonable" sjg@


# 1.346 16-Jun-2023 rillig

make: remove parameter names from function declarations

No binary change.


# 1.345 01-Jun-2023 rillig

make: shorten function names, clean up comments

No functional change.


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-0-RC3 netbsd-10-0-RC2 netbsd-10-0-RC1 netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.359 29-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.358 29-Dec-2023 rillig

make: simplify memory allocation for string buffers

In edge cases and short-lived buffers, the initial buffer size is
irrelevant, so use the default.

No functional change.


# 1.357 19-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.356 17-Dec-2023 rillig

make: clean up names of local variables

No binary change.


# 1.355 19-Nov-2023 rillig

make: replace 'variable expression' with 'expression' in comments

No binary change.


# 1.354 11-Aug-2023 rillig

make: clean up multiple-inclusion guards

No functional change.


# 1.353 23-Jun-2023 rillig

make: clean up variable and function names

No functional change.


# 1.352 23-Jun-2023 rillig

make: warn about malformed patterns in ':M', ':N' and '.if make(...)'

These patterns shouldn't occur in practice, as their results are tricky
to predict. Generate a warning for now, and maybe an error later.

Reviewed by sjg@.


# 1.351 21-Jun-2023 sjg

Allow guard targets to use variables.

I commonly use __${.PARSEDIR:tA}__ where a unique guard
is needed, __${.PARSEDIR}__ is also useful in many cases.

Combination of patch from rillig and mine


# 1.350 20-Jun-2023 rillig

make: allow targets to be used as multiple-inclusion guards

This style is used by FreeBSD, among others.


# 1.349 19-Jun-2023 rillig

make: add tests for full code coverage of multiple-inclusion guards


# 1.348 19-Jun-2023 rillig

make: clean up code for skipping files with multiple-inclusion guard

No functional change.


# 1.347 19-Jun-2023 rillig

make: if a makefile is protected by a guard, only include it once

"looks reasonable" sjg@


# 1.346 16-Jun-2023 rillig

make: remove parameter names from function declarations

No binary change.


# 1.345 01-Jun-2023 rillig

make: shorten function names, clean up comments

No functional change.


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-0-RC1 netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.357 19-Dec-2023 rillig

make: clean up comments

No binary change, except for line numbers in assertions.


# 1.356 17-Dec-2023 rillig

make: clean up names of local variables

No binary change.


# 1.355 19-Nov-2023 rillig

make: replace 'variable expression' with 'expression' in comments

No binary change.


# 1.354 11-Aug-2023 rillig

make: clean up multiple-inclusion guards

No functional change.


# 1.353 23-Jun-2023 rillig

make: clean up variable and function names

No functional change.


# 1.352 23-Jun-2023 rillig

make: warn about malformed patterns in ':M', ':N' and '.if make(...)'

These patterns shouldn't occur in practice, as their results are tricky
to predict. Generate a warning for now, and maybe an error later.

Reviewed by sjg@.


# 1.351 21-Jun-2023 sjg

Allow guard targets to use variables.

I commonly use __${.PARSEDIR:tA}__ where a unique guard
is needed, __${.PARSEDIR}__ is also useful in many cases.

Combination of patch from rillig and mine


# 1.350 20-Jun-2023 rillig

make: allow targets to be used as multiple-inclusion guards

This style is used by FreeBSD, among others.


# 1.349 19-Jun-2023 rillig

make: add tests for full code coverage of multiple-inclusion guards


# 1.348 19-Jun-2023 rillig

make: clean up code for skipping files with multiple-inclusion guard

No functional change.


# 1.347 19-Jun-2023 rillig

make: if a makefile is protected by a guard, only include it once

"looks reasonable" sjg@


# 1.346 16-Jun-2023 rillig

make: remove parameter names from function declarations

No binary change.


# 1.345 01-Jun-2023 rillig

make: shorten function names, clean up comments

No functional change.


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-0-RC1 netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.356 17-Dec-2023 rillig

make: clean up names of local variables

No binary change.


# 1.355 19-Nov-2023 rillig

make: replace 'variable expression' with 'expression' in comments

No binary change.


# 1.354 11-Aug-2023 rillig

make: clean up multiple-inclusion guards

No functional change.


# 1.353 23-Jun-2023 rillig

make: clean up variable and function names

No functional change.


# 1.352 23-Jun-2023 rillig

make: warn about malformed patterns in ':M', ':N' and '.if make(...)'

These patterns shouldn't occur in practice, as their results are tricky
to predict. Generate a warning for now, and maybe an error later.

Reviewed by sjg@.


# 1.351 21-Jun-2023 sjg

Allow guard targets to use variables.

I commonly use __${.PARSEDIR:tA}__ where a unique guard
is needed, __${.PARSEDIR}__ is also useful in many cases.

Combination of patch from rillig and mine


# 1.350 20-Jun-2023 rillig

make: allow targets to be used as multiple-inclusion guards

This style is used by FreeBSD, among others.


# 1.349 19-Jun-2023 rillig

make: add tests for full code coverage of multiple-inclusion guards


# 1.348 19-Jun-2023 rillig

make: clean up code for skipping files with multiple-inclusion guard

No functional change.


# 1.347 19-Jun-2023 rillig

make: if a makefile is protected by a guard, only include it once

"looks reasonable" sjg@


# 1.346 16-Jun-2023 rillig

make: remove parameter names from function declarations

No binary change.


# 1.345 01-Jun-2023 rillig

make: shorten function names, clean up comments

No functional change.


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-0-RC1 netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.355 19-Nov-2023 rillig

make: replace 'variable expression' with 'expression' in comments

No binary change.


# 1.354 11-Aug-2023 rillig

make: clean up multiple-inclusion guards

No functional change.


# 1.353 23-Jun-2023 rillig

make: clean up variable and function names

No functional change.


# 1.352 23-Jun-2023 rillig

make: warn about malformed patterns in ':M', ':N' and '.if make(...)'

These patterns shouldn't occur in practice, as their results are tricky
to predict. Generate a warning for now, and maybe an error later.

Reviewed by sjg@.


# 1.351 21-Jun-2023 sjg

Allow guard targets to use variables.

I commonly use __${.PARSEDIR:tA}__ where a unique guard
is needed, __${.PARSEDIR}__ is also useful in many cases.

Combination of patch from rillig and mine


# 1.350 20-Jun-2023 rillig

make: allow targets to be used as multiple-inclusion guards

This style is used by FreeBSD, among others.


# 1.349 19-Jun-2023 rillig

make: add tests for full code coverage of multiple-inclusion guards


# 1.348 19-Jun-2023 rillig

make: clean up code for skipping files with multiple-inclusion guard

No functional change.


# 1.347 19-Jun-2023 rillig

make: if a makefile is protected by a guard, only include it once

"looks reasonable" sjg@


# 1.346 16-Jun-2023 rillig

make: remove parameter names from function declarations

No binary change.


# 1.345 01-Jun-2023 rillig

make: shorten function names, clean up comments

No functional change.


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-0-RC1 netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.354 11-Aug-2023 rillig

make: clean up multiple-inclusion guards

No functional change.


# 1.353 23-Jun-2023 rillig

make: clean up variable and function names

No functional change.


# 1.352 23-Jun-2023 rillig

make: warn about malformed patterns in ':M', ':N' and '.if make(...)'

These patterns shouldn't occur in practice, as their results are tricky
to predict. Generate a warning for now, and maybe an error later.

Reviewed by sjg@.


# 1.351 21-Jun-2023 sjg

Allow guard targets to use variables.

I commonly use __${.PARSEDIR:tA}__ where a unique guard
is needed, __${.PARSEDIR}__ is also useful in many cases.

Combination of patch from rillig and mine


# 1.350 20-Jun-2023 rillig

make: allow targets to be used as multiple-inclusion guards

This style is used by FreeBSD, among others.


# 1.349 19-Jun-2023 rillig

make: add tests for full code coverage of multiple-inclusion guards


# 1.348 19-Jun-2023 rillig

make: clean up code for skipping files with multiple-inclusion guard

No functional change.


# 1.347 19-Jun-2023 rillig

make: if a makefile is protected by a guard, only include it once

"looks reasonable" sjg@


# 1.346 16-Jun-2023 rillig

make: remove parameter names from function declarations

No binary change.


# 1.345 01-Jun-2023 rillig

make: shorten function names, clean up comments

No functional change.


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.353 23-Jun-2023 rillig

make: clean up variable and function names

No functional change.


# 1.352 23-Jun-2023 rillig

make: warn about malformed patterns in ':M', ':N' and '.if make(...)'

These patterns shouldn't occur in practice, as their results are tricky
to predict. Generate a warning for now, and maybe an error later.

Reviewed by sjg@.


# 1.351 21-Jun-2023 sjg

Allow guard targets to use variables.

I commonly use __${.PARSEDIR:tA}__ where a unique guard
is needed, __${.PARSEDIR}__ is also useful in many cases.

Combination of patch from rillig and mine


# 1.350 20-Jun-2023 rillig

make: allow targets to be used as multiple-inclusion guards

This style is used by FreeBSD, among others.


# 1.349 19-Jun-2023 rillig

make: add tests for full code coverage of multiple-inclusion guards


# 1.348 19-Jun-2023 rillig

make: clean up code for skipping files with multiple-inclusion guard

No functional change.


# 1.347 19-Jun-2023 rillig

make: if a makefile is protected by a guard, only include it once

"looks reasonable" sjg@


# 1.346 16-Jun-2023 rillig

make: remove parameter names from function declarations

No binary change.


# 1.345 01-Jun-2023 rillig

make: shorten function names, clean up comments

No functional change.


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.344 14-Feb-2023 rillig

make: reduce complexity of evaluating expressions

No functional change.


# 1.343 14-Feb-2023 rillig

make: don't interpret the return value of Var_Parse

The return value of Var_Parse is largely redundant to the returned
string. The idea behind the type VarParseResult was to migrate all call
sites to checking this return value instead of the returned string, but
that hasn't happened. Instead, the additional type only added more
complexity.

There was a single place where that return value was actually used, when
parsing conditions. And even in that case, ignoring the VarParseResult
added back an error message that previously hid bugs, in the test
cond-token-plain.mk.

Even though these error messages are redundant in the other tests, they
don't hurt as they don't happen often.


Revision tags: netbsd-10-base
# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.342 24-Sep-2022 rillig

make: clean up tracking of depth of nested .if directives

The variable cond_min_depth was redundant. It was only accessed while
parsing the makefiles. Merging it into struct IncludedFile removes the
possible confusion between cond_min_depth and including_cond_min_depth.

No functional change.


# 1.341 24-Sep-2022 rillig

make: fix variable and function names relating to .if nesting

The previous names were confusing since they suggested that cond_depth
instead of cond_min_depth would be saved and restored.

No functional change.


# 1.340 24-Sep-2022 rillig

make: move Cond_save_depth above Cond_restore_depth

This puts the functions into chronological order, as saving happens
before restoring.

No functional change.


# 1.339 24-Sep-2022 rillig

make: use assertion for internal error condition

When the nesting level of conditionals is restored to an unreasonably
high value, the error message "0 open conditionals" doesn't make sense.


# 1.338 23-Sep-2022 sjg

Cond_reset_depth just use cond_min_depth

To avoid errors from unclosed conditionals on .break
it is sufficient to just set cond_depth = cond_min_depth.

Patch from rillig


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.337 08-Sep-2022 rillig

make: list comparison operators in declaration order

This allows a tiny optimization in the switch statement.

No functional change.


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.336 04-Sep-2022 rillig

make: add more details to error message for numeric comparison

Before:
String comparison operator must be either == or !=

After:
Comparison with '>=' requires both operands 'no' and '10' to be numeric

Noticed by martin@ in pkgsrc/textproc/py-pygments.


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.335 02-Sep-2022 sjg

make: add .break to terminate .for loop early

When .break is encountered within a .for loop
it causes immediate termination.

Outside of a .for loop .break causes a parse error.

Reviewed by: christos


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-3-RELEASE netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.334 15-Apr-2022 rillig

tests/make: adjust expectations to actual behavior

The bug in deptgt-silent-jobs.mk has been fixed, the debug logging for
comparing conditions and for deleting global variables has changed
intentionally.


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.333 03-Mar-2022 rillig

make: improve comments about parsing and evaluating conditions

No binary change.


# 1.332 03-Mar-2022 rillig

make: improve local variable name in ParseWord in conditions

That function not only parses function arguments but also bare words, so
the name argBuf didn't match anymore.

No binary change.


# 1.331 03-Mar-2022 rillig

make: make debug logging for comparisons less technical


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.330 11-Feb-2022 rillig

make: simplify control flow in CondParser_Comparison

No functional change.


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.329 09-Feb-2022 rillig

make: fix mistakes, spelling and typos in comments and manual page

No binary change for -DNDEBUG.


# 1.328 09-Feb-2022 rillig

make: clean up variable names

No binary change.


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.327 29-Jan-2022 rillig

make: rename labels in CondParser_Leaf

No binary change.


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.326 15-Jan-2022 rillig

make: replace Var_Value with Var_Exists where applicable

The latter function already existed in 1993, no idea why it was not
used.

No functional change.


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.325 14-Jan-2022 rillig

make: inline EvalBare

No functional change.


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.324 07-Jan-2022 rillig

make: clean up function argument names and comments

No binary change except for assertion line numbers.


# 1.323 07-Jan-2022 rillig

make: remove redundant initializer in CondParser_ComparisonOrLeaf

No binary change.


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.322 02-Jan-2022 rillig

make: clean up nitpicks

In ParseWord, the expressions '*p' and 'ch' are the same.

In ParseDependencyTargetWord, clean up a wordy comment and join two
conditions.

In the test cond-token-number, clarify that make doesn't convert from
hex to decimal but only from hex to internal representation.

No functional change.


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.321 30-Dec-2021 rillig

tests/make: demonstrate edge case that evaluates an expression twice


# 1.320 30-Dec-2021 rillig

make: remove redundant code from CondParser_ComparisonOrLeaf

No functional change.


# 1.319 30-Dec-2021 rillig

make: split ParseWord into the actual ParseWord and ParseFuncArg

Combining two similar but fundamentally different parsing tasks in a
single function only increased the complexity, of the implementation as
well as the call sites.

The code makes it obvious now that a function argument is a bare word
surrounded by parentheses.

The special case of an empty word is only needed for the function
argument, it cannot occur in a bare word. The code for that has been
moved to the caller. Such an empty word not only occurs for 'defined()'
but also for 'defined(${:U})'.

No functional change.


# 1.318 30-Dec-2021 rillig

make: make ParseWord in condition parser simpler

Merge the two return values (bool, string) into a single return value.
As before, the caller cannot observe the difference between a parse
error and an empty word, both are handled in the same way.

In CondParser_ComparisonOrLeaf, the word cannot be empty since the
calling function CondParser_Token already handles all cases that could
lead to an empty word.

No functional change.


# 1.317 30-Dec-2021 rillig

make: internally return false for irrelevant leaves in conditions

The result of irrelevant leaves is effectively ignored by CondParser_And
and CondParser_Or. Use the 'doEval &&' pattern to make the code
consistent with CondParser_Comparison and CondParser_FuncCall.

No functional change.


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.316 29-Dec-2021 rillig

make: in irrelevant function calls in conditions, return false

When a condition contains an irrelevant function call, it doesn't matter
whether the function call evaluates to true or to false, it will be
discarded anyway by either CondParser_And or CondParser_Or.

Returning false instead of true makes the code simpler, plus it is more
common to return false for irrelevant results.

No functional change.


# 1.315 29-Dec-2021 rillig

make: use simpler return type for ParseWord in conditions

No functional change.


# 1.314 29-Dec-2021 rillig

make: replace table for function lookup in conditions with simple code

The code for looking up the function from the table forced the compiler
to use a specific memory layout. Replacing the table with explicit code
provides the compiler more opportunities to optimize the code. Another
side effect is that there are fewer pointer operations.

Previously, is_token checked that the character after the word does not
continue the word, this is now done separately since for the function
lookup, this check was unnecessary. The newly added skip_string
provides a higher abstraction level, it is no longer necessary to pass
the string length as a separate, redundant parameter.

No functional change.


# 1.313 29-Dec-2021 rillig

make: clean up condition parser

No functional change.


# 1.312 29-Dec-2021 rillig

make: merge duplicate types CondEvalResult and CondResult

No binary change.


# 1.311 29-Dec-2021 rillig

make: merge duplicate enum constants for CondEvalResult and CondResult

No binary change.


# 1.310 29-Dec-2021 rillig

make: remove redundant parameter for evaluating conditions

No functional change.


# 1.309 29-Dec-2021 rillig

make: merge types CondResult and CondEvalResult

No functional change.


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.308 27-Dec-2021 rillig

make: rename local variables to be simpler

No binary change.


# 1.307 27-Dec-2021 rillig

make: clean up comments


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.306 15-Dec-2021 rillig

make: format comments according to /usr/share/misc/style

Assisted by indent(1), with manual corrections due to its many remaining
bugs.

No functional change.


# 1.305 15-Dec-2021 rillig

make: use consistent indentation for statements and continuations

No binary change, except for line numbers in assertions in suff.c.


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.304 13-Dec-2021 rillig

make: condense CondParser_ComparisonOp

No functional change.


# 1.303 13-Dec-2021 rillig

make: fix memory leak when parsing '.if ${expr}' (since 2004-04-13)

$ (
echo 'VAR=value'
perl -e 'printf(".if \${VAR}\n.endif\n" x 5000);';
echo 'all:'
printf '\t%s\n' \
'@pid=$$$$; \' \
'ppid=$$(ps -o ppid -p "$$pid" | sed 1d); \' \
'ps -o vsz,rsz -p $$ppid | sed 1d'
) > leak-cond2.mk

$ make-2004.04.08.07.24.26 -r -f leak-cond.mk
2668
$ make-2004.04.13.16.06.23 -r -f leak-cond.mk
3964

$ echo $(((3964 - 2668) * 1000 / 5000))
259

This 259 is close enough to the 256 from Buf_Init in CondParser_Leaf.


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.302 12-Dec-2021 rillig

tests/make: refine comments for parsing and evaluating conditions


# 1.301 12-Dec-2021 rillig

make: rename ParseFuncArg to ParseWord, update comments

No functional change.


# 1.300 12-Dec-2021 rillig

make: merge duplicate code in CondParser_FuncCall

No functional change.


# 1.299 12-Dec-2021 rillig

make: generate more specific error message on malformed conditional


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.298 11-Dec-2021 rillig

make: remove dead code in CondParser_FuncCall

The return value (size_t)-1 was only used by the function 'empty', which
moved to CondParser_FuncCallEmpty.

No functional change.


# 1.297 11-Dec-2021 rillig

make: remove unused function parameter in conditional handling

No functional change.


# 1.296 11-Dec-2021 rillig

make: clean up CondParser_FuncCallEmpty

No functional change.


# 1.295 11-Dec-2021 rillig

make: inline ParseEmptyArg into CondParser_FuncCallEmpty

No functional change.


# 1.294 11-Dec-2021 rillig

make: simplify evaluation of function 'empty'

No functional change.


# 1.293 11-Dec-2021 rillig

make: merge duplicate code in ParseEmptyArg

No functional change.


# 1.292 11-Dec-2021 rillig

make: use proper return type for ParseEmptyArg

Now that ParseEmptyArg is no longer bound to have the same prototype as
ParseFuncArg, it can use a more appropriate return type instead of
encoding everything in a size_t.

Since ParseEmptyArg never returned 0, that code path was unused. It was
only used for all other functions.

No functional change.


# 1.291 11-Dec-2021 rillig

make: remove unused arguments from CondParser_FuncCallEmpty

No functional change.


# 1.290 11-Dec-2021 rillig

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

No functional change.


# 1.289 10-Dec-2021 rillig

make: merge duplicate code in parsing conditions

No functional change.


# 1.288 10-Dec-2021 rillig

make: remove recursion from CondParser_And

No functional change intended. Before cond.c 1.286 from today, there
would have been the functional change that in malformed conditions, the
extra expression would not be evaluated. Now that CondParser_Token is
always called with doEval == false, there is no change in behavior to be
expected.


# 1.287 10-Dec-2021 rillig

make: do not expand operator token in CondParser_Or

At the point where CondParser_Or calls CondParser_Token, there was a
previous call to CondParser_And. Due to this, the next token is already
stored in par->curr, and the parameter doEval is ignored.

Changing the argument from doEval to false makes the code similar to the
corresponding code in CondParser_And.

No functional change.


# 1.286 10-Dec-2021 rillig

make: do not evaluate misplaced expressions in malformed conditions

This change only affects the behavior for parse errors. Syntactically
well-formed conditions work exactly as before.


# 1.285 10-Dec-2021 rillig

make: simplify parsing of '||' in conditions

Previously, the grammar said 'Or -> Or || And', while the code looked
more like 'Or -> And || Or'. Make the code look like the grammar and
keep track of the resulting value of the condition explicitly.

No functional change intended.


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.284 09-Dec-2021 rillig

make: revert previous commit to CondParser_Or

Even though the unit tests for make cover a lot of cases, they don't
cover all cases. After the previous commit, the NetBSD build failed
with:

bsd.sys.mk line 247: \
Malformed conditional (!defined(NOPIE) && \
(!defined(LDSTATIC) || ${LDSTATIC} != "-static"))


# 1.283 09-Dec-2021 rillig

make: avoid recursion in CondParser_Or

Previously, a long chain of '1 || 1 || 1 || 1 || ...' led to a deep
recursion. Furhermore, the code didn't match the grammar on superficial
reading: the grammar said "or || and", the code said "and || or".

No functional change.


# 1.282 09-Dec-2021 rillig

make: remove period from end of error messages and warnings

The majority of the existing error messages and warnings does not
include a period at the end. Follow this style consistently.


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.281 05-Dec-2021 rillig

make: fix comments


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.280 26-Sep-2021 rillig

make: fix lint warning on i386

cond.c(800): warning: argument #3 is converted from 'unsigned char' to
'unsigned int' due to prototype [259]


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.279 21-Sep-2021 rillig

make: reduce relocations, thereby reducing .text size

No functional change.


# 1.278 21-Sep-2021 rillig

make: reduce relocations and thereby .text size, make opname const

No functional change.


# 1.277 21-Sep-2021 rillig

make: rename and invert CondParser.lhsStrict to leftUnquotedOK

The new name is easier to grasp than the rather abstract word 'strict'.

No functional change.


# 1.276 21-Sep-2021 rillig

make: do not allow unquoted 'left == right' after modifier ':?'

Having a static variable for state that clearly belongs in the parser
looked suspicious, and indeed it was wrong.

When the distinction between .if conditions and expressions of the form
${condition:?:} was added in cond.c 1.68 from 2015-05-05, a new unit
test was added, but it didn't cover this edge case. At that time, the
state of the condition parser consisted of a few global variables
instead of a separate data type, as would have been appropriate for
parsing nested conditions.


# 1.275 21-Sep-2021 rillig

make: remove unnecessary negation from CondParser_StringExpr

No functional change.


# 1.274 21-Sep-2021 rillig

make: remove unnecessary const from parameters

These were leftovers from earlier refactorings, when extracting code to
separate functions.

No functional change.


# 1.273 21-Sep-2021 rillig

make: fix out-of-bounds memory read (since previous commit)


# 1.272 21-Sep-2021 rillig

make: reduce indentation in CondParser_FuncCall

No functional change.


# 1.271 21-Sep-2021 rillig

make: fix documentation about operator associativity in conditions


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.270 29-Jul-2021 rillig

make: in TryParseNumber, reset errno as late as possible

No functional change.


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.269 21-Jun-2021 rillig

make: fix grammar in error message for malformed conditional


# 1.268 21-Jun-2021 rillig

make: clean up comments in cond.c


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.267 11-Jun-2021 rillig

make: inline strcmp when parsing conditions

GCC 10 does not do that even though it could easily.

No functional change.


# 1.266 11-Jun-2021 rillig

make: clean up function names and documentation for conditions

No functional change.


# 1.265 11-Jun-2021 rillig

make: rename If_Eval to EvalBare

No functional change.


# 1.264 11-Jun-2021 rillig

make: move parsing of function calls out of CondParser_LeafToken

The grammar above the parsing code says that a Leaf has nothing to do
with function calls, so don't mix these in the actual code.

No functional change.


# 1.263 11-Jun-2021 rillig

make: improve function names for parsing conditions

No functional change.


Revision tags: cjep_sun2x-base1 cjep_sun2x-base cjep_staticlib_x-base1 cjep_staticlib_x-base
# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-2-RELEASE netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.262 19-Apr-2021 rillig

make: do not complain when skipping the condition 'no >= 10'

Seen in external/bsd/tmux when building with Clang. See
varmod-ifelse.mk for the detailed story.


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.261 04-Apr-2021 rillig

make: convert VarEvalFlags back into an enum, but not a bit-set

As was apparent in VarEvalFlags_ToString, a bit-set was not the best
data type since most of the flags were not freely combinable. The two
flags that could be combined were keepDollar and keepUndef, but even
these have distinguished names in the debug log.

The downside of struct bit-fields is that they need extra helper
functions in C90 (see nonints.h). Exchange these for a few helper
functions in var.c, to keep the code outside var.c simple.

No functional change.


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.260 03-Apr-2021 rillig

make: use C99 bool type instead of defining its own

No functional change.


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.259 15-Mar-2021 rillig

make: replace enum bit-field with struct bit-field for VarEvalFlags

This makes the code easier to read, especially in var.c. It also makes
debugging sessions easier since some debuggers don't show enum
bit-fields symbolically as soon as more than one bit is set.

The code outside var.c is basically unchanged, except that instead of
passing the individual flags, there are 4 predefined evaluation modes.
These suffice for all practical use cases. Only in the implementation
deep inside var.c, the value of the flags keepDollar and keepUndef
differs.

There is no way of passing the struct to EnumFlags_ToString, which means
the ToString function has to be spelled out explicitly. This allows for
fine-tuning the representation in the debug log, to reduce the amount of
uppercae letters.

No functional change.


# 1.258 15-Mar-2021 rillig

make: rename VARE_NONE to VARE_PARSE_ONLY

The name 'NONE' described the bit pattern, which was not useful to
understand its meaning. Omitting VARE_WANTRES only parses the
expression, without evaluating any part of it.

No functional change, not even in debug mode since Enum_FlagsToString
always returns "none" for all-bits-unset.


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.257 22-Feb-2021 rillig

make: remove freestanding freeIt variables

These variables all belong to a string variable. Connect them using
FStr, which reduces the number of variables to keep track of.

No functional change.


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.256 05-Feb-2021 rillig

make: in the Var_ functions, move the scope to the front

This change provides for a more natural reading order in the code.
Placing the scope first makes it immediately clear in which context the
remaining parameters are interpreted.

No functional change.


# 1.255 04-Feb-2021 rillig

make: rename some VAR constants to SCOPE

The word "context" does not fit perfectly to the variables that are
associate with a GNode, as the context is usually something from the
outside and the variables are more like properties inherent to the
GNode.

The term "global context" fits even less. Since the thing where
variables are looked up is commonly named a scope, use that term
instead.

This commit only renames the global variables VAR_GLOBAL, VAR_INTERNAL
and VAR_CMDLINE, plus a few very closely related comments. These are:

GNode.vars (because of line breaks)
GNode_Free (dito)
varname-make_print_var_on_error.mk
varname-make_print_var_on_error-jobs.mk

The debug message in Var_Stats is left as-is since there is no unit test
for it yet.

The other renamings (variable names "context", "ctxt", as well as
further comments) will be done in a follow-up commit.


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.254 30-Jan-2021 rillig

make(1): split Buf_Destroy into Buf_Done and Buf_DoneData

In all cases except one, the boolean argument to Buf_Destroy was
constant. Removing that argument by splitting the function into two
separate functions makes the intention clearer on the call site. It
also removes the possibility for using the return value of Buf_Done,
which would have made no sense.

The function Buf_Done now pairs with Buf_Init, just as in HashTable and
Lst.

Even though Buf_Done is essentially a no-op, it is kept as a function,
both for symmetry with Buf_Init and for clearing the Buffer members
after use (this will be done only in CLEANUP mode, in a follow-up
commit).


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.253 22-Jan-2021 rillig

make(1): remove "warning" from missing closing parenthesis

This only affects the diagnostics for parse errors that involve a
missing closing parenthesis. Whether or not this is a parse error is
still the same.

It may look redundant to pass both the CondParser and the parsing
position pp to the functions, but that's necessary since during parsing,
not every code path updates the main parsing position immediately.


# 1.252 21-Jan-2021 rillig

make(1): replace warning + error with just an error in conditionals

Before, there was a "warning" for comparing strings using '<', which was
wrong. That warning was then followed by an error, after parsing the
whole conditional. This was only because it was easier to implement.

Replace the warning with an actual error. This only affects
conditionals in .if lines, the conditionals in the :? modifier such as
${"A" < "B":?smaller:greater} still print 2 errors.


# 1.251 21-Jan-2021 rillig

make(1): fix debug output for comparison operators in conditionals

This produces fewer warnings than before, but these were edge cases that
probably didn't matter in practice. The "Malformaed conditional" is
still generated, the set of accepted conditionals is still the same.


# 1.250 21-Jan-2021 rillig

make(1): document wrong debug output in evaluation of conditionals


# 1.249 21-Jan-2021 rillig

make(1): reformat CondParser_StringExpr


# 1.248 21-Jan-2021 rillig

make(1): extract CondParser_StringExpr from CondParser_String


# 1.247 21-Jan-2021 rillig

make(1): demonstrate parse error without error message in conditional


# 1.246 21-Jan-2021 rillig

make(1): make CondParser_String simpler

No functional change.


# 1.245 21-Jan-2021 rillig

make(1): fix Coverity annotation

FStr is not an allocated data type.


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.244 19-Jan-2021 rillig

make(1): extract DetermineKindOfConditional from Cond_EvalLine


# 1.243 19-Jan-2021 rillig

make(1): remove struct If from evaluation of conditionals

The variant of the .if directive can be stored in the CondParser
directly, instead of pointing to a struct If.

The type CondParser may have to be renamed since the condition is not
only parsed, it is evaluated as well.

No functional change.


# 1.242 19-Jan-2021 rillig

make(1): remove do-not-format markers from comments

These markers had been used inconsistently. Furthermore the source code
had not been formatted automatically before 2020 at all, otherwise there
wouldn't have been any trailing whitespace left.


# 1.241 19-Jan-2021 rillig

make(1): distinguish between tokens and results in conditionals

No functional change.


# 1.240 19-Jan-2021 rillig

make(1): update references to the renamed CondParser functions


# 1.239 19-Jan-2021 rillig

make(1): condense code for parsing and evaluating conditionals


# 1.238 19-Jan-2021 rillig

make(1): add error handling for edge case in malformed conditions


# 1.237 19-Jan-2021 rillig

make(1): fix possible return values for CondParser_Term

The invalid return values didn't do any harm since CondParser_Factor and
CondParser_Expr passed them through, and CondParser_Eval carefully
checks for TOK_TRUE or TOK_FALSE and treats everything else as an error.

No change in observable behavior since there is no debug logging in that
part of the code.


# 1.236 19-Jan-2021 rillig

make(1): demonstrate wrong return value in CondParser_Term


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.235 10-Jan-2021 rillig

make(1): consistently use boolean expressions in conditions

Most of the make code already followed the style of explicitly writing
(ptr != NULL) instead of the shorter (ptr) in conditions.

The remaining 50 instances have been found by an experimental,
unpublished check in lint(1) that treats bool expressions as
incompatible to any other scalar type, just as in Java, C#, Pascal and
several other languages.

The only unsafe operation on Boolean that is left over is (flags &
FLAG), for an enum implementing a bit set. If Boolean is an ordinary
integer type (the default), some high bits may get lost. But if Boolean
is the same as _Bool (by compiling with -DUSE_C99_BOOLEAN), C99 6.3.1.2
defines that a conversion from any scalar to the type _Bool acts as a
comparison to 0, which cannot lose any bits.


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.234 09-Jan-2021 rillig

make(1): fix lint warnings


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.233 30-Dec-2020 rillig

make(1): format multi-line comments


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.232 27-Dec-2020 rillig

make(1): clean up VarParseResult constants

The many constants were invented because at that time I didn't quite
understand the actual outcomes of Var_Parse that need to be
distinguished. There are only a few:

(1) Errors, whether they are parse errors, or evaluation errors or
undefined variables. The old constants VPR_PARSE_MSG and
VPR_UNDEF_MSG are merged into VPR_ERR.

(2) Undefined expressions in a situation in which they are allowed.
Previously the documentation for VPR_UNDEF_SILENT talked about
undefined expressions in situations where they were not allowed.
That case is fully covered by VPR_ERR instead.

(3) Errors that are silently ignored. These are probably bugs.

(4) Everything went fine, the expression has a defined value.


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.231 23-Dec-2020 rillig

make(1): rename CmdOpts.lint to strict

When running lint(1) on the code, it defines the preprocessor macro
"lint" to 1, which generated a syntax error in the declaration "Boolean
lint", as that became "Boolean 1".


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.230 20-Dec-2020 rillig

make(1): change return type of Var_Value to FStr


# 1.229 20-Dec-2020 rillig

make(1): return FStr from Var_Parse

This reduces the number of variable declarations at the call sites.


# 1.228 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.227 20-Dec-2020 rillig

make(1): clean up memory handling in CondParser_String


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.226 14-Dec-2020 rillig

make(1): error out on .else with extraneous text


# 1.225 14-Dec-2020 rillig

make(1): error out if an '.endif' contains extraneous text


# 1.224 14-Dec-2020 rillig

make(1): make structure of the code in Cond_EvalLine clearer


# 1.223 14-Dec-2020 rillig

make(1): don't pretend to expand CondParser_Eval

At that point, the variable expression has already been expanded. To
avoid the impression that the token might be relevant, pass FALSE
instead of TRUE. No change of behavior.


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.222 12-Dec-2020 rillig

make(1): remove const from function parameters

These have been left-overs from refactoring, when these pieces were
extracted to separate functions.


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.221 05-Dec-2020 rillig

make(1): remove redundant assignments


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.220 29-Nov-2020 rillig

make(1): reduce memory allocation for dirSearchPath


# 1.219 28-Nov-2020 rillig

make(1): reduce memory allocation for CmdOpts.create


# 1.218 28-Nov-2020 rillig

make(1): remove pointer indirection from GNode.commands

Just to save a few memory allocations. No noticeable effect on the
performance though.


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.217 23-Nov-2020 rillig

make(1): use properly typed comparisons in boolean contexts


# 1.216 23-Nov-2020 rillig

make(1): align end-of-line comments with tabs


# 1.215 23-Nov-2020 rillig

make(1): indent cond.c with tabs instead of spaces


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.214 13-Nov-2020 rillig

make(1): in lint mode, check for ".else <cond>"


# 1.213 13-Nov-2020 rillig

make(1): use bitset for IfState

Previously, the individual IfStates contained redundant information,
which was apparent in the documentation. This led to expressions like
(state > ELSE_ACTIVE) that are hard to read since the reader has to look
up the order of the enum.

To avoid this, the state of an '.if' block is now encoded using a bitset,
encoding the properties of each state directly. This replaces the
previous (state > ELSE_ACTIVE) with !(state & IFS_ACTIVE), which is
easier to understand.

No change in behavior.


# 1.212 13-Nov-2020 rillig

make(1): replace large switch with if-else in Cond_EvalLine


# 1.211 13-Nov-2020 rillig

make(1): move the comment about ".else <cond>" to the correct place


# 1.210 12-Nov-2020 rillig

make(1): improve readability of IfState documentation

The words "None" and "One" looked and sounded too similar.


# 1.209 12-Nov-2020 rillig

make(1): rename local variable in Cond_EvalLine

A variable called line is not supposed to be a moving target, that's what
the name p is reserved for.


# 1.208 12-Nov-2020 rillig

make(1): remove complicated code to find the definition for plain .if


# 1.207 12-Nov-2020 rillig

make(1): document IfState in more detail


# 1.206 12-Nov-2020 rillig

make(1): clean up Cond_EvalLine

The constant MAXIF was not a maximum but an initial capacity. Inline it
to remove the misleading name. Likewise, MAXIF_BUMP was an unnecessary
and wrong name.

Rename the enum since it only describes a single state, not multiple.

Rename the stack of states since it describes multiple states, not one.

Add markers where to add the missing error messages for unknown
directives or extraneous cond, such as in ".else cond" or ".endif cond".


# 1.205 11-Nov-2020 rillig

make(1): document non-obvious special case in EvalNotEmpty


# 1.204 11-Nov-2020 rillig

make(1): add test to cover the If_Eval call in EvalNotEmpty


# 1.203 10-Nov-2020 rillig

make(1): remove unreachable code from CondParser_String

The code that has been removed was not reachable from after the Var_Parse
call. All branches after the Var_Parse are either freed properly or
return the expanded value.


# 1.202 10-Nov-2020 rillig

make(1): fix error message when parsing unknown .if (since 2005-05-01)


# 1.201 10-Nov-2020 rillig

make(1): add tests for parsing conditionals, document a parsing bug


# 1.200 10-Nov-2020 rillig

make(1): document ParseEmptyArg


# 1.199 10-Nov-2020 rillig

make(1): remove unnecessary NULL marker from functions list

Comparing the pointer works equally well and uses less memory.


# 1.198 09-Nov-2020 rillig

make(1): document handling of '#' and '\n' in conditionals


# 1.197 08-Nov-2020 rillig

make(1): in lint mode, only allow '&&' and '||', not '&' and '|'

These variants of the condition operators are neither documented in the
manual page nor are they used in practice.


# 1.196 08-Nov-2020 rillig

make(1): extract CondParser_Func from CondParser_LeafToken


# 1.195 08-Nov-2020 rillig

make(1): inline strchr call in CondParser_LeafToken


# 1.194 08-Nov-2020 rillig

make(1): rename CondParser_Func to CondParser_LeafToken

The previous name was misleading since the function did not only parse
function call expressions.


# 1.193 08-Nov-2020 rillig

make(1): fix type mismatch between int and Token


# 1.192 08-Nov-2020 rillig

make(1): improve local variable name in EvalNotEmpty


# 1.191 08-Nov-2020 rillig

make(1): improve variable names in EvalNotEmpty

In a unary expression, there is no left-hand side.


# 1.190 08-Nov-2020 rillig

make(1): rename local variable in CondParser_String


# 1.189 08-Nov-2020 rillig

make(1): clean up TryParseNumber in conditions

More descriptive variable names, more appropriate literals for
comparisons, one task per paragraph of code.


# 1.188 08-Nov-2020 rillig

make(1): clean up FuncExists


# 1.187 08-Nov-2020 rillig

make(1): clean up code related to VarEvalFlags

Mention VARE_WANTRES before VARE_UNDEFERR since the latter depends on
the former.

In ApplyModifier_Assign, VARE_KEEP_DOLLAR doesn't have to be removed
from eflags since ParseModifierPart does this already.

In EvalUndefined, testing for VARE_WANTRES is redundant if VARE_UNDEFERR
is already set.


# 1.186 08-Nov-2020 rillig

make(1): clean up VarEvalFlags in the calls to Var_Parse and Var_Subst

There are only 3 flags, and some combinations don't even make sense.

VARE_UNDEFERR only makes sense if combined with VARE_WANTRES. If the
latter is not set, the variable expressions are only parsed, without
asking whether they are defined or not. Therefore, VARE_UNDEFERR cannot
have any effect in that case.

VARE_KEEP_DOLLAR is actively ignored by ParseModifierPart. In cases
where VARE_WANTRES is not set, this means that VARE_NONE can be passed,
which is easier to grasp than any bitset operations. This also gets rid
of a few type casts from enum to unsigned int that were necessary to
pass WARNS=6.


# 1.185 07-Nov-2020 rillig

make(1): clean up CondParser_Comparison


# 1.184 07-Nov-2020 rillig

make(1): reword condition in CondParser_String

The parentheses were confusing for human readers.

The compiler doesn't really care about the wording of the condition, GCC
5 on amd64 generates non-obvious but nice code anyway, replacing the
logical or with a logical and.


# 1.183 07-Nov-2020 rillig

make(1): fix type mismatch between Boolean and Token

Even though the C boolean and Token are encoded the same, the code should
still distinguish them, for the benefit of human readers.


# 1.182 07-Nov-2020 rillig

make(1): fix type mismatch in If_Eval

No practical consequences since TOK_FALSE == 0 and TOK_TRUE == 1.


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.181 07-Nov-2020 rillig

make(1): add test for parse error in function defined()


# 1.180 07-Nov-2020 rillig

make(1): add test for parse error in condition using empty()


# 1.179 07-Nov-2020 rillig

make(1): make API of Buf_Init simpler

In most cases, the caller doesn't want to specify the exact number of
preallocated bytes.


# 1.178 07-Nov-2020 rillig

make(1): clean up code stylistically

* Replace character literal 0 with '\0'.
* Replace pointer literal 0 with NULL.
* Remove redundant parentheses.
* Parentheses in multi-line conditions are not redundant at the
beginning of a line.
* Replace a few !ptr with ptr == NULL.
* Replace a few ptr with ptr != NULL.
* Replace (expr & mask) == 0 with !(expr & mask).
* Remove redundant braces for blocks in cases where the generated code
stays the same. (Assertions further down in the code would get
different line numbers.)
* Rename parameters in CondParser_String to reflect the data flow.
* Replace #ifdef notdef with #if 0.

The generated code stays exactly the same, at least with GCC 5.5.0 on
NetBSD 8.0 amd64 using the default configuration.


# 1.177 06-Nov-2020 rillig

make(1): merge duplicate code for skipping horizontal whitespace


# 1.176 06-Nov-2020 rillig

make(1): fix tests directive-ifmake and varcmd with custom boolean

When make is compiled with -DUSE_UCHAR_BOOLEAN, these tests failed.
Merge duplicate code and don't depend on the actual value of TRUE when
evaluating conditions.


# 1.175 05-Nov-2020 rillig

make(1): remove redundant parentheses from sizeof operator

The parentheses are only needed if the argument is a type, not an
expression.


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.174 02-Nov-2020 rillig

make(1): remove word "Ptr" from variable names

Whether or not a variable is a pointer is obvious from the context.
Since the introduction of function prototypes in C90, this information
is checked by the compiler and no longer needs to be encoded in the
variable names.


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.173 30-Oct-2020 rillig

make(1): change char * to void * in Var_Value

The only purpose of the parameter freeIt is to free the memory
associated with the return value. To do this, no pointer arithmetic is
needed. Therefore, change to a void pointer, to catch accidental use of
that pointer.


# 1.172 30-Oct-2020 rillig

make(1): clean up is_separator


# 1.171 30-Oct-2020 rillig

make(1): fix parse error in string literal in conditional

The string literal "${VAR} " had produced a "Malformed conditional", at
least since 2003. (That's the oldest make I have available for testing.)
Strange that nobody else noticed that in the last 17 years.


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.170 30-Oct-2020 rillig

make(1): rename VAR_CMD to VAR_CMDLINE

Since make has to do with both the command line and child commands, the
former name was confusing.


# 1.169 26-Oct-2020 rillig

make(1): group the command line options and arguments

By having a single struct that holds all command line options and
arguments, it is easy to see in the code when such a command line
argument is modified. It also cleans up the namespace since the command
line options don't follow a common naming style. Having them in a
struct also means that there is a single place for putting the
documentation, not two as before.

The struct also suggests to extract the initialization code out of main,
which is still too large, having more than 400 lines of code and
covering far too many topics.


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.168 24-Oct-2020 rillig

make(1): clean up comments in cond.c


# 1.167 23-Oct-2020 rillig

make(1): negate OP_NOP and rename it to GNode_IsTarget


# 1.166 23-Oct-2020 rillig

make(1): inline CondFindStrMatch into FuncMake


# 1.165 22-Oct-2020 rillig

make(1): remove redundant type casts

This mainly affects the void pointers in callback functions for lists.
These had been necessary once when the parameter type was still
ClientData instead of void pointer.


# 1.164 18-Oct-2020 rillig

make(1): add tags to enum types

This allows IDEs to offer better type information than "anonymous enum".


# 1.163 17-Oct-2020 rillig

make(1): fix indentation


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: netbsd-9-1-RELEASE phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.162 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6, part 2


# 1.161 05-Oct-2020 rillig

make(1): make cond.c ready for WARNS=6


# 1.160 05-Oct-2020 rillig

make(1): revert previous commit

It had accidentally reverted all the work from the past few days.


# 1.159 05-Oct-2020 rillig

make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02)

The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In
that commit, openDirectories was replaced with a combination of a list
with a hash table, for more efficient lookup by name.

Upon cleanup, OpenDirs_Done is called, which in turn called
Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and
empties it. This was no problem before since afterwards the list was
empty and calling Lst_Free just frees the remaining list pointer.

With OpenDirs, this list was combined with a hash table, and the hash
table contains the list nodes, assuming that the OpenDirs functions have
full ownership of both the list and the hash table. This assumption was
generally correct, except for the one moment during cleanup where full
ownership of the list was passed to Dir_ClearPath, while the hash table
still contained pointers to the (now freed) list nodes. This by itself
was not a problem since the hash table would be freed afterwards. But
as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up
the freed directory by name and now found the freed list node, trying to
free it again. Boom.

Fixed by replacing the call to Dir_ClearPath with code that only frees
the directories, without giving up control over the list.


# 1.158 05-Oct-2020 rillig

make(1): fix test for .ifndef when compiled with -DUSE_UCHAR_BOOLEAN

In that compilation variant, TRUE is defined to 255, to see whether all
boolean expressions evaluate to either 1 or 0. The field If.doNot in
cond.c doesn't do this since it uses the actual value of TRUE.
Therefore, change the evaluation slightly to also handle this case.


# 1.157 03-Oct-2020 rillig

make(1): use consistent pattern for parsing whitespace

The pp and cpp in the function names stand for "parsing position" and
"const parsing position".


# 1.156 01-Oct-2020 rillig

make(1): remove redundant function prototypes


# 1.155 28-Sep-2020 rillig

make(1): replace += 1 with ++ and -= 1 with --

Just for visual consistency. The generated code stays exactly the same.


# 1.154 28-Sep-2020 rillig

make(1): make debugging code shorter


# 1.153 27-Sep-2020 rillig

make(1): normalize whitespace in source code

There is no more space tab. Either only tabs or only spaces or tabs
followed by spaces, but not spaces followed by tabs.


# 1.152 26-Sep-2020 rillig

make(1): clean up API for finding and creating GNodes

The previous API had complicated rules for the cases in which the single
function returned NULL or what it did. The flags for that function were
confusing since passing TARG_NOHASH would create a new node even though
TARG_CREATE was not included in that bit mask.

Splitting the function into 3 separate functions avoids this confusion.
It also reveals several places where the complicated API led to
unreachable code. Such code has been removed.


# 1.151 25-Sep-2020 rillig

make(1): rename variables cp2 to be more expressive


# 1.150 25-Sep-2020 rillig

make(1): add tags to some of the unnamed structs

The tags prevent the structs from accidentally becoming compatible
types.

While here, remove a few typedefs for structs that are single-purpose,
since there is no point in abstracting from the actual representation of
these types.


# 1.149 25-Sep-2020 rillig

make(1): rename local variables in ParseFuncArg


# 1.148 22-Sep-2020 rillig

make(1): rename VarParseErrors to VarParseResult

The name VPE_OK was confusing since it was not an error at all.


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.147 14-Sep-2020 rillig

make(1): fix coverity annotation for CondParser_String

It had been broken since 2020-09-08, when CondLexer (now CondParser) was
added.


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.146 13-Sep-2020 rillig

make(1): suppress wrong "Malformed conditional" for undefined variables

This only has an effect in lint mode right now.


# 1.145 13-Sep-2020 rillig

make(1): prepare Var_Parse for proper error handling and reporting

Right now, Var_Parse swallows many errors during parsing and evaluation.
Ideally, these errors should propagate from the deeply nested
expressions where they occur up to the top-level expressions. When such
an error occurs, the depending expressions should not be evaluated any
further. They may still be parsed, but side effects should be
minimized.

The goal is to prevent incomplete expressions like the "xy}" in
moderrs.exp:106 from being evaluated and eventually passed to the shell
for execution. This expression is a left-over from a parse error in the
mod-t-parse target in moderrs.mk:154.

This commit is a first step in analyzing and verifying the current state
of affairs. The modelling in VarParseErrors already looks complicated
but is expected to closely match reality.


# 1.144 13-Sep-2020 rillig

make(1): clean up RCSID blocks

These blocks mostly consisted of redundant structure, following the same
#ifndef pattern over and over, with only minimal variation.

It's easier to maintain if the common structure is only written once and
encapsulated in a macro.

To avoid "defined but unused" warnings from GCC in the case where
MAKE_NATIVE is not defined, I had to add volatile. Adding
MAKE_ATTR_UNUSED alone would not preserve the rcsid variable in the
resulting binary.


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.143 13-Sep-2020 rillig

make(1): fix parameter type of CondEvalExpression


# 1.142 13-Sep-2020 rillig

make(1): clean up API for evaluating conditions

There was no need to make struct If publicly visible.

There was no need to have parameters in the public API that were passed
the same constants all the time.

The former function names had not been distinctive.


# 1.141 12-Sep-2020 rillig

make(1): rename Var_ParsePP back to Var_Parse

The migration to the "parsing position" pointer has been done.


# 1.140 12-Sep-2020 rillig

make(1): migrate CondParser_String to Var_ParsePP


# 1.139 12-Sep-2020 rillig

make(1): use correct character literals in TryParseNumber


# 1.138 12-Sep-2020 rillig

make(1): clean up code in CondParser_String

The two parts of the for loop were not related in any way, which made
the code more confusing than necessary.


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.137 12-Sep-2020 rillig

make(1): fix inconsistent code indentation


# 1.136 12-Sep-2020 rillig

make(1): inline local variable in Cond_Eval


# 1.135 12-Sep-2020 rillig

make(1): fix wording of parse error in conditionals

The word "should" is not appropriate for situations that eventually lead
to a parse error.


# 1.134 11-Sep-2020 rillig

make(1): add wrappers around ctype.h functions

This avoids casting the argument to unsigned char, and to cast the
result of toupper/tolower back to char.


# 1.133 11-Sep-2020 rillig

make(1): split EvalComparison into smaller functions


# 1.132 11-Sep-2020 rillig

make(1): clean up code for evaluating conditions


# 1.131 11-Sep-2020 rillig

make(1): extract EvalNotEmpty from CondParser_Comparison


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.130 11-Sep-2020 rillig

make(1): split CondParser_Comparison into 2 parts


# 1.129 11-Sep-2020 rillig

make(1): document CondParser_Comparison


# 1.128 11-Sep-2020 rillig

make(1): add tests for really strange edge cases in conditions


# 1.127 11-Sep-2020 rillig

make(1): reorder parameters of condition parsing functions

First the subject, then the options, then the output parameters.


# 1.126 11-Sep-2020 rillig

make(1): reduce code size in CondParser_Eval


# 1.125 11-Sep-2020 rillig

make(1): use consistent naming scheme for condition parsing functions


# 1.124 11-Sep-2020 rillig

make(1): rename CondGetString to CondParser_String

This describes the function's effect more accurately. The verb "get" is
not commonly associated to having side effects.


# 1.123 11-Sep-2020 rillig

make(1): replace *par->p with par->p[0]

It's a few characters more code than before but can be read strictly
from left to right, which was not possible before.


# 1.122 11-Sep-2020 rillig

make(1): rename CondParser.condExpr to p

The prefix "cond" was needed when this struct field was a global
variable. The main name "expr" was not precise enough since this code is
about parsing a condition, not an expression.

During parsing, this variable does not contain the whole expression but
a pointer to the remaining part of the condition, therefore the name
"expr" had been confusing.


# 1.121 11-Sep-2020 rillig

make(1): rename CondLexer to CondParser

The name CondLexer was wrong since this type is about parsing conditions
that can be arbitrarily nested.


# 1.120 10-Sep-2020 rillig

make(1): reduce code size in CondGetString

The pattern is now the usual "test the character, then increment the
pointer", throughout the whole function.


# 1.119 10-Sep-2020 rillig

make(1): skip redundant condExpr-- in CondGetString


# 1.118 10-Sep-2020 rillig

make(1): reduce code size for parsing the || or && operators

On x86_64, accessing [0] generates less code than [1].


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.117 08-Sep-2020 rillig

make(1): clean up comments in cond.c


# 1.116 08-Sep-2020 rillig

make(1): add CondLexer_SkipWhitespace


# 1.115 08-Sep-2020 rillig

make(1): rename CondLexer.condPushBack to curr

This variable has some context information from the struct now,
therefore its name can be shorter.


# 1.114 08-Sep-2020 rillig

make(1): group the condition parsing state into a struct

Instead of having 3 global variables, the struct clearly communicates
that the 3 variables belong together. During debugging, it's easy to
just "p *lex" instead of remembering the names of the 3 former global
variables.

Converting the global variables into a local variable makes it
immediately clear that the functions in this file operate on this
struct. Keeping the global variables in mind is more difficult. Having
a local variable also gets rid of the 3 sv_* variables in
Cond_EvalExpression, which were also a sign that these "global
variables" were not that global at all.

This commit only contains the minimal code changes for converting the
variables into a local struct. It was tempting to add functions like
CondLexer_SkipWhitespace, but this is better left for a follow-up
commit.


# 1.113 08-Sep-2020 rillig

make(1): in CondGetString, replace repeated Buf_Add with Buf_AddStr


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.112 04-Sep-2020 rillig

make(1): rename local functions for parsing conditions

The word "get" implies a cheap operation without side effects. Parsing
instead has lots of side effects, even if it's only that the parsing
position is updated.


# 1.111 04-Sep-2020 rillig

make(1): migrate get_mpt_arg to Var_ParsePP

This part is covered well by the unit tests. When I forgot to decrement
the linePtr, several of them failed reliably.


# 1.110 04-Sep-2020 rillig

make(1): migrate Var_Parse in CondGetArg to Var_ParsePP


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.109 03-Sep-2020 rillig

make(1): document use of magic values in CondDoEmpty


# 1.108 03-Sep-2020 rillig

make(1): update documentation for Cond_EvalExpression and Cond_Eval


# 1.107 03-Sep-2020 rillig

make(1): make parameter of Cond_Eval and Cond_EvalExpression const


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.106 29-Aug-2020 rillig

make(1): trust that Var_Parse never returns NULL

That function is quite long, but all its return paths lead either to the
expanded variable expression, or to var_Error or varNoError.


# 1.105 29-Aug-2020 rillig

make(1): rename Lst_FindB back to Lst_Find

The migration from "comparison function" to "match function" is done,
the "B" in the names is no longer needed.


# 1.104 29-Aug-2020 rillig

make(1): start replacing Lst_Find with Lst_FindB

Lst_Find is called with a "comparison" function that returns the integer
0 if the desired node is found. This leads to confusion since there are
so many different return value conventions for int, such as 0/1 for
mimicking false/true, -1/0 as in close(2), and the sign as in strcmp(3).
This API is much easier to understand if the "comparison" function is
not called a comparison function (since that is too close to strcmp),
but a "match" function that just returns a boolean.

In Lst_FindFromB, the node argument may be null. This deviates from the
other Lst functions, which require Lst and LstNode to generally be
non-null. In this case it is useful though to make the calling code
simpler.

In arch.c, this makes a lot of the previous documentation redundant.

In cond.c, the documentation is reduced a little bit since it had
already been cleaned up before. It also removes the strange negation
from CondFindStrMatch.

In dir.c, the documentation collapses as well.

In main.c, separating the ReadMakefile function from the callbacks for
Lst_FindB allows the former to get back its natural function signature,
with proper types and no unused parameters.

To catch any accidental mistakes during the migration from Lst_Find to
Lst_FindB, the code can be compiled with -DUSE_DOUBLE_BOOLEAN, which
will complain about incompatible function pointer types.


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.103 28-Aug-2020 rillig

make(1): remove trailing 'S' from names of Lst functions

The migration from null-passing Lst functions to argument-checking Lst
functions is completed.

There were 2 surprises: The targets list may be NULL, and in Dir_AddDir,
the path may be NULL. The latter case is especially surprising since
that function turns into an almost-nop in that case. This is another
case where probably 2 independent functions have been squeezed into a
single function. This may be improved in a follow-up commit.

All other lists were fine. They were always defined and thus didn't
need much work.


# 1.102 28-Aug-2020 rillig

make(1): migrate Lst_Find to Lst_FindS


# 1.101 27-Aug-2020 rillig

make(1): migrate Lst_IsEmpty to Lst_IsEmptyS


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.100 23-Aug-2020 rillig

make(1): reverse order of the Lst_Find parameters

The other callbacks all have (function, param), only the Lst_Find had
(param, function), which was inconsistent.


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.99 22-Aug-2020 rillig

make(1): clean up headers

Remove redundant headers that are already included by "make.h".
Make <assert.h> available to all compilation units that use "make.h".


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.98 20-Aug-2020 rillig

make(1): move complicated boolean expression out of the function call

It's easier to inspect in a debugger this way.


# 1.97 20-Aug-2020 rillig

make(1): fix type of string length variables


# 1.96 20-Aug-2020 rillig

make(1): fix wrong or outdated comments


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.95 13-Aug-2020 rillig

make(1): fix type mismatch in compare_expression

This was caught by a simple "typedef double Boolean" in sprite.h.

If only there were a C compiler with "strict" mode, where pointers,
numbers and booleans were separate and unassignable data types, this
copy-and-paste typo would have been caught much earlier.


# 1.94 13-Aug-2020 rillig

make(1): fix type of local variable in CondGetString

When the Boolean type from sprite.h is replaced with C99's standard bool
type, the chained assignment leads to the following compile error with
GCC 5:

cond.c:404:5: error: suggest parentheses around assignment used as truth
value [-Werror=parentheses]
*quoted = qt = *condExpr == '"' ? 1 : 0;

Changing the type of qt from int to bool fixes this.


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.93 09-Aug-2020 rillig

make(1): format the source code consistently, at least per file

Some files use 4 spaces per indentation level, others use 8. At least
for the few files from this commit, they use a consistent style
throughout each file now.

In Cond_Eval, the #define has changed into an enum since the identifiers
need not be visible to the C preprocessor.


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.92 08-Aug-2020 rillig

make(1): remove trailing Z from buffer functions

This Z had been useful during the migration from int to size_t. This
migration is finished, at least for the Buffer type, so the Z is no
longer necessary.


# 1.91 08-Aug-2020 rillig

make(1): mark condition strings as constant


# 1.90 08-Aug-2020 rillig

make(1): remove redundant documentation from cond.c

Many of the functions in cond.c are so small that it's faster to read
their code instead of a large block of documentation.

There are other functions that actually need a detailed description.
These have been left as-is.


# 1.89 08-Aug-2020 rillig

make(1): remove redundant function prototypes from cond.c


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.88 03-Aug-2020 rillig

make(1): no declaration-after-statement anymore

NetBSD make is intended to be maximally portable, therefore it uses only
C89. This was not declared in the Makefile before.

There are still a few places in parse.c and metachar.c that use
end-of-line comments. These will be fixed in a follow-up commit.


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.87 01-Aug-2020 rillig

make(1): switch Buffer size from int to size_t

This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.

The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.

All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.

Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.

As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.

The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.


# 1.86 01-Aug-2020 rillig

make(1): use enum for return values of Cond_Eval and friends


# 1.85 01-Aug-2020 rillig

make(1): use consistent indentation in source code

Tabs for multiples of 8, then spaces.

The usage string has been kept as-is since the spaces there are
indentional and do influence the output.


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.84 01-Aug-2020 rillig

make(1): avoid calls to free(3) in the common case of a NULL pointer


# 1.83 01-Aug-2020 rillig

make(1): make CondDoDefined simpler


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.82 26-Jul-2020 rillig

make(1): make return value of Var_Parse constant

This return value is not supposed to be modified since it can be a string
literal. The modifiable part is returned via freePtr, but only for
freeing, not for actually modifying anything.


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.81 19-Jul-2020 rillig

make(1): clean up unnecessary snprintf and multi-line function calls


# 1.80 19-Jul-2020 rillig

make(1): rename Varf_Flags to VarEvalFlags

In var.c there are lots of different flag types. To make any accidental
mixture obvious, each flag group gets its own prefix.

The only flag group that is visible outside of var.c is concerned with
evaluating variables, therefore the "e", which replaces the former "f"
that probably just meant "flag".


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.79 09-Jul-2020 sjg

compare_expression: return after fetch lhs and rhs if !doEval

Otherwise we end up throwing warings/errors for valid
conditionals due to not expanding variables fully.

Add tests to catch this.

Reviewed by: rillig


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.78 03-Jul-2020 rillig

make(1): remove trailing whitespace


# 1.77 03-Jul-2020 rillig

make(1): remove redundant parentheses around return values


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


# 1.76 28-Jun-2020 rillig

make(1): fix evaluation of unreachable conditions

Since 2015-10-11, make had evaluated unreachable conditions even though
the manual page said it didn't.


Revision tags: phil-wifi-20200421 phil-wifi-20200411 is-mlppp-base phil-wifi-20200406 netbsd-8-2-RELEASE netbsd-9-0-RELEASE netbsd-9-0-RC2 netbsd-9-0-RC1 phil-wifi-20191119 netbsd-9-base phil-wifi-20190609 netbsd-8-1-RELEASE netbsd-8-1-RC1 pgoyette-compat-merge-20190127 pgoyette-compat-20190127 pgoyette-compat-20190118 pgoyette-compat-1226 pgoyette-compat-1126 pgoyette-compat-1020 pgoyette-compat-0930 pgoyette-compat-0906 pgoyette-compat-0728 netbsd-8-0-RELEASE phil-wifi-base pgoyette-compat-0625 netbsd-8-0-RC2 pgoyette-compat-0521 pgoyette-compat-0502 pgoyette-compat-0422 netbsd-8-0-RC1 pgoyette-compat-0415 pgoyette-compat-0407 pgoyette-compat-0330 pgoyette-compat-0322 pgoyette-compat-0315 pgoyette-compat-base matt-nb8-mediatek-base perseant-stdc-iso10646-base netbsd-8-base prg-localcount2-base3 prg-localcount2-base2 prg-localcount2-base1 prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-2-RELEASE netbsd-7-1-2-RELEASE netbsd-7-1-1-RELEASE netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


Revision tags: prg-localcount2-base pgoyette-localcount-20170426 bouyer-socketcan-base1
# 1.75 16-Apr-2017 riastradh

Replace dead conditional by assert.

CID 975995


Revision tags: pgoyette-localcount-20170320 bouyer-socketcan-base pgoyette-localcount-20170107 pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

branches: 1.74.2; 1.74.4;
Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-1-RELEASE netbsd-7-1-RC2 netbsd-7-nhusb-base-20170116 netbsd-7-1-RC1 netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision


Revision tags: pgoyette-localcount-20161104 localcount-20160914 pgoyette-localcount-20160806 pgoyette-localcount-20160726 pgoyette-localcount-base
# 1.74 18-Feb-2016 christos

Collapse the 3 boolean parameter to 1 flags parameter. No functional change.


# 1.73 17-Jan-2016 christos

remove free NULL checks (Tilman Sauerbeck)


# 1.72 09-Jan-2016 christos

Preserve $$ in := assignments..

FOO=\$$CRAP
BAR:=${FOO}

all:
echo ${FOO}
echo ${BAR}


# 1.71 02-Dec-2015 sjg

Fix evaluation of defined(FOO) and ${FOO} > 0
add a unit-test to catch it.


# 1.70 30-Nov-2015 sjg

Avoid accessing beyond end of empty string.

Detected by Address Sanitizer - dim at FreeBSD.org


# 1.69 11-Oct-2015 sjg

Add Boolean wantit to Var_Parse and Var_Subst

wantit will be FALSE when we are just consuming to discard
in which case we skip "expensive" things like Cmd_Exec.

Reviewed by: christos


# 1.68 05-May-2015 sjg

When evaluating condtionals from .if we want to require
that the lhs is a variable reference, a number or a quoted string.
This helps avoid subtle bugs caused by typos.

When conditionals are being evaluated during variable expansion
we cannot be as strict becuase lhs will already have been expanded.

We therefor pass a boolean to Cond_EvalExpression to tell it how
lhs should be treated.

Add unit-tests/cond2.mk to test the above

Reviewed by: christos, joerg


Revision tags: netbsd-7-0-2-RELEASE netbsd-7-nhusb-base netbsd-7-0-1-RELEASE netbsd-7-0-RELEASE netbsd-7-0-RC3 netbsd-7-0-RC2 netbsd-7-0-RC1 netbsd-7-base yamt-pagecache-base9 tls-earlyentropy-base riastradh-xf86-video-intel-2-7-1-pre-2-21-15 riastradh-drm2-base3 riastradh-drm2-base2 riastradh-drm2-base1 riastradh-drm2-base agc-symver-base dholland-make-base yamt-pagecache-base8 yamt-pagecache-base7 tls-maxphys-base
# 1.67 03-Nov-2012 christos

off-by-one


# 1.66 03-Nov-2012 pgoyette

Fix build break due to signed/unsigned comparison


# 1.65 03-Nov-2012 sjg

Allow cond_state[] to grow.
The need is rare, but real.

Reviewed by: christos


Revision tags: yamt-pagecache-base6
# 1.64 12-Jun-2012 joerg

branches: 1.64.2;
Replace __dead, __unused and the various printf format attributes
with versions prefixed by MAKE_ATTR_* to avoid modifying the
implementation namespace. Make sure they are available in all places
using nonints.h to fix bootstrap on Linux.


Revision tags: yamt-pagecache-base5
# 1.63 21-May-2012 sjg

In meta mode, level 0 can legitimately see > 64 nested .if's


Revision tags: netbsd-6-0-6-RELEASE netbsd-6-1-5-RELEASE netbsd-6-1-4-RELEASE netbsd-6-0-5-RELEASE netbsd-6-1-3-RELEASE netbsd-6-0-4-RELEASE netbsd-6-1-2-RELEASE netbsd-6-0-3-RELEASE netbsd-6-1-1-RELEASE netbsd-6-0-2-RELEASE netbsd-6-1-RELEASE netbsd-6-1-RC4 netbsd-6-1-RC3 netbsd-6-1-RC2 netbsd-6-1-RC1 netbsd-6-0-1-RELEASE matt-nb6-plus-nbase netbsd-6-0-RELEASE netbsd-6-0-RC2 matt-nb6-plus-base netbsd-6-0-RC1 yamt-pagecache-base4 netbsd-6-base yamt-pagecache-base3 yamt-pagecache-base2 yamt-pagecache-base cherry-xenmp-base
# 1.62 29-Mar-2011 sjg

branches: 1.62.4;
CondDoExists: Avoid use after free()


Revision tags: bouyer-quota2-nbase bouyer-quota2-base
# 1.61 13-Feb-2011 sjg

Mark unused args.


Revision tags: matt-mips64-premerge-20101231 matt-premerge-20091211
# 1.60 06-Nov-2009 dsl

branches: 1.60.2;
Change enum values so that TOK_FALSE is 0 and TOK_TRUE is 1.
Use this fact to remove loads of ? : clauses.


Revision tags: jym-xensuspend-nbase jym-xensuspend-base
# 1.59 30-Jan-2009 dsl

Rename all the members of 'enum Token' to TOK_FOO.
Makes it rather more obvious wherethey belong - especially since
two of them were 'True' and 'False' (and not 1 and 0 either).


# 1.58 30-Jan-2009 dsl

Treat .ifdef ${foo} as .if defined(${foo}) not .if "${foo}" != "".
(and similarly for the other .ifxxx).
Do comparison against "" or 0 for .if "foo" and .if <numeric> directly
instead of faking up the operator string.
Rename error: to done: and use it for more exit paths.
Elucidate and correct some comments.

Fixes problems with makefiles that do:
.for var in var_1 var_2
.ifdef ${var}
...
which used to check whether var_1 was defined - because the .ifdef saw the
literal var_1, not a variable expansion due to the way .for loop variables
were substituted.


# 1.57 29-Jan-2009 enami

Avoid infinite loop.


# 1.56 28-Jan-2009 dsl

Allow for () in the argument to .ifdef et al.
Save/restore current values of global data across expression evaluation
to give ${foo:? ...} a change of working inside another .if.


# 1.55 23-Jan-2009 dsl

Sprinkle some const.
In particular for Lst_Find() and Lst_FindFrom().
Remove some unneeded casts and some now-undeeded UNCONST().


# 1.54 23-Jan-2009 dsl

Change 'ClientData' to 'void *' so that relevant parameters can
be made 'const void *'.


# 1.53 23-Jan-2009 dsl

There is no point in saving the last character of a NUL-terminated
string in order to overwrite with a NUL, then restore the original value!
Remove and simplify the CondDoFoo() functions.


# 1.52 18-Jan-2009 dsl

Revert previous - cause grief with .ifdef (foo)
Instead return False for exists(), defined(), make() etc when the
argument has length zero.


# 1.51 18-Jan-2009 dsl

Only terminate a conditional function argument on ')' if we expect the
argument to be exclosed in (...).
'.if exists()' is parsed as '.ifdef exists()' and the ')' must not be
left over at the end.
I have no idea why any of my recent changes have affected this.
But pkgsrc/mk/compiler/gcc.mk (line 488) does .if exists(${FCPATH})
even though FCPATH is only set when the file exists.


# 1.50 17-Jan-2009 dsl

Change 'Buffer' so that it is the actual struct, not a pointer to it.
Saves having to malloc/free a fixed size structure.
Buf_Init() now takes ptr to Buffer to initialiase.
Change Buf_Destroy() to return ptr to string when not freed.
Remove large number of casts to (Byte) and (Byte *) - 'Byte' is 'char' here.
Buf_AddByte[s] guarantees that the data is 0 termininated, so never add '\0'.
Keep 'count' not 'left' and 'inPtr', code is simplier with only one update.
Fix fallou, no functional change.


# 1.49 13-Dec-2008 dsl

Use NULL instead of -1 cast to the relavant type (usually via NIL).
This was a suggestion from christos - so blame him if there is a deep
reason for using -1 :-)


# 1.48 29-Nov-2008 dsl

Before deciding to use the default function in a .if, check whether the
token that follows the argument might be '==' or '!='.
If so then treat as a string comparison instead.
Fixes bin/15233 and bin/30967 provided some whitespace is present.
".if A==A" remains a check for defined(A==A) since make places no
restrictions on the names of variables!


# 1.47 29-Nov-2008 dsl

Common up parsing .if defined() make() exists() target() commands() and empty()
Add a check for the '(' following the function name, if absent then treat
as if the function name is unknown - usually leading to a syntax error.
No other functional changes intended.


# 1.46 23-Nov-2008 dsl

Do a string compare if the rh argument doesn't completely convert to a number
(instead of silently ignoring the chars that failed to convert).
Use strtoul() instead of homebrew copy.
Only use strtod() if strtoul() fails because the value is too large or
contains '.', 'e' or 'E'.
Do a compare for strings that start '-' or '+' as well as digits.


# 1.45 22-Nov-2008 dsl

Fix conversion of hex numerics in comparisons.
Broken by a fix from christos 14 years ago.


# 1.44 22-Nov-2008 dsl

Move two great chunks of code out of a switch statement and into
separate functions.
No functional change.


# 1.43 22-Nov-2008 dsl

If there is a syntax error in a .if expression then ignore the entire
conditional block (ie down to the matching .endif) instead of passing
the input line back to the normal parsing code.
Do the same if the maximum .if nesting (64 levels) is breached.


Revision tags: netbsd-5-2-3-RELEASE netbsd-5-1-5-RELEASE netbsd-5-2-2-RELEASE netbsd-5-1-4-RELEASE netbsd-5-2-1-RELEASE netbsd-5-1-3-RELEASE netbsd-5-2-RELEASE netbsd-5-2-RC1 netbsd-5-1-2-RELEASE netbsd-5-1-1-RELEASE matt-nb5-mips64-premerge-20101231 matt-nb5-pq3-base netbsd-5-1-RELEASE netbsd-5-1-RC4 matt-nb5-mips64-k15 netbsd-5-1-RC3 netbsd-5-1-RC2 netbsd-5-1-RC1 netbsd-5-0-2-RELEASE matt-nb5-mips64-premerge-20091211 matt-nb5-mips64-u2-k2-k4-k7-k8-k9 matt-nb4-mips64-k7-u2a-k9b matt-nb5-mips64-u1-k1-k5 netbsd-5-0-1-RELEASE netbsd-5-0-RELEASE netbsd-5-0-RC4 netbsd-5-0-RC3 netbsd-5-0-RC2 netbsd-5-0-RC1 netbsd-5-base
# 1.42 29-Oct-2008 sjg

If Parse_Error is called after curFile is invalid, set it to a dummy
to avoid seg-fault. Also the NULL filename will cause ParseVErrorInternal
to skip trying to report file and line number info.

If CondToken is called outside the context of a .if etc, variables in
the expression being parsed will already be expanded, so allow for
an unqouted number to jump us back into the compare logic.
This allows ${${SomeNumber:U42} > 0:?True:False} to work anywhere.

Job_Finish should process postCommands if it has commands or children.


Revision tags: matt-mips64-base2 mjf-devfs2-base wrstuden-revivesa-base-3 wrstuden-revivesa-base-2 wrstuden-revivesa-base-1 yamt-pf42-base4 yamt-pf42-base3 hpcarm-cleanup-nbase yamt-pf42-baseX yamt-pf42-base2 wrstuden-revivesa-base yamt-pf42-base keiichi-mipv6-nbase keiichi-mipv6-base matt-armv6-nbase hpcarm-cleanup-base
# 1.41 15-Feb-2008 christos

back all changes out until I fix it properly.


Revision tags: christos-broken
# 1.40 14-Feb-2008 christos

- use pid_t/size_t as appropriate instead of int.
- use %ld to print pids.
- fix a bit of lint.
- WARNS=4


# 1.39 07-Feb-2008 joerg

Print the complain about random stuff after empty only once.


# 1.38 06-Feb-2008 joerg

Warn for constructs like
.if empty xxx(foo)
which are interpreted as
.if empty(foo)
or
.if empty (foo)

This is based on rillig's commit to pkgsrc/devel/bmake, but doesn't warn
for the third case. Discussed with sjg.


Revision tags: matt-armv6-prevmlocking cube-autoconf-base matt-armv6-base matt-mips64-base
# 1.37 04-Feb-2007 dsl

branches: 1.37.4;
Add code to ensure that .if/.endif are correctly nested with .for/.endfor
and also include files don't have mismatched .if/.endif
It has been suggested that make used to have this test, but I can't
remember removing any code that might have performed it.


# 1.36 02-Dec-2006 dsl

Simplify the code that processes .if lines.
It doesn't need a two-dimensional array to remember the states of .if lines.
It would be even simpler if we didn't try to detect .else and .elif lines
that follow .else lines.
Unfortunately this isn't the code that is stupendously slow...


Revision tags: netbsd-4-base
# 1.35 27-Oct-2006 dsl

branches: 1.35.2;
Since 'ClientData' is 'void *', nuke almost all the (ClientData) casts.


# 1.34 15-Oct-2006 dsl

Output all debug trace output through 'debug_file' defaulting to 'stdout'.
(Almost all the debug output went there, but some went to stderr.)
Split the parsing of -d (debug flags) out into its own routine.
Allow the output filename to be changed by specifying -dF<file> to create
a log file, or -dF+<file> to append to it. <file> may be stdout or stderr.
Also change so that -d-<flags> acts on <flags> locally but doesn't copy
them to MAKEFLAGS so they aren't inherited by child makes.
I'm not 100% happy with the command line syntax for the above, so they are
currently undocumented.


Revision tags: abandoned-netbsd-4-base
# 1.33 28-Jul-2006 sjg

Add debug output for CondDoExists() - the results can be surprising.


Revision tags: chap-midi-nbase chap-midi-base
# 1.32 22-Apr-2006 christos

Coverity CID 526: Check for condTop < 0 where we decrement it, not later
when the damage is already done.


# 1.31 02-Apr-2006 christos

Remove bogus debugging code I accidentally committed.


# 1.30 31-Mar-2006 christos

Add some coverity allocation comments, and change the way the allocator
functions work. When they allocate storage that needs to be freed, instead
of setting a boolean, set the pointer to be freed. Plug some more memory
leaks found by inspection.


# 1.29 08-Aug-2005 christos

From Max Okumoto:
- Remove casts to NULL.
- Remove space between cast and object.


# 1.28 25-Jul-2005 christos

Whitespace KNF cleanup from Max Okumoto


# 1.27 02-Jun-2005 lukem

appease gcc -Wuninitialized


Revision tags: netbsd-3-1-1-RELEASE netbsd-3-0-3-RELEASE netbsd-3-1-RELEASE netbsd-3-0-2-RELEASE netbsd-3-1-RC4 netbsd-3-1-RC3 netbsd-3-1-RC2 netbsd-3-1-RC1 netbsd-3-0-1-RELEASE netbsd-3-0-RELEASE netbsd-3-0-RC6 netbsd-3-0-RC5 netbsd-3-0-RC4 netbsd-3-0-RC3 netbsd-3-0-RC2 netbsd-3-0-RC1 netbsd-3-base
# 1.26 01-Mar-2005 christos

When parsing conditional tokens, make sure that the token is followed by
a non-alpha character, so that .elsefoo is not parsed as .else leading
to confusion later.


# 1.25 16-Feb-2005 christos

PR/29203, PR/29204: Max Okumoto: KNF changes to make [no functional changes]


# 1.24 07-May-2004 ross

Simplify build, no functional changes.

Instead of adding MAKE_BOOTSTRAP for hosted environments, i.e., when
you want things simple, instead add MAKE_NATIVE to get those hugely
important features like __RCSID().

It's now possible to build make on some hosts with: cc *.c */*.c


# 1.23 13-Apr-2004 sjg

Allow "string" and "${varspec}" on lhs of conditionals.
This makes it possible to use expressions like
${("${LIST:Msomething"}):?present:absent}
it also makes treatment of lhs and rhs more consistent, and
makes CondToken easier to read.

Update unit-test/cond1 to test new features.


# 1.22 08-Apr-2004 sjg

Revised patch for catching extraneous .else's
We actually need to tack condTop and skipIfLevel.
Bump MAXIF while here.
Enhance the unit-test for conditionals to exercise more code.

PR: 24420


# 1.21 08-Apr-2004 sjg

Back out previous patch for now.
Breaks bsd.obj.mk


# 1.20 08-Apr-2004 sjg

Add check for extraneous .else's - based on patch from Arne H. Juul
in PR/24420.
Add a unit-test for conditionals.
Also in the unit-test makefile strip any .CURDIR in output.

PR: 24420


Revision tags: netbsd-2-0-base
# 1.19 06-Jan-2004 sjg

branches: 1.19.2;
Handle more complex conditional expressions.
CondCvtArg now returns NULL if it consumed all input, or a pointer
to any left overs.


# 1.18 06-Sep-2003 sjg

Make empty() consider an undefined variable as empty,
rather than throw a syntax error.


# 1.17 07-Aug-2003 agc

Move UCB-licensed code from 4-clause to 3-clause licence.

Patches provided by Joel Baker in PR 22365, verified by myself.


# 1.16 14-Jul-2003 christos

Pass WARNS=3


# 1.15 17-Apr-2003 sjg

math.h is not needed and including it introduces uncessary dependencies
on some systems.

PR: 21204


Revision tags: fvdl_fs64_base
# 1.14 30-Dec-2002 sjg

Treat an unquoted '#' as end of line when parsing conditionals.
This ensures that comments are ok at the end of line.

PR: 19596
Reviewed by: christos


# 1.13 15-Jun-2002 wiz

Remove !__STDC__ stuff, de-__P(), ANSIfy, and de-register.


Revision tags: netbsd-1-6-PATCH002-RELEASE netbsd-1-6-PATCH002 netbsd-1-6-PATCH002-RC4 netbsd-1-6-PATCH002-RC3 netbsd-1-6-PATCH002-RC2 netbsd-1-6-PATCH002-RC1 netbsd-1-6-PATCH001 netbsd-1-6-PATCH001-RELEASE netbsd-1-6-PATCH001-RC3 netbsd-1-6-PATCH001-RC2 netbsd-1-6-PATCH001-RC1 netbsd-1-6-RELEASE netbsd-1-6-RC3 netbsd-1-6-RC2 netbsd-1-6-RC1 netbsd-1-6-base
# 1.12 14-Jan-2001 christos

Provide a new .if commands(<target>) primitive that returns true if the
target has commands associated with it.


Revision tags: netbsd-1-5-PATCH003 netbsd-1-5-PATCH002 netbsd-1-5-PATCH001 netbsd-1-5-RELEASE netbsd-1-5-BETA2 netbsd-1-5-BETA netbsd-1-4-PATCH003 netbsd-1-5-ALPHA2 netbsd-1-5-base minoura-xpg4dl-base netbsd-1-4-PATCH002 wrstuden-devbsize-19991221 wrstuden-devbsize-base comdex-fall-1999-base netbsd-1-4-PATCH001 netbsd-1-4-RELEASE netbsd-1-4-base
# 1.11 18-Sep-1998 christos

Fix conditional variable expression parsing (reported by cgd)


# 1.10 01-Apr-1998 christos

Add conditional variable evaluation from Alistair Crooks.


Revision tags: netbsd-1-3-PATCH001 netbsd-1-3-RELEASE netbsd-1-3-BETA netbsd-1-3-base
# 1.9 28-Sep-1997 lukem

branches: 1.9.2;
wrap #include <sys/cdefs.h>, __RCSID(...) stuff in #ifndef MAKE_BOOTSTRAP


# 1.8 01-Jul-1997 christos

Add WARNS=1
RCSID police


# 1.7 06-Nov-1996 christos

- Merge in FreeBSD and Lite2 changes.
- Fix bug where a non-archive target with a .a suffix would always
be considered to be out of date, since it does not have a TOC.


Revision tags: netbsd-1-2-RELEASE netbsd-1-2-BETA netbsd-1-2-base netbsd-1-1-PATCH001 netbsd-1-1-RELEASE netbsd-1-1-base
# 1.6 14-Jun-1995 christos

branches: 1.6.6;
- $NetBSD$ rcsids
- Fixed so that .[A-Z]* targets that do not match keywords are ignored as
Posix mandates
- Added .PHONY target keyword


Revision tags: netbsd-1-0-PATCH06 netbsd-1-0-PATCH05 netbsd-1-0-PATCH04 netbsd-1-0-PATCH03 netbsd-1-0-PATCH02 netbsd-1-0-PATCH1 netbsd-1-0-PATCH0 netbsd-1-0-RELEASE netbsd-1-0-base
# 1.5 06-Jun-1994 jtc

Fixes from Christos Zoulas, who used purify, objectcenter and testcenter
to find memory leaks and illegal memory accesses.


# 1.4 05-Mar-1994 cgd

fixes/improvements from Christos Zoulas <christos@deshaw.com>.


# 1.3 13-Jan-1994 jtc

Include appropriate header files to bring prototypes into scope.


# 1.2 01-Aug-1993 mycroft

Add RCS identifiers.


# 1.1 21-Mar-1993 cgd

branches: 1.1.1;
Initial revision