Module Name: src Committed By: rillig Date: Fri Jan 7 20:15:10 UTC 2022
Modified Files: src/usr.bin/make: for.c Log Message: 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. To generate a diff of this commit: cvs rdiff -u -r1.156 -r1.157 src/usr.bin/make/for.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/for.c diff -u src/usr.bin/make/for.c:1.156 src/usr.bin/make/for.c:1.157 --- src/usr.bin/make/for.c:1.156 Fri Jan 7 20:09:58 2022 +++ src/usr.bin/make/for.c Fri Jan 7 20:15:10 2022 @@ -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 cha 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 *forLeve 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 */ 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, '}'); }