about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorDaniel Shahaf <d.s@daniel.shahaf.name>2020-04-29 00:30:17 +0000
committerDaniel Shahaf <d.s@daniel.shahaf.name>2020-05-02 01:12:07 +0000
commit34d69acbef44f654ea51d762ffdb02f5b1e8b9e1 (patch)
tree78812032a1ac8e24688ec93b3b1539ca257b69d2 /Src
parent95adde8ddc744af744975a58dccd2c3cc53b5333 (diff)
downloadzsh-34d69acbef44f654ea51d762ffdb02f5b1e8b9e1.tar.gz
zsh-34d69acbef44f654ea51d762ffdb02f5b1e8b9e1.tar.xz
zsh-34d69acbef44f654ea51d762ffdb02f5b1e8b9e1.zip
45737 (+ docs, and update the test from 45722): zstyle: When determining the weight (specificity) of a pattern, consider the number of components before anything else, as documented.
Diffstat (limited to 'Src')
-rw-r--r--Src/Modules/zutil.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/Src/Modules/zutil.c b/Src/Modules/zutil.c
index 7d9bf05d6..5c96d06c1 100644
--- a/Src/Modules/zutil.c
+++ b/Src/Modules/zutil.c
@@ -96,7 +96,7 @@ struct stypat {
     Stypat next;
     char *pat;			/* pattern string */
     Patprog prog;		/* compiled pattern */
-    int weight;			/* how specific is the pattern? */
+    zulong weight;		/* how specific is the pattern? */
     Eprog eval;			/* eval-on-retrieve? */
     char **vals;
 };
@@ -293,7 +293,9 @@ newzstyletable(int size, char const *name)
 static int
 setstypat(Style s, char *pat, Patprog prog, char **vals, int eval)
 {
-    int weight, tmp, first;
+    zulong weight;
+    int tmp;
+    int first;
     char *str;
     Stypat p, q, qq;
     Eprog eprog = NULL;
@@ -348,6 +350,12 @@ setstypat(Style s, char *pat, Patprog prog, char **vals, int eval)
      * - A component that's a literal string scores 2 points.
      * - The score of a pattern is the sum of the score of its components.
      *
+     * The result of this calculation is stored in the low bits of 'weight'.
+     * The high bits of 'weight' are used to store the number of ':'-separated
+     * components.  This provides a lexicographic comparison: first compare
+     * the number of components, and if that's equal, compare the specificity
+     * of the components.
+     *
      * This corresponds to the notion of 'more specific' in the zshmodules(1)
      * documentation of zstyle.
      */
@@ -367,6 +375,7 @@ setstypat(Style s, char *pat, Patprog prog, char **vals, int eval)
 
 	if (*str == ':') {
 	    /* Yet another component. */
+	    weight += ZLONG_CONST(1) << (CHAR_BIT * sizeof(weight) / 2);
 
 	    first = 1;
 	    weight += tmp;