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 and evaluating in the ':...



details:   https://anonhg.NetBSD.org/src/rev/6a7149eeb96f
branches:  trunk
changeset: 953641:6a7149eeb96f
user:      rillig <rillig%NetBSD.org@localhost>
date:      Sun Mar 14 20:00:48 2021 +0000

description:
make: separate parsing and evaluating in the ':O' modifiers

No functional change.

diffstat:

 usr.bin/make/var.c |  37 +++++++++++++++++--------------------
 1 files changed, 17 insertions(+), 20 deletions(-)

diffs (65 lines):

diff -r 3e282a180713 -r 6a7149eeb96f usr.bin/make/var.c
--- a/usr.bin/make/var.c        Sun Mar 14 19:29:37 2021 +0000
+++ b/usr.bin/make/var.c        Sun Mar 14 20:00:48 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: var.c,v 1.877 2021/03/14 19:29:37 rillig Exp $ */
+/*     $NetBSD: var.c,v 1.878 2021/03/14 20:00:48 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.877 2021/03/14 19:29:37 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.878 2021/03/14 20:00:48 rillig Exp $");
 
 typedef enum VarFlags {
        VFL_NONE        = 0,
@@ -3261,31 +3261,28 @@
 ApplyModifier_Order(const char **pp, ApplyModifiersState *st)
 {
        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);
+       Words words;
+       enum SortMode {
+               ASC, DESC, SHUFFLE
+       } mode;
 
        if (IsDelimiter(mod[1], st)) {
-               /* :O sorts ascending */
-               qsort(words.words, words.len, sizeof words.words[0],
-                   str_cmp_asc);
-
+               mode = ASC;
        } else if ((mod[1] == 'r' || mod[1] == 'x') &&
            IsDelimiter(mod[2], st)) {
                (*pp)++;
-
-               if (mod[1] == 'r') {    /* :Or sorts descending */
-                       qsort(words.words, words.len, sizeof words.words[0],
-                           str_cmp_desc);
-               } else
-                       ShuffleStrings(words.words, words.len);
-       } else {
-               Words_Free(words);
+               mode = mod[1] == 'r' ? DESC : SHUFFLE;
+       } else
                return AMR_BAD;
-       }
-
+
+       words = Str_Words(st->expr->value.str, FALSE);
+       if (mode == SHUFFLE)
+               ShuffleStrings(words.words, words.len);
+       else
+               qsort(words.words, words.len, sizeof words.words[0],
+                   mode == ASC ? str_cmp_asc : str_cmp_desc);
        Expr_SetValueOwn(st->expr, Words_JoinFree(words));
+
        return AMR_OK;
 }
 



Home | Main Index | Thread Index | Old Index