Fix based on patch provided by Kobayashi Takashi. This brings nl(1) further
in to POSIX compliance. Verified behavior with classic SysV nl(1) and GNU
nl(1). There could still be edge cases here not specified by POSIX.
This variable was intended to help the compilers produce efficient code
by avoiding a duplicate memory read. As it turned out, GCC 5.5 doesn't
need this help, and probably newer compilers don't need it either. Well
done, GCC, keeping track of the memory locations even if the pointer to
it changes in the middle.
After the previous clean up in for.c 1.123 from 2020-12-30, GCC 5.5 did
not inline the function SubstVarLong anymore since it was now called
from 2 places. GCC didn't notice that the function call was essentially
the same since in differed only in the end character.
By combining the cases for ${V} and $(V), the code becomes even shorter
than before, while still being understandable.
At this point, the number of iteration items is always a multiple of the
number of iteration variables, which makes any addition more complicated
than absolutely necessary.
The comma expression in ForReadMore may be a nice trick, but it's not as
easy to read as a simple if-then-else chain. Test for '{' before '('
since BSD makefiles use braces by convention.
This removes the redundancy of mentioning the function name in the error
message. This redundancy had been correct in all but 2 cases:
build_real_imag and tsize.
Having 2 lines of source code per assertion is too much, especially
since most of this code is redundant anyway. Extract the common code
and the additional negation into a simple function instead.
Even with -DDEBUG and -DYYDEBUG, the debug output is not detailed enough
to clearly see what happens.
Add some custom debug logging to the parser, mainly for demonstration
purposes, and also to find out how to fix the test d_struct_init_nested.