Module Name: src
Committed By: rillig
Date: Sun Aug 2 18:57:55 UTC 2020
Modified Files:
src/usr.bin/make: var.c
Log Message:
make(1): inline VarOrder into ApplyModifier_Order
Removing the extra mapping layer "otype" makes the code both faster and
smaller.
To generate a diff of this commit:
cvs rdiff -u -r1.401 -r1.402 src/usr.bin/make/var.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/var.c
diff -u src/usr.bin/make/var.c:1.401 src/usr.bin/make/var.c:1.402
--- src/usr.bin/make/var.c:1.401 Sun Aug 2 18:23:00 2020
+++ src/usr.bin/make/var.c Sun Aug 2 18:57:55 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.401 2020/08/02 18:23:00 rillig Exp $ */
+/* $NetBSD: var.c,v 1.402 2020/08/02 18:57:55 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
*/
#ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: var.c,v 1.401 2020/08/02 18:23:00 rillig Exp $";
+static char rcsid[] = "$NetBSD: var.c,v 1.402 2020/08/02 18:57:55 rillig Exp $";
#else
#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94";
#else
-__RCSID("$NetBSD: var.c,v 1.401 2020/08/02 18:23:00 rillig Exp $");
+__RCSID("$NetBSD: var.c,v 1.402 2020/08/02 18:57:55 rillig Exp $");
#endif
#endif /* not lint */
#endif
@@ -1572,70 +1572,6 @@ VarWordCompareReverse(const void *a, con
return strcmp(*(const char * const *)b, *(const char * const *)a);
}
-/*-
- *-----------------------------------------------------------------------
- * VarOrder --
- * Order the words in the string.
- *
- * Input:
- * str String whose words should be sorted.
- * otype How to order: s - sort, r - reverse, x - random.
- *
- * Results:
- * A string containing the words ordered.
- *-----------------------------------------------------------------------
- */
-static char *
-VarOrder(const char *str, const char otype)
-{
- Buffer buf; /* Buffer for the new string */
- Buf_InitZ(&buf, 0);
-
- char **av; /* word list */
- char *as; /* word list memory */
- int ac;
- av = brk_string(str, &ac, FALSE, &as);
-
- if (ac > 0) {
- switch (otype) {
- case 'r': /* reverse sort alphabetically */
- qsort(av, ac, sizeof(char *), VarWordCompareReverse);
- break;
- case 's': /* sort alphabetically */
- qsort(av, ac, sizeof(char *), VarWordCompare);
- break;
- case 'x': /* randomize */
- /*
- * We will use [ac..2] range for mod factors. This will produce
- * random numbers in [(ac-1)..0] interval, and minimal
- * reasonable value for mod factor is 2 (the mod 1 will produce
- * 0 with probability 1).
- */
- (void)0;
- int i;
- for (i = ac - 1; i > 0; i--) {
- int rndidx = random() % (i + 1);
- char *t = av[i];
- av[i] = av[rndidx];
- av[rndidx] = t;
- }
- }
- }
-
- int i;
- for (i = 0; i < ac; i++) {
- if (i != 0)
- Buf_AddByte(&buf, ' ');
- Buf_AddStr(&buf, av[i]);
- }
-
- free(as);
- free(av);
-
- return Buf_Destroy(&buf, FALSE);
-}
-
-
/* Remove adjacent duplicate words. */
static char *
VarUniq(const char *str)
@@ -2621,23 +2557,64 @@ bad_modifier:
return AMR_BAD;
}
-/* :O or :Or or :Ox */
+/* :O (order ascending) or :Or (order descending) or :Ox (shuffle) */
static ApplyModifierResult
ApplyModifier_Order(const char *mod, ApplyModifiersState *st)
{
- st->next = mod + 1; /* skip to the rest in any case */
+ st->next = mod + 1; /* skip past the 'O' in any case */
+
+ char *as; /* word list memory */
+ int ac;
+ char **av = brk_string(st->val, &ac, FALSE, &as);
- char otype;
if (mod[1] == st->endc || mod[1] == ':') {
- otype = 's';
+ /* :O sorts ascending */
+ qsort(av, ac, sizeof(char *), VarWordCompare);
+
} else if ((mod[1] == 'r' || mod[1] == 'x') &&
(mod[2] == st->endc || mod[2] == ':')) {
- otype = mod[1];
st->next = mod + 2;
+
+ if (mod[1] == 'r') {
+ /* :Or sorts descending */
+ qsort(av, ac, sizeof(char *), VarWordCompareReverse);
+
+ } else {
+ /* :Ox shuffles
+ *
+ * We will use [ac..2] range for mod factors. This will produce
+ * random numbers in [(ac-1)..0] interval, and minimal
+ * reasonable value for mod factor is 2 (the mod 1 will produce
+ * 0 with probability 1).
+ */
+ int i;
+ for (i = ac - 1; i > 0; i--) {
+ int rndidx = random() % (i + 1);
+ char *t = av[i];
+ av[i] = av[rndidx];
+ av[rndidx] = t;
+ }
+ }
} else {
+ free(as);
+ free(av);
return AMR_BAD;
}
- st->newVal = VarOrder(st->val, otype);
+
+ Buffer buf;
+ Buf_InitZ(&buf, 0);
+
+ int i;
+ for (i = 0; i < ac; i++) {
+ if (i != 0)
+ Buf_AddByte(&buf, ' ');
+ Buf_AddStr(&buf, av[i]);
+ }
+
+ free(as);
+ free(av);
+
+ st->newVal = Buf_Destroy(&buf, FALSE);
return AMR_OK;
}