diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/builtin.c | 14 | ||||
-rw-r--r-- | Src/parse.c | 27 |
2 files changed, 37 insertions, 4 deletions
diff --git a/Src/builtin.c b/Src/builtin.c index 90ca5133c..73876b1fa 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -43,7 +43,7 @@ static struct builtin builtins[] = BUILTIN(".", BINF_PSPECIAL, bin_dot, 1, -1, 0, NULL, NULL), BUILTIN(":", BINF_PSPECIAL, bin_true, 0, -1, 0, NULL, NULL), BUILTIN("alias", BINF_MAGICEQUALS | BINF_PLUSOPTS, bin_alias, 0, -1, 0, "Lgmr", NULL), - BUILTIN("autoload", BINF_TYPEOPTS, bin_functions, 0, -1, 0, "tUX", "u"), + BUILTIN("autoload", BINF_TYPEOPTS, bin_functions, 0, -1, 0, "tUXw", "u"), BUILTIN("bg", 0, bin_fg, 0, -1, BIN_BG, NULL, NULL), BUILTIN("break", BINF_PSPECIAL, bin_break, 0, 1, BIN_BREAK, NULL, NULL), BUILTIN("bye", 0, bin_break, 0, 1, BIN_EXIT, NULL, NULL), @@ -1996,7 +1996,8 @@ bin_typeset(char *name, char **argv, char *ops, int func) /* Helper for bin_functions() when run as "autoload -X" */ -static int +/**/ +int eval_autoload(Shfunc shf, char *name, char *ops, int func) { if (!(shf->flags & PM_UNDEFINED)) @@ -2114,7 +2115,12 @@ bin_functions(char *name, char **argv, char *ops, int func) /* Take the arguments literally -- do not glob */ for (; *argv; argv++) { - if ((shf = (Shfunc) shfunctab->getnode(shfunctab, *argv))) { + if (ops['w']) { + if (dump_autoload(*argv, on, ops, func)) { + zwarnnam(name, "invalid wordcode file: %s", *argv, 0); + returnval = 1; + } + } else if ((shf = (Shfunc) shfunctab->getnode(shfunctab, *argv))) { /* if any flag was given */ if (on|off) { /* turn on/off the given flags */ @@ -2140,7 +2146,7 @@ bin_functions(char *name, char **argv, char *ops, int func) } /**/ -static Eprog +Eprog mkautofn(Shfunc shf) { Eprog p; diff --git a/Src/parse.c b/Src/parse.c index 373e35ab9..608e68cc7 100644 --- a/Src/parse.c +++ b/Src/parse.c @@ -2801,3 +2801,30 @@ decrdumpcount(FuncDump f) } #endif + +/**/ +int +dump_autoload(char *file, int on, char *ops, int func) +{ + Wordcode h; + FDHead n, e; + Shfunc shf; + int ret = 0; + + if (!strsfx(FD_EXT, file)) + file = dyncat(file, FD_EXT); + + if (!(h = load_dump_header(file))) + return 1; + + for (n = firstfdhead(h), e = (FDHead) (h + fdheaderlen(h)); n < e; + n = nextfdhead(n)) { + shf = (Shfunc) zcalloc(sizeof *shf); + shf->flags = on; + shf->funcdef = mkautofn(shf); + shfunctab->addnode(shfunctab, ztrdup(fdname(n) + n->tail), shf); + if (ops['X'] && eval_autoload(shf, shf->nam, ops, func)) + ret = 1; + } + return ret; +} |