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): untangle SuffParseTransform



details:   https://anonhg.NetBSD.org/src/rev/2f4c9a721f41
branches:  trunk
changeset: 956080:2f4c9a721f41
user:      rillig <rillig%NetBSD.org@localhost>
date:      Tue Oct 20 20:51:15 2020 +0000

description:
make(1): untangle SuffParseTransform

That function was probably not meant to be a brain-twister, but the
convoluted loop combined with Lst_Find/Lst_FindFrom and the deeply
indented second pass for the single suffix made the code harder to
understand than necessary.

No functional change intended, that's why I had to split and enable the
test suffixes.mk first.

diffstat:

 usr.bin/make/suff.c |  84 ++++++++++++++++++++--------------------------------
 1 files changed, 32 insertions(+), 52 deletions(-)

diffs (125 lines):

diff -r 1a6993d5f78e -r 2f4c9a721f41 usr.bin/make/suff.c
--- a/usr.bin/make/suff.c       Tue Oct 20 20:36:53 2020 +0000
+++ b/usr.bin/make/suff.c       Tue Oct 20 20:51:15 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: suff.c,v 1.195 2020/10/19 21:57:37 rillig Exp $        */
+/*     $NetBSD: suff.c,v 1.196 2020/10/20 20:51:15 rillig Exp $        */
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -129,7 +129,7 @@
 #include "dir.h"
 
 /*     "@(#)suff.c     8.4 (Berkeley) 3/21/94" */
-MAKE_RCSID("$NetBSD: suff.c,v 1.195 2020/10/19 21:57:37 rillig Exp $");
+MAKE_RCSID("$NetBSD: suff.c,v 1.196 2020/10/20 20:51:15 rillig Exp $");
 
 #define SUFF_DEBUG0(text) DEBUG0(SUFF, text)
 #define SUFF_DEBUG1(fmt, arg1) DEBUG1(SUFF, fmt, arg1)
@@ -431,29 +431,17 @@
     suffNull->flags = SUFF_NULL;
 }
 
-/* Parse a transformation string to find its two component suffixes.
+/* Parse a transformation string such as ".c.o" to find its two component
+ * suffixes (the source ".c" and the target ".o").  If there are no such
+ * suffixes, try a single-suffix transformation as well.
  *
- * Input:
- *     str             String being parsed
- *     out_src         Place to store source of trans.
- *     out_targ        Place to store target of trans.
- *
- * Results:
- *     TRUE if the string is a valid transformation, FALSE otherwise.
+ * Return TRUE if the string is a valid transformation.
  */
 static Boolean
 SuffParseTransform(const char *str, Suff **out_src, Suff **out_targ)
 {
-    SuffListNode *srcLn;       /* element in suffix list of trans source*/
-    Suff *src;                 /* Source of transformation */
-    const char *str2;          /* Extra pointer (maybe target suffix) */
-    SuffListNode *singleLn;    /* element in suffix list of any suffix
-                                * that exactly matches str */
-    Suff *single = NULL;       /* Source of possible transformation to
-                                * null suffix */
-
-    srcLn = NULL;
-    singleLn = NULL;
+    SuffListNode *ln;
+    Suff *singleSrc = NULL;
 
     /*
      * Loop looking first for a suffix that matches the start of the
@@ -461,39 +449,15 @@
      * we can find two that meet these criteria, we've successfully
      * parsed the string.
      */
-    for (;;) {
-       if (srcLn == NULL) {
-           srcLn = Lst_Find(sufflist, SuffSuffIsPrefix, str);
+    for (ln = sufflist->first; ln != NULL; ln = ln->next) {
+       Suff *src = ln->datum;
+        if (!SuffSuffIsPrefix(src, str))
+           continue;
+
+       if (str[src->nameLen] == '\0') {
+           singleSrc = src;
        } else {
-           srcLn = Lst_FindFrom(sufflist, srcLn->next, SuffSuffIsPrefix, str);
-       }
-       if (srcLn == NULL) {
-           /*
-            * Ran out of source suffixes -- no such rule
-            */
-           if (singleLn != NULL) {
-               /*
-                * Not so fast Mr. Smith! There was a suffix that encompassed
-                * the entire string, so we assume it was a transformation
-                * to the null suffix (thank you POSIX). We still prefer to
-                * find a double rule over a singleton, hence we leave this
-                * check until the end.
-                *
-                * XXX: Use emptySuff over suffNull?
-                */
-               *out_src = single;
-               *out_targ = suffNull;
-               return TRUE;
-           }
-           return FALSE;
-       }
-       src = srcLn->datum;
-       str2 = str + src->nameLen;
-       if (*str2 == '\0') {
-           single = src;
-           singleLn = srcLn;
-       } else {
-           Suff *targ = FindSuffByName(str2);
+           Suff *targ = FindSuffByName(str + src->nameLen);
            if (targ != NULL) {
                *out_src = src;
                *out_targ = targ;
@@ -501,6 +465,22 @@
            }
        }
     }
+
+    if (singleSrc != NULL) {
+       /*
+        * Not so fast Mr. Smith! There was a suffix that encompassed
+        * the entire string, so we assume it was a transformation
+        * to the null suffix (thank you POSIX). We still prefer to
+        * find a double rule over a singleton, hence we leave this
+        * check until the end.
+        *
+        * XXX: Use emptySuff over suffNull?
+        */
+       *out_src = singleSrc;
+       *out_targ = suffNull;
+       return TRUE;
+    }
+    return FALSE;
 }
 
 /* Return TRUE if the given string is a transformation rule, that is, a



Home | Main Index | Thread Index | Old Index