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): replace tricky malloc+realloc+strlen+s...



details:   https://anonhg.NetBSD.org/src/rev/8ce592da4922
branches:  trunk
changeset: 975225:8ce592da4922
user:      rillig <rillig%NetBSD.org@localhost>
date:      Sun Aug 23 17:49:37 2020 +0000

description:
make(1): replace tricky malloc+realloc+strlen+snprintf with Buffer

The code for handling archives is not widely used.  Therefore it does
not need to be fast.  Clarity of the code is more important.  Therefore
replace the malloc + strlen + realloc + snprintf string processing with
the Buffer type, which removes a lot of redundancy.

In the wildcard loop, the "if (sz > nsz)" looked like a mistake.  Why
should it be useful to first allocate a large buffer and then resize it
to a smaller buffer, but still twice as large as necessary?

diffstat:

 usr.bin/make/arch.c |  42 ++++++++++++++++++++++++------------------
 1 files changed, 24 insertions(+), 18 deletions(-)

diffs (91 lines):

diff -r 0555bd5c83f4 -r 8ce592da4922 usr.bin/make/arch.c
--- a/usr.bin/make/arch.c       Sun Aug 23 17:34:46 2020 +0000
+++ b/usr.bin/make/arch.c       Sun Aug 23 17:49:37 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: arch.c,v 1.92 2020/08/23 16:58:02 rillig Exp $ */
+/*     $NetBSD: arch.c,v 1.93 2020/08/23 17:49:37 rillig Exp $ */
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: arch.c,v 1.92 2020/08/23 16:58:02 rillig Exp $";
+static char rcsid[] = "$NetBSD: arch.c,v 1.93 2020/08/23 17:49:37 rillig Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)arch.c     8.2 (Berkeley) 1/2/94";
 #else
-__RCSID("$NetBSD: arch.c,v 1.92 2020/08/23 16:58:02 rillig Exp $");
+__RCSID("$NetBSD: arch.c,v 1.93 2020/08/23 17:49:37 rillig Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -241,7 +241,6 @@
     GNode          *gn;            /* New node */
     char           *libName;       /* Library-part of specification */
     char           *memName;       /* Member-part of specification */
-    char           *nameBuf;       /* temporary place for node name */
     char           saveChar;       /* Ending delimiter of member-name */
     Boolean        subLibName;     /* TRUE if libName should have/had
                                     * variable substitution performed on it */
@@ -393,21 +392,23 @@
            free(buf);
        } else if (Dir_HasWildcards(memName)) {
            Lst   members = Lst_Init();
-           size_t sz = MAXPATHLEN, nsz;
-           nameBuf = bmake_malloc(sz);
+           Buffer nameBuf;
 
+           Buf_Init(&nameBuf, 0);
            Dir_Expand(memName, dirSearchPath, members);
            while (!Lst_IsEmpty(members)) {
                char *member = Lst_DequeueS(members);
-               nsz = strlen(libName) + strlen(member) + 3;
-               if (sz > nsz)
-                   nameBuf = bmake_realloc(nameBuf, sz = nsz * 2);
 
-               snprintf(nameBuf, sz, "%s(%s)", libName, member);
+               Buf_Empty(&nameBuf);
+               Buf_AddStr(&nameBuf, libName);
+               Buf_AddStr(&nameBuf, "(");
+               Buf_AddStr(&nameBuf, member);
+               Buf_AddStr(&nameBuf, ")");
                free(member);
-               gn = Targ_FindNode(nameBuf, TARG_CREATE);
+
+               gn = Targ_FindNode(Buf_GetAll(&nameBuf, NULL), TARG_CREATE);
                if (gn == NULL) {
-                   free(nameBuf);
+                   Buf_Destroy(&nameBuf, TRUE);
                    return FAILURE;
                } else {
                    /*
@@ -422,13 +423,18 @@
                }
            }
            Lst_Destroy(members, NULL);
-           free(nameBuf);
+           Buf_Destroy(&nameBuf, TRUE);
        } else {
-           size_t      sz = strlen(libName) + strlen(memName) + 3;
-           nameBuf = bmake_malloc(sz);
-           snprintf(nameBuf, sz, "%s(%s)", libName, memName);
-           gn = Targ_FindNode(nameBuf, TARG_CREATE);
-           free(nameBuf);
+           Buffer nameBuf;
+
+           Buf_Init(&nameBuf, 0);
+           Buf_AddStr(&nameBuf, libName);
+           Buf_AddStr(&nameBuf, "(");
+           Buf_AddStr(&nameBuf, memName);
+           Buf_AddStr(&nameBuf, ")");
+
+           gn = Targ_FindNode(Buf_GetAll(&nameBuf, NULL), TARG_CREATE);
+           Buf_Destroy(&nameBuf, TRUE);
            if (gn == NULL) {
                return FAILURE;
            } else {



Home | Main Index | Thread Index | Old Index