Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
evaluated styles
- X-seq: zsh-workers 11691
- From: Sven Wischnowsky <wischnow@xxxxxxxxxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxxxxxxxxx
- Subject: evaluated styles
- Date: Wed, 31 May 2000 16:22:14 +0200 (MET DST)
- Mailing-list: contact zsh-workers-help@xxxxxxxxxxxxxx; run by ezmlm
Just found an old patch I wanted to show you after 3.1.7...
We were discussing ways to make style-lookup evaluate some
user-defined code instead of just using the constant values. This
is as far as I got in terms of cleanness -- but, of course, no special
syntax thing.
The patch adds the -e option to zstyle, to be used when defining
styles. The values of such styles will then be evaluated when looked
up and the value to return will be taken from $value (should that use
$reply instead?).
I don't plan to commit it (unless enough people get really excited
about it or we get suggestions for improvement).
Bye
Sven
diff -u -r ../oz/Doc/Zsh/mod_zutil.yo ./Doc/Zsh/mod_zutil.yo
--- ../oz/Doc/Zsh/mod_zutil.yo Mon May 29 19:04:34 2000
+++ ./Doc/Zsh/mod_zutil.yo Tue May 30 19:49:33 2000
@@ -8,7 +8,7 @@
startitem()
findex(zstyle)
xitem(tt(zstyle) [ tt(-L) ])
-xitem(tt(zstyle) [ tt(-) | tt(-)tt(-) ] var(pattern) var(style) var(strings) ...)
+xitem(tt(zstyle) [ tt(-e) | tt(-) | tt(-)tt(-) ] var(pattern) var(style) var(strings) ...)
xitem(tt(zstyle -d) [ var(pattern) [ var(styles) ... ] ])
xitem(tt(zstyle -g) var(name) [ var(pattern) [ var(style) ] ])
xitem(tt(zstyle -abs) var(context) var(style) var(name) [ var(sep) ])
@@ -33,9 +33,14 @@
done in the form of calls to tt(zstyle). Forms with arguments:
startitem()
-item(tt(zstyle) [ tt(-) | tt(-)tt(-) ] var(pattern) var(style) var(strings) ...)(
+item(tt(zstyle) [ tt(-e) | tt(-) | tt(-)tt(-) ] var(pattern) var(style) var(strings) ...)(
Defines the given var(style) for the var(pattern) with the var(strings) as
-the value.
+the value. If the tt(-e) option is given, the var(strings) will be
+concatenated (separated by spaces) and the resulting string will be
+evaluated when the style is looked up. In this case the parameter
+tt(value) will be used to get the strings to return after the
+evaluation. If tt(value) is not set, this will be treated as if the
+style were not set.
)
item(tt(zstyle -d) [ var(pattern) [ var(styles) ... ] ])(
Delete style definitions. Without arguments all definitions are deleted,
diff -u -r ../oz/Src/Modules/zutil.c ./Src/Modules/zutil.c
--- ../oz/Src/Modules/zutil.c Mon May 29 19:04:39 2000
+++ ./Src/Modules/zutil.c Tue May 30 19:53:07 2000
@@ -48,6 +48,7 @@
char *pat; /* pattern string */
Patprog prog; /* compiled pattern */
int weight; /* how specific is the pattern? */
+ int eval; /* eval-on-retrieve? */
char **vals;
};
@@ -102,7 +103,7 @@
/* Store a value for a style. */
static void
-setstypat(Style s, char *pat, Patprog prog, char **vals)
+setstypat(Style s, char *pat, Patprog prog, char **vals, int eval)
{
int weight, tmp, first;
char *str;
@@ -116,6 +117,7 @@
if (p->vals)
freearray(p->vals);
p->vals = zarrdup(vals);
+ p->eval = eval;
return;
}
@@ -126,6 +128,7 @@
p->pat = ztrdup(pat);
p->prog = prog;
p->vals = zarrdup(vals);
+ p->eval = eval;
p->next = NULL;
/* Calculate the weight. */
@@ -184,9 +187,36 @@
return s;
}
+static char **
+evalstyle(Stypat p)
+{
+ int ef = errflag;
+ Eprog prog = parse_string(sepjoin(p->vals, " ", 0), 0);
+ char **ret;
+
+ if (!prog) {
+ errflag = ef;
+ return NULL;
+ }
+ unsetparam("value");
+ execode(prog, 1, 0);
+ if (errflag) {
+ errflag = ef;
+ return NULL;
+ }
+ errflag = ef;
+
+ ret = getaparam("value");
+ if (ret)
+ ret = arrdup(ret);
+ unsetparam("value");
+
+ return ret;
+}
+
/* Look up a style for a context pattern. This does the matching. */
-static Stypat
+static char **
lookupstyle(char *ctxt, char *style)
{
Style s;
@@ -196,7 +226,7 @@
if (!strcmp(s->name, style))
for (p = s->pats; p; p = p->next)
if (pattry(p->prog, ctxt))
- return p;
+ return (p->eval ? evalstyle(p) : p->vals);
return NULL;
}
@@ -204,7 +234,7 @@
static int
bin_zstyle(char *nam, char **args, char *ops, int func)
{
- int min, max, n, add = 0, list = 0;
+ int min, max, n, add = 0, list = 0, eval = 0;
if (!args[0])
list = 1;
@@ -218,6 +248,10 @@
}
if (oc == 'L')
list = 2;
+ else if (oc == 'e') {
+ eval = add = 1;
+ args++;
+ }
} else {
add = 1;
args++;
@@ -243,7 +277,7 @@
}
if (!(s = getstyle(args[1])))
s = addstyle(args[1]);
- setstypat(s, args[0], prog, args + 2);
+ setstypat(s, args[0], prog, args + 2, eval);
return 0;
}
@@ -259,9 +293,9 @@
}
for (p = s->pats; p; p = p->next) {
if (list == 1)
- printf(" %s", p->pat);
+ printf("%s %s", (p->eval ? "(eval)" : " "), p->pat);
else {
- printf("zstyle ");
+ printf("zstyle %s", (p->eval ? "-e " : ""));
quotedzputs(p->pat, stdout);
printf(" %s", s->name);
}
@@ -343,12 +377,11 @@
break;
case 's':
{
- Stypat s;
- char *ret;
+ char **vals, *ret;
int val;
- if ((s = lookupstyle(args[1], args[2])) && s->vals[0]) {
- ret = sepjoin(s->vals, (args[4] ? args[4] : " "), 0);
+ if ((vals = lookupstyle(args[1], args[2])) && vals[0]) {
+ ret = sepjoin(vals, (args[4] ? args[4] : " "), 0);
val = 0;
} else {
ret = ztrdup("");
@@ -361,16 +394,15 @@
break;
case 'b':
{
- Stypat s;
- char *ret;
+ char **vals, *ret;
int val;
- if ((s = lookupstyle(args[1], args[2])) &&
- s->vals[0] && !s->vals[1] &&
- (!strcmp(s->vals[0], "yes") ||
- !strcmp(s->vals[0], "true") ||
- !strcmp(s->vals[0], "on") ||
- !strcmp(s->vals[0], "1"))) {
+ if ((vals = lookupstyle(args[1], args[2])) &&
+ vals[0] && !vals[1] &&
+ (!strcmp(vals[0], "yes") ||
+ !strcmp(vals[0], "true") ||
+ !strcmp(vals[0], "on") ||
+ !strcmp(vals[0], "1"))) {
ret = "yes";
val = 0;
} else {
@@ -384,12 +416,11 @@
break;
case 'a':
{
- Stypat s;
- char **ret;
+ char **vals, **ret;
int val;
- if ((s = lookupstyle(args[1], args[2]))) {
- ret = zarrdup(s->vals);
+ if ((vals = lookupstyle(args[1], args[2]))) {
+ ret = zarrdup(vals);
val = 0;
} else {
char *dummy = NULL;
@@ -405,14 +436,14 @@
case 't':
case 'T':
{
- Stypat s;
+ char **vals;
- if ((s = lookupstyle(args[1], args[2])) && s->vals[0]) {
+ if ((vals = lookupstyle(args[1], args[2])) && vals[0]) {
if (args[3]) {
char **ap = args + 3, **p;
while (*ap) {
- p = s->vals;
+ p = vals;
while (*p)
if (!strcmp(*ap, *p++))
return 0;
@@ -420,27 +451,25 @@
}
return 1;
} else
- return !(!strcmp(s->vals[0], "true") ||
- !strcmp(s->vals[0], "yes") ||
- !strcmp(s->vals[0], "on") ||
- !strcmp(s->vals[0], "1"));
+ return !(!strcmp(vals[0], "true") ||
+ !strcmp(vals[0], "yes") ||
+ !strcmp(vals[0], "on") ||
+ !strcmp(vals[0], "1"));
}
- return (args[0][1] == 't' ? (s ? 1 : 2) : 0);
+ return (args[0][1] == 't' ? (vals ? 1 : 2) : 0);
}
break;
case 'm':
{
- Stypat s;
+ char **vals;
Patprog prog;
tokenize(args[3]);
- if ((s = lookupstyle(args[1], args[2])) &&
+ if ((vals = lookupstyle(args[1], args[2])) &&
(prog = patcompile(args[3], PAT_STATIC, NULL))) {
- char **p = s->vals;
-
- while (*p)
- if (pattry(prog, *p++))
+ while (*vals)
+ if (pattry(prog, *vals++))
return 0;
}
return 1;
--
Sven Wischnowsky wischnow@xxxxxxxxxxxxxxxxxxxxxxx
Messages sorted by:
Reverse Date,
Date,
Thread,
Author