From 09a9a37aaccf043ad6e9c66344a1b722df633013 Mon Sep 17 00:00:00 2001 From: Tanaka Akira Date: Fri, 21 Jan 2000 10:07:35 +0000 Subject: zsh-workers/9395 --- Src/exec.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) (limited to 'Src/exec.c') diff --git a/Src/exec.c b/Src/exec.c index ae13ba016..6310d5431 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -3281,7 +3281,6 @@ stripkshdef(Eprog prog, char *name) { Wordcode pc = prog->prog; wordcode code; - Eprog ret; if (!prog) return NULL; @@ -3301,16 +3300,33 @@ stripkshdef(Eprog prog, char *name) *pc != 1 || strcmp(name, ecrawstr(prog, pc + 1))) return prog; - ret = (Eprog) zhalloc(sizeof(*prog)); - ret->len = (WC_FUNCDEF_SKIP(code) - 3) * sizeof(wordcode); - ret->prog = pc + 3; - ret->strs = (char *) (pc + pc[3]); - ret->shf = NULL; - ret->pats = prog->pats; - ret->npats = prog->npats; - ret->heap = 1; - - return ret; + { + Eprog ret; + Wordcode end = pc + WC_FUNCDEF_SKIP(code); + int nprg = pc[2] - 4; + int npats = pc[3]; + int plen, len, i; + Patprog *pp; + + pc += 4; + + plen = (end - pc) * sizeof(wordcode); + len = plen + (npats * sizeof(Patprog)); + + ret = (Eprog) zhalloc(sizeof(*ret)); + ret->heap = 1; + ret->len = len; + ret->npats = npats; + ret->pats = pp = (Patprog *) zhalloc(len); + ret->prog = (Wordcode) (ret->pats + npats); + for (i = npats; i--; pp++) + *pp = dummy_patprog1; + memcpy(ret->prog, pc, plen); + ret->strs = (char *) (ret->prog + nprg); + ret->shf = NULL; + + return ret; + } } /* check to see if AUTOCD applies here */ -- cgit 1.4.1