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(1): prepare error handling in nested varia...



details:   https://anonhg.NetBSD.org/src/rev/6cf1c4f3e384
branches:  trunk
changeset: 944185:6cf1c4f3e384
user:      rillig <rillig%NetBSD.org@localhost>
date:      Tue Sep 22 18:07:58 2020 +0000

description:
make(1): prepare error handling in nested variable expressions

Having ParseModifierPart return VarParseResult allows to report the
errors from nested variable expressions.

diffstat:

 usr.bin/make/var.c |  95 +++++++++++++++++++++++++++++------------------------
 1 files changed, 52 insertions(+), 43 deletions(-)

diffs (268 lines):

diff -r 0bde86bd7df0 -r 6cf1c4f3e384 usr.bin/make/var.c
--- a/usr.bin/make/var.c        Tue Sep 22 17:51:06 2020 +0000
+++ b/usr.bin/make/var.c        Tue Sep 22 18:07:58 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: var.c,v 1.530 2020/09/22 17:51:06 rillig Exp $ */
+/*     $NetBSD: var.c,v 1.531 2020/09/22 18:07:58 rillig Exp $ */
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -121,7 +121,7 @@
 #include    "metachar.h"
 
 /*     "@(#)var.c      8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.530 2020/09/22 17:51:06 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.531 2020/09/22 18:07:58 rillig Exp $");
 
 #define VAR_DEBUG_IF(cond, fmt, ...)   \
     if (!(DEBUG(VAR) && (cond)))       \
@@ -1809,7 +1809,7 @@
  * after the delimiter.  The delimiter is not included in the returned
  * value though.
  */
-static char *
+static VarParseResult
 ParseModifierPart(
     const char **pp,           /* The parsing position, updated upon return */
     int delim,                 /* Parsing stops at this delimiter */
@@ -1817,6 +1817,7 @@
                                 * if VARE_WANTRES is not set, the text is
                                 * only parsed */
     ApplyModifiersState *st,
+    char **out_part,
     size_t *out_length,                /* Optionally stores the length of the returned
                                 * string, just to save another strlen call. */
     VarPatternFlags *out_pflags,/* For the first part of the :S modifier,
@@ -1828,7 +1829,6 @@
 ) {
     Buffer buf;
     const char *p;
-    char *rstr;
 
     Buf_Init(&buf, 0);
 
@@ -1922,16 +1922,17 @@
     if (*p != delim) {
        *pp = p;
        Error("Unfinished modifier for %s ('%c' missing)", st->v->name, delim);
-       return NULL;
+       *out_part = NULL;
+       return VPR_PARSE_MSG;
     }
 
     *pp = ++p;
     if (out_length != NULL)
        *out_length = Buf_Size(&buf);
 
-    rstr = Buf_Destroy(&buf, FALSE);
-    VAR_DEBUG("Modifier part: \"%s\"\n", rstr);
-    return rstr;
+    *out_part = Buf_Destroy(&buf, FALSE);
+    VAR_DEBUG("Modifier part: \"%s\"\n", *out_part);
+    return VPR_OK;
 }
 
 /* Test whether mod starts with modname, followed by a delimiter. */
@@ -1960,14 +1961,15 @@
     char delim;
     char prev_sep;
     VarEvalFlags eflags = st->eflags & ~(unsigned)VARE_WANTRES;
+    VarParseResult res;
 
     args.ctx = st->ctxt;
 
     (*pp)++;                   /* Skip the first '@' */
     delim = '@';
-    args.tvar = ParseModifierPart(pp, delim, eflags, st,
-                                 NULL, NULL, NULL);
-    if (args.tvar == NULL)
+    res = ParseModifierPart(pp, delim, eflags, st,
+                           &args.tvar, NULL, NULL, NULL);
+    if (res != VPR_OK)
        return AMR_CLEANUP;
     if (DEBUG(LINT) && strchr(args.tvar, '$') != NULL) {
        Parse_Error(PARSE_FATAL,
@@ -1977,9 +1979,9 @@
        return AMR_CLEANUP;
     }
 
-    args.str = ParseModifierPart(pp, delim, eflags, st,
-                                NULL, NULL, NULL);
-    if (args.str == NULL)
+    res = ParseModifierPart(pp, delim, eflags, st,
+                           &args.str, NULL, NULL, NULL);
+    if (res != VPR_OK)
        return AMR_CLEANUP;
 
     args.eflags = st->eflags & (VARE_UNDEFERR | VARE_WANTRES);
@@ -2140,12 +2142,13 @@
     char delim;
     char *cmd;
     const char *errfmt;
+    VarParseResult res;
 
     (*pp)++;
     delim = '!';
-    cmd = ParseModifierPart(pp, delim, st->eflags, st,
-                           NULL, NULL, NULL);
-    if (cmd == NULL)
+    res = ParseModifierPart(pp, delim, st->eflags, st,
+                           &cmd, NULL, NULL, NULL);
+    if (res != VPR_OK)
        return AMR_CLEANUP;
 
     errfmt = NULL;
@@ -2285,6 +2288,7 @@
     ModifyWord_SubstArgs args;
     char *lhs, *rhs;
     Boolean oneBigWord;
+    VarParseResult res;
 
     char delim = (*pp)[1];
     if (delim == '\0') {
@@ -2307,15 +2311,15 @@
        (*pp)++;
     }
 
-    lhs = ParseModifierPart(pp, delim, st->eflags, st,
-                           &args.lhsLen, &args.pflags, NULL);
-    if (lhs == NULL)
+    res = ParseModifierPart(pp, delim, st->eflags, st,
+                           &lhs, &args.lhsLen, &args.pflags, NULL);
+    if (res != VPR_OK)
        return AMR_CLEANUP;
     args.lhs = lhs;
 
-    rhs = ParseModifierPart(pp, delim, st->eflags, st,
-                           &args.rhsLen, NULL, &args);
-    if (rhs == NULL)
+    res = ParseModifierPart(pp, delim, st->eflags, st,
+                           &rhs, &args.rhsLen, NULL, &args);
+    if (res != VPR_OK)
        return AMR_CLEANUP;
     args.rhs = rhs;
 
@@ -2353,6 +2357,7 @@
     ModifyWord_SubstRegexArgs args;
     Boolean oneBigWord;
     int error;
+    VarParseResult res;
 
     char delim = (*pp)[1];
     if (delim == '\0') {
@@ -2363,13 +2368,13 @@
 
     *pp += 2;
 
-    re = ParseModifierPart(pp, delim, st->eflags, st,
-                          NULL, NULL, NULL);
-    if (re == NULL)
+    res = ParseModifierPart(pp, delim, st->eflags, st,
+                          &re, NULL, NULL, NULL);
+    if (res != VPR_OK)
        return AMR_CLEANUP;
 
-    args.replace = ParseModifierPart(pp, delim, st->eflags, st,
-                                    NULL, NULL, NULL);
+    res = ParseModifierPart(pp, delim, st->eflags, st,
+                           &args.replace, NULL, NULL, NULL);
     if (args.replace == NULL) {
        free(re);
        return AMR_CLEANUP;
@@ -2546,12 +2551,13 @@
     char *estr;
     char *ep;
     int first, last;
+    VarParseResult res;
 
     (*pp)++;                   /* skip the '[' */
     delim = ']';               /* look for closing ']' */
-    estr = ParseModifierPart(pp, delim, st->eflags, st,
-                            NULL, NULL, NULL);
-    if (estr == NULL)
+    res = ParseModifierPart(pp, delim, st->eflags, st,
+                           &estr, NULL, NULL, NULL);
+    if (res != VPR_OK)
        return AMR_CLEANUP;
 
     /* now *pp points just after the closing ']' */
@@ -2701,6 +2707,7 @@
 {
     char delim;
     char *then_expr, *else_expr;
+    VarParseResult res;
 
     Boolean value = FALSE;
     VarEvalFlags then_eflags = st->eflags & ~(unsigned)VARE_WANTRES;
@@ -2717,15 +2724,15 @@
 
     (*pp)++;                   /* skip past the '?' */
     delim = ':';
-    then_expr = ParseModifierPart(pp, delim, then_eflags, st,
-                                 NULL, NULL, NULL);
-    if (then_expr == NULL)
+    res = ParseModifierPart(pp, delim, then_eflags, st,
+                           &then_expr, NULL, NULL, NULL);
+    if (res != VPR_OK)
        return AMR_CLEANUP;
 
     delim = st->endc;          /* BRCLOSE or PRCLOSE */
-    else_expr = ParseModifierPart(pp, delim, else_eflags, st,
-                                 NULL, NULL, NULL);
-    if (else_expr == NULL)
+    res = ParseModifierPart(pp, delim, else_eflags, st,
+                           &else_expr, NULL, NULL, NULL);
+    if (res != VPR_OK)
        return AMR_CLEANUP;
 
     (*pp)--;
@@ -2774,6 +2781,7 @@
     char *sv_name;
     char delim;
     char *val;
+    VarParseResult res;
 
     const char *mod = *pp;
     const char *op = mod + 1;
@@ -2816,13 +2824,13 @@
     }
 
     delim = st->startc == '(' ? ')' : '}';
-    val = ParseModifierPart(pp, delim, st->eflags, st, NULL, NULL, NULL);
+    res = ParseModifierPart(pp, delim, st->eflags, st, &val, NULL, NULL, NULL);
     if (st->exprFlags & VEF_UNDEF) {
        /* restore original name */
        free(st->v->name);
        st->v->name = sv_name;
     }
-    if (val == NULL)
+    if (res != VPR_OK)
        return AMR_CLEANUP;
 
     (*pp)--;
@@ -2902,6 +2910,7 @@
 {
     char delim;
     char *lhs, *rhs;
+    VarParseResult res;
 
     const char *mod = *pp;
     Boolean eqFound = FALSE;
@@ -2929,13 +2938,13 @@
 
     delim = '=';
     *pp = mod;
-    lhs = ParseModifierPart(pp, delim, st->eflags, st, NULL, NULL, NULL);
-    if (lhs == NULL)
+    res = ParseModifierPart(pp, delim, st->eflags, st, &lhs, NULL, NULL, NULL);
+    if (res != VPR_OK)
        return AMR_CLEANUP;
 
     delim = st->endc;
-    rhs = ParseModifierPart(pp, delim, st->eflags, st, NULL, NULL, NULL);
-    if (rhs == NULL)
+    res = ParseModifierPart(pp, delim, st->eflags, st, &rhs, NULL, NULL, NULL);
+    if (res != VPR_OK)
        return AMR_CLEANUP;
 
     /*



Home | Main Index | Thread Index | Old Index