1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-04 22:51:42 +02:00

zsh-workers/8480

This commit is contained in:
Tanaka Akira 1999-11-02 09:09:21 +00:00
parent cfa7436ee6
commit eaa5228eb1
4 changed files with 65 additions and 1 deletions

View file

@ -113,6 +113,10 @@ fi
comppostfuncs=()
# Loading it now ensures that the `funcstack' parameter is always correct.
zmodload -i parameter
# This function is used to register or delete completion functions. For
# registering completion functions, it is invoked with the name of the
# function as it's first argument (after the options). The other

View file

@ -137,4 +137,10 @@ item(tt(userdirs))(
This association maps user names to the pathnames of their home
directories.
)
vindex(funcstack)
item(tt(funcstack))(
This array contains the names of the functions currently being
executed. The first element is the name of the function using the
parameter.
)
enditem()

View file

@ -555,6 +555,44 @@ scanpmdisfunctions(HashTable ht, ScanFunc func, int flags)
scanfunctions(ht, func, flags, DISABLED);
}
/* Functions for the funcstack special parameter. */
static LinkList funcstack;
/**/
static char **
funcstackgetfn(Param pm)
{
char **ret, **p;
LinkNode node;
ret = (char **) zhalloc((countlinknodes(funcstack) + 1) * sizeof(char *));
for (node = firstnode(funcstack), p = ret; node; incnode(node), p++)
*p = (char *) getdata(node);
*p = NULL;
return ret;
}
/**/
static int
func_wrapper(List list, FuncWrap w, char *name)
{
PERMALLOC {
pushnode(funcstack, ztrdup(name));
} LASTALLOC;
runshfunc(list, w, name);
DPUTS(strcmp(name, (char *) getdata(firstnode(funcstack))),
"funcstack wrapper with wrong function");
zsfree((char *) remnode(funcstack, firstnode(funcstack)));
return 0;
}
/* Functions for the builtins special parameter. */
/**/
@ -1775,6 +1813,9 @@ static struct pardef partab[] = {
{ "disfunctions", 0,
getpmdisfunction, scanpmdisfunctions, setpmdisfunctions,
NULL, NULL, stdunsetfn, NULL },
{ "funcstack", PM_ARRAY|PM_SPECIAL|PM_READONLY,
NULL, NULL, NULL,
arrsetfn, funcstackgetfn, stdunsetfn, NULL },
{ "builtins", PM_READONLY,
getpmbuiltin, scanpmbuiltins, hashsetfn,
NULL, NULL, stdunsetfn, NULL },
@ -1829,6 +1870,10 @@ static struct pardef partab[] = {
{ NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
};
static struct funcwrap wrapper[] = {
WRAPDEF(func_wrapper),
};
/**/
int
setup_parameter(Module m)
@ -1867,6 +1912,12 @@ boot_parameter(Module m)
def->pm->unsetfn = def->unsetfn;
}
}
PERMALLOC {
funcstack = newlinklist();
} LASTALLOC;
addwrapper(m, wrapper);
return 0;
}
@ -1888,6 +1939,9 @@ cleanup_parameter(Module m)
unsetparam_pm(pm, 0, 1);
}
}
deletewrapper(m, wrapper);
freelinklist(funcstack, freestr);
return 0;
}

View file

@ -1,3 +1,3 @@
autoparams="parameters commands functions disfunctions builtins disbuiltins reswords disreswords options modules dirstack history historywords jobtexts jobstates nameddirs userdirs raliases disraliases galiases disgaliases"
autoparams="parameters commands functions disfunctions funcstack builtins disbuiltins reswords disreswords options modules dirstack history historywords jobtexts jobstates nameddirs userdirs raliases disraliases galiases disgaliases"
objects="parameter.o"