diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2008-09-26 09:11:27 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2008-09-26 09:11:27 +0000 |
commit | b2d08a2155afe05d2dd6a01b6a2d2c5035d30b45 (patch) | |
tree | d5da7bfce0adcab7703f8997ad34c1a59996c3de /Src/subst.c | |
parent | 84584ea58bf0a8f58ed0dcd30d769adffa3377f7 (diff) | |
download | zsh-b2d08a2155afe05d2dd6a01b6a2d2c5035d30b45.tar.gz zsh-b2d08a2155afe05d2dd6a01b6a2d2c5035d30b45.tar.xz zsh-b2d08a2155afe05d2dd6a01b6a2d2c5035d30b45.zip |
25744: dynamic named directories and further doshfunc() simplification
Diffstat (limited to 'Src/subst.c')
-rw-r--r-- | Src/subst.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/Src/subst.c b/Src/subst.c index 6c3487e9a..caa2ecfda 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -528,7 +528,8 @@ filesubstr(char **namptr, int assign) char *str = *namptr; if (*str == Tilde && str[1] != '=' && str[1] != Equals) { - char *ptr; + Shfunc dirfunc; + char *ptr, *tmp, *res; int val; val = zstrtol(str + 1, &ptr, 10); @@ -539,9 +540,23 @@ filesubstr(char **namptr, int assign) *namptr = dyncat(pwd, str + 2); return 1; } else if (str[1] == '-' && isend(str[2])) { /* ~- */ - char *tmp; *namptr = dyncat((tmp = oldpwd) ? tmp : pwd, str + 2); return 1; + } else if (str[1] == Inbrack && + (dirfunc = getshfunc("zsh_directory_name")) && + (ptr = strchr(str+2, Outbrack))) { + char **arr; + untokenize(tmp = dupstrpfx(str+2, ptr - (str+2))); + remnulargs(tmp); + arr = subst_string_by_func(dirfunc, "n", tmp); + res = arr ? *arr : NULL; + if (res) { + *namptr = dyncat(res, ptr+1); + return 1; + } + if (isset(NOMATCH)) + zerr("no directory expansion: ~[%s]", tmp); + return 0; } else if (!inblank(str[1]) && isend(*ptr) && (!idigit(str[1]) || (ptr - str < 4))) { char *ds; |