summaryrefslogtreecommitdiff
path: root/Src/Modules/zutil.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Modules/zutil.c')
-rw-r--r--Src/Modules/zutil.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/Src/Modules/zutil.c b/Src/Modules/zutil.c
index 19a8306b5..24659cb16 100644
--- a/Src/Modules/zutil.c
+++ b/Src/Modules/zutil.c
@@ -88,7 +88,8 @@ typedef struct style *Style;
struct style {
struct hashnode node;
- Stypat pats; /* patterns */
+ Stypat pats; /* patterns, sorted by weight descending, then
+ by order of definition, newest first. */
};
struct stypat {
@@ -337,7 +338,19 @@ setstypat(Style s, char *pat, Patprog prog, char **vals, int eval)
p->eval = eprog;
p->next = NULL;
- /* Calculate the weight. */
+ /* Calculate the weight.
+ *
+ * The weight of a pattern is scored as follows:
+ *
+ * - The pattern is split to colon-separated components.
+ * - A component equal to '*' (with nothing else) scores 0 points.
+ * - A component that's a pattern, otherwise, scores 1 point.
+ * - A component that's a literal string scores 2 points.
+ * - The score of a pattern is the sum of the score of its components.
+ *
+ * This corresponds to the notion of 'more specific' in the zshmodules(1)
+ * documentation of zstyle.
+ */
for (weight = 0, tmp = 2, first = 1, str = pat; *str; str++) {
if (first && *str == '*' && (!str[1] || str[1] == ':')) {
@@ -362,9 +375,9 @@ setstypat(Style s, char *pat, Patprog prog, char **vals, int eval)
}
p->weight = (weight += tmp);
+ /* Insert 'q' to 's->pats', using 'qq' as a temporary. */
for (qq = NULL, q = s->pats; q && q->weight >= weight;
qq = q, q = q->next);
-
p->next = q;
if (qq)
qq->next = p;
@@ -1644,7 +1657,7 @@ static int
bin_zparseopts(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
{
char *o, *p, *n, **pp, **aval, **ap, *assoc = NULL, **cp, **np;
- int del = 0, flags = 0, extract = 0, keep = 0;
+ int del = 0, flags = 0, extract = 0, fail = 0, keep = 0;
Zoptdesc sopts[256], d;
Zoptarr a, defarr = NULL;
Zoptval v;
@@ -1681,6 +1694,14 @@ bin_zparseopts(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
}
extract = 1;
break;
+ case 'F':
+ if (o[2]) {
+ args--;
+ o = NULL;
+ break;
+ }
+ fail = 1;
+ break;
case 'K':
if (o[2]) {
args--;
@@ -1843,6 +1864,10 @@ bin_zparseopts(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
if (!(d = lookup_opt(o + 1))) {
while (*++o) {
if (!(d = sopts[STOUC(*o)])) {
+ if (fail) {
+ zwarnnam(nam, "bad option: %c", *o);
+ return 1;
+ }
o = NULL;
break;
}