diff options
-rw-r--r-- | Completion/Core/compinit | 4 | ||||
-rw-r--r-- | Doc/Zsh/mod_parameter.yo | 6 | ||||
-rw-r--r-- | Src/Modules/parameter.c | 54 | ||||
-rw-r--r-- | Src/Modules/parameter.mdd | 2 |
4 files changed, 65 insertions, 1 deletions
diff --git a/Completion/Core/compinit b/Completion/Core/compinit index ca9240f92..9b245f45b 100644 --- a/Completion/Core/compinit +++ b/Completion/Core/compinit @@ -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 diff --git a/Doc/Zsh/mod_parameter.yo b/Doc/Zsh/mod_parameter.yo index cb2706767..3d30d6926 100644 --- a/Doc/Zsh/mod_parameter.yo +++ b/Doc/Zsh/mod_parameter.yo @@ -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() diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c index 624d33933..abe7cacd9 100644 --- a/Src/Modules/parameter.c +++ b/Src/Modules/parameter.c @@ -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; } diff --git a/Src/Modules/parameter.mdd b/Src/Modules/parameter.mdd index e26d8c70a..a020ba209 100644 --- a/Src/Modules/parameter.mdd +++ b/Src/Modules/parameter.mdd @@ -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" |