summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2007-05-29 14:16:02 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2007-05-29 14:16:02 +0000
commit29b7123647bc3b70911bbb2caf85238d22d160c8 (patch)
tree7385597437e723b4471a6bd1061a5a2fdd2b7017 /Src
parent3fbbdf245b7367c4b34492b630450c004a43eed7 (diff)
downloadzsh-29b7123647bc3b70911bbb2caf85238d22d160c8.tar.gz
zsh-29b7123647bc3b70911bbb2caf85238d22d160c8.zip
23485: feature completion and autoloading
Diffstat (limited to 'Src')
-rw-r--r--Src/cond.c7
-rw-r--r--Src/exec.c9
-rw-r--r--Src/module.c23
-rw-r--r--Src/params.c2
4 files changed, 30 insertions, 11 deletions
diff --git a/Src/cond.c b/Src/cond.c
index a597587b6..4356e5d66 100644
--- a/Src/cond.c
+++ b/Src/cond.c
@@ -95,15 +95,12 @@ evalcond(Estate state, char *fromtest)
case COND_REGEX:
{
char *modname = isset(REMATCHPCRE) ? "zsh/pcre" : "zsh/regex";
- /*
- * TODO: we just need to load the appropriate condition.
- */
- if (load_module_silence(modname, NULL, 1) == 1) {
+ sprintf(overridename = overridebuf, "-%s-match", modname+4);
+ if (ensurefeature(modname, "c:", overridename+1)) {
zwarnnam(fromtest, "%s not available for regex",
modname);
return 2;
}
- sprintf(overridename = overridebuf, "-%s-match", modname+4);
ctype = COND_MODI;
}
/*FALLTHROUGH*/
diff --git a/Src/exec.c b/Src/exec.c
index 751282127..ccba66bf8 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -2012,7 +2012,12 @@ execcmd(Estate state, int input, int output, int how, int last1)
/* autoload the builtin if necessary */
if (!((Builtin) hn)->handlerfunc) {
- (void)load_module(((Builtin) hn)->optstr, NULL);
+ /*
+ * Ensure the module is loaded and the
+ * feature corresponding to the builtin
+ * is enabled.
+ */
+ (void)ensurefeature(((Builtin) hn)->optstr, "b:", hn->nam);
hn = builtintab->getnode(builtintab, cmdarg);
}
assign = (hn && (hn->flags & BINF_MAGICEQUALS));
@@ -2229,7 +2234,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
/* autoload the builtin if necessary */
if (!((Builtin) hn)->handlerfunc) {
- (void)load_module(((Builtin) hn)->optstr, NULL);
+ (void)ensurefeature(((Builtin) hn)->optstr, "b:", cmdarg);
hn = builtintab->getnode(builtintab, cmdarg);
}
break;
diff --git a/Src/module.c b/Src/module.c
index 8f5afca83..a6329850e 100644
--- a/Src/module.c
+++ b/Src/module.c
@@ -389,7 +389,7 @@ getconddef(int inf, char *name, int autol)
/* This is a definition for an autoloaded condition, load the *
* module if we haven't tried that already. */
if (f) {
- (void)load_module_silence(p->module, NULL, 0);
+ (void)ensurefeature(p->module, "c:", name);
f = 0;
p = NULL;
} else {
@@ -907,7 +907,7 @@ getmathfunc(char *name, int autol)
removemathfunc(q, p);
- (void)load_module_silence(n, NULL, 0);
+ (void)ensurefeature(n, "f:", name);
return getmathfunc(name, 0);
}
@@ -2850,7 +2850,7 @@ setfeatureenables(char const *nam, Features f, int *e)
ret = 1;
return ret;
}
-
+
/**/
mod_export int
handlefeatures(char *nam, Features f, int **enables)
@@ -2860,3 +2860,20 @@ handlefeatures(char *nam, Features f, int **enables)
*enables = getfeatureenables(nam, f);
return 0;
}
+
+/*
+ * Ensure module "modname" is providing feature with "prefix"
+ * and "feature" (e.g. "b:", "limit").
+ */
+
+/**/
+mod_export int
+ensurefeature(char *modname, char *prefix, char *feature)
+{
+ char *f = dyncat(prefix, feature);
+ char *features[2];
+
+ features[0] = f;
+ features[1] = NULL;
+ return require_module(NULL, modname, features);
+}
diff --git a/Src/params.c b/Src/params.c
index 31a65811f..128d28e75 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -419,7 +419,7 @@ getparamnode(HashTable ht, char *nam)
if (pm && pm->u.str && (pm->node.flags & PM_AUTOLOAD)) {
char *mn = dupstring(pm->u.str);
- if (load_module(mn, NULL) == 1)
+ if (ensurefeature(mn, "p:", nam))
return NULL;
hn = gethashnode2(ht, nam);
if (((Param) hn) == pm && (pm->node.flags & PM_AUTOLOAD)) {