Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/make make: separate parsing from evaluating for seve...



details:   https://anonhg.NetBSD.org/src/rev/31879a4d629e
branches:  trunk
changeset: 953623:31879a4d629e
user:      rillig <rillig%NetBSD.org@localhost>
date:      Sun Mar 14 15:43:31 2021 +0000

description:
make: separate parsing from evaluating for several modifiers

This aligns the implementation of these modifiers with the requirements
in the long comment starting with 'The ApplyModifier functions'.

No functional change.

diffstat:

 usr.bin/make/var.c |  59 ++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 40 insertions(+), 19 deletions(-)

diffs (234 lines):

diff -r 10f991a1fa77 -r 31879a4d629e usr.bin/make/var.c
--- a/usr.bin/make/var.c        Sun Mar 14 15:24:37 2021 +0000
+++ b/usr.bin/make/var.c        Sun Mar 14 15:43:31 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: var.c,v 1.863 2021/03/14 15:24:37 rillig Exp $ */
+/*     $NetBSD: var.c,v 1.864 2021/03/14 15:43:31 rillig Exp $ */
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -140,7 +140,7 @@
 #include "metachar.h"
 
 /*     "@(#)var.c      8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.863 2021/03/14 15:24:37 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.864 2021/03/14 15:43:31 rillig Exp $");
 
 typedef enum VarFlags {
        VFL_NONE        = 0,
@@ -2506,9 +2506,12 @@
 ApplyModifier_Literal(const char **pp, ApplyModifiersState *st)
 {
        Expr *expr = st->expr;
+
+       (*pp)++;
+
        Expr_Define(expr);
        Expr_SetValueOwn(expr, bmake_strdup(expr->var->name.str));
-       (*pp)++;
+
        return AMR_OK;
 }
 
@@ -2553,8 +2556,10 @@
                utc = 0;
                *pp = mod + 6;
        }
+
        Expr_SetValueOwn(st->expr,
            VarStrftime(st->expr->value.str, TRUE, utc));
+
        return AMR_OK;
 }
 
@@ -2580,8 +2585,10 @@
                utc = 0;
                *pp = mod + 9;
        }
+
        Expr_SetValueOwn(st->expr,
            VarStrftime(st->expr->value.str, FALSE, utc));
+
        return AMR_OK;
 }
 
@@ -2591,9 +2598,10 @@
 {
        if (!ModMatch(*pp, "hash", st))
                return AMR_UNKNOWN;
+       *pp += 4;
 
        Expr_SetValueOwn(st->expr, VarHash(st->expr->value.str));
-       *pp += 4;
+
        return AMR_OK;
 }
 
@@ -2605,6 +2613,8 @@
        GNode *gn;
        char *path;
 
+       (*pp)++;
+
        Expr_Define(expr);
 
        gn = Targ_FindNode(expr->var->name.str);
@@ -2620,7 +2630,6 @@
                path = bmake_strdup(expr->var->name.str);
        Expr_SetValueOwn(expr, path);
 
-       (*pp)++;
        return AMR_OK;
 }
 
@@ -2646,8 +2655,8 @@
        if (errfmt != NULL)
                Error(errfmt, cmd);     /* XXX: why still return AMR_OK? */
        free(cmd);
-
        Expr_Define(expr);
+
        return AMR_OK;
 }
 
@@ -2949,15 +2958,15 @@
 
        /* ":ts<any><endc>" or ":ts<any>:" */
        if (sep[0] != st->endc && IsDelimiter(sep[1], st)) {
+               *pp = sep + 1;
                st->sep = sep[0];
-               *pp = sep + 1;
                goto ok;
        }
 
        /* ":ts<endc>" or ":ts:" */
        if (IsDelimiter(sep[0], st)) {
+               *pp = sep;
                st->sep = '\0'; /* no separator */
-               *pp = sep;
                goto ok;
        }
 
@@ -2969,15 +2978,15 @@
 
        /* ":ts\n" */
        if (sep[1] == 'n') {
+               *pp = sep + 2;
                st->sep = '\n';
-               *pp = sep + 2;
                goto ok;
        }
 
        /* ":ts\t" */
        if (sep[1] == 't') {
+               *pp = sep + 2;
                st->sep = '\t';
-               *pp = sep + 2;
                goto ok;
        }
 
@@ -3062,31 +3071,31 @@
        }
 
        if (mod[1] == 'A') {                            /* :tA */
+               *pp = mod + 2;
                ModifyWords(st, ModifyWord_Realpath, NULL, st->oneBigWord);
-               *pp = mod + 2;
                return AMR_OK;
        }
 
        if (mod[1] == 'u') {                            /* :tu */
+               *pp = mod + 2;
                Expr_SetValueOwn(expr, str_toupper(expr->value.str));
-               *pp = mod + 2;
                return AMR_OK;
        }
 
        if (mod[1] == 'l') {                            /* :tl */
+               *pp = mod + 2;
                Expr_SetValueOwn(expr, str_tolower(expr->value.str));
-               *pp = mod + 2;
                return AMR_OK;
        }
 
        if (mod[1] == 'W' || mod[1] == 'w') {           /* :tW, :tw */
+               *pp = mod + 2;
                st->oneBigWord = mod[1] == 'W';
-               *pp = mod + 2;
                return AMR_OK;
        }
 
        /* Found ":t<unrecognised>:" or ":t<unrecognised><endc>". */
-       *pp = mod + 1;
+       *pp = mod + 1;          /* XXX: unnecessary but observable */
        return AMR_BAD;
 }
 
@@ -3216,6 +3225,8 @@
 {
        const char *mod = (*pp)++;      /* skip past the 'O' in any case */
 
+       /* TODO: separate parsing from evaluating */
+
        Words words = Str_Words(st->expr->value.str, FALSE);
 
        if (IsDelimiter(mod[1], st)) {
@@ -3321,6 +3332,8 @@
        char *val;
        VarParseResult res;
 
+       /* TODO: separate parsing from evaluating */
+
        const char *mod = *pp;
        const char *op = mod + 1;
 
@@ -3413,12 +3426,18 @@
                 */
                size_t n = strcspn(mod + 2, ":)}");
                char *name = bmake_strldup(mod + 2, n);
+               *pp = mod + 2 + n;
+
+               /*
+                * FIXME: do not expand the variable name here; it would only
+                *  work for single-character variable names anyway.
+                */
                Var_SetExpand(expr->scope, name, expr->value.str);
                free(name);
-               *pp = mod + 2 + n;
        } else {
+               *pp = mod + 1;
+
                Var_Set(expr->scope, "_", expr->value.str);
-               *pp = mod + 1;
        }
        return AMR_OK;
 }
@@ -3433,9 +3452,10 @@
 {
        if (!IsDelimiter((*pp)[1], st))
                return AMR_UNKNOWN;
+       (*pp)++;
 
        ModifyWords(st, modifyWord, NULL, st->oneBigWord);
-       (*pp)++;
+
        return AMR_OK;
 }
 
@@ -3517,6 +3537,7 @@
        const char *p = *pp;
        if (!(p[1] == 'h' && IsDelimiter(p[2], st)))
                return AMR_UNKNOWN;
+       *pp = p + 2;
 
        if (expr->eflags & VARE_WANTRES) {
                const char *errfmt;
@@ -3534,7 +3555,7 @@
                 */
                Expr_SetValueRefer(expr, "");
        }
-       *pp = p + 2;
+
        return AMR_OK;
 }
 #endif



Home | Main Index | Thread Index | Old Index