summaryrefslogtreecommitdiff
path: root/usr.bin/make
diff options
context:
space:
mode:
authorrillig <rillig@NetBSD.org>2022-01-07 20:15:10 +0000
committerrillig <rillig@NetBSD.org>2022-01-07 20:15:10 +0000
commit86c5e608d905fd565ab1e39d2bab4ec77fb2604e (patch)
tree38b2042384015c4732ab8981baa2ad7ed1bc252b /usr.bin/make
parent1abe91e1fc267482580b81792900d80e49008961 (diff)
make: clean up handling of .for loops
Sort ForLoop members in natural reading order. Remove redundant condition in ForLoop_ParseItems; at that point, the number of variables is non-zero. Rename Buf_AddEscaped since that function is not part of the Buffer API, it is specific to .for loops. No functional change.
Diffstat (limited to 'usr.bin/make')
-rw-r--r--usr.bin/make/for.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/usr.bin/make/for.c b/usr.bin/make/for.c
index 7df72efc793..8919508262b 100644
--- a/usr.bin/make/for.c
+++ b/usr.bin/make/for.c
@@ -1,4 +1,4 @@
-/* $NetBSD: for.c,v 1.156 2022/01/07 20:09:58 rillig Exp $ */
+/* $NetBSD: for.c,v 1.157 2022/01/07 20:15:10 rillig Exp $ */
/*
* Copyright (c) 1992, The Regents of the University of California.
@@ -58,13 +58,13 @@
#include "make.h"
/* "@(#)for.c 8.1 (Berkeley) 6/6/93" */
-MAKE_RCSID("$NetBSD: for.c,v 1.156 2022/01/07 20:09:58 rillig Exp $");
+MAKE_RCSID("$NetBSD: for.c,v 1.157 2022/01/07 20:15:10 rillig Exp $");
typedef struct ForLoop {
- Buffer body; /* Unexpanded body of the loop */
Vector /* of 'char *' */ vars; /* Iteration variables */
SubstringWords items; /* Substitution items */
+ Buffer body; /* Unexpanded body of the loop */
unsigned int nextItem; /* Where to continue iterating */
} ForLoop;
@@ -77,9 +77,9 @@ ForLoop_New(void)
{
ForLoop *f = bmake_malloc(sizeof *f);
- Buf_Init(&f->body);
Vector_Init(&f->vars, sizeof(char *));
SubstringWords_Init(&f->items);
+ Buf_Init(&f->body);
f->nextItem = 0;
return f;
@@ -88,13 +88,12 @@ ForLoop_New(void)
static void
ForLoop_Free(ForLoop *f)
{
- Buf_Done(&f->body);
-
while (f->vars.len > 0)
free(*(char **)Vector_Pop(&f->vars));
Vector_Done(&f->vars);
SubstringWords_Free(f->items);
+ Buf_Done(&f->body);
free(f);
}
@@ -156,7 +155,7 @@ ForLoop_ParseItems(ForLoop *f, const char *p)
if (f->items.len == 1 && Substring_IsEmpty(f->items.words[0]))
f->items.len = 0; /* .for var in ${:U} */
- if (f->items.len != 0 && f->items.len % f->vars.len != 0) {
+ if (f->items.len % f->vars.len != 0) {
Parse_Error(PARSE_FATAL,
"Wrong number of words (%u) in .for "
"substitution list with %u variables",
@@ -184,13 +183,10 @@ IsEndfor(const char *p)
* Evaluate the for loop in the passed line. The line looks like this:
* .for <varname...> in <value...>
*
- * Input:
- * line Line to parse
- *
* Results:
- * 0: Not a .for statement, parse the line
- * 1: We found a for loop
- * -1: A .for statement with a bad syntax error, discard.
+ * 0 not a .for directive
+ * 1 found a .for directive
+ * -1 erroneous .for directive
*/
int
For_Eval(const char *line)
@@ -241,7 +237,7 @@ For_Accum(const char *line, int *forLevel)
if (IsEndfor(p)) {
DEBUG1(FOR, "For: end for %d\n", *forLevel);
- if (--*forLevel <= 0)
+ if (--*forLevel == 0)
return false;
} else if (IsFor(p)) {
(*forLevel)++;
@@ -309,7 +305,7 @@ NeedsEscapes(Substring value, char endc)
* The result is later unescaped by ApplyModifier_Defined.
*/
static void
-Buf_AddEscaped(Buffer *cmds, Substring item, char endc)
+AddEscaped(Buffer *cmds, Substring item, char endc)
{
const char *p;
char ch;
@@ -377,7 +373,7 @@ ForLoop_SubstVarLong(ForLoop *f, Buffer *body, const char **pp,
*/
Buf_AddBytesBetween(body, *inout_mark, start);
Buf_AddStr(body, ":U");
- Buf_AddEscaped(body, f->items.words[f->nextItem + i], endc);
+ AddEscaped(body, f->items.words[f->nextItem + i], endc);
*inout_mark = p;
*pp = p;
@@ -415,7 +411,7 @@ found:
/* Replace $<ch> with ${:U<value>} */
Buf_AddStr(body, "{:U");
- Buf_AddEscaped(body, f->items.words[f->nextItem + i], '}');
+ AddEscaped(body, f->items.words[f->nextItem + i], '}');
Buf_AddByte(body, '}');
}