diff options
author | Tanaka Akira <akr@users.sourceforge.net> | 1999-10-18 09:57:00 +0000 |
---|---|---|
committer | Tanaka Akira <akr@users.sourceforge.net> | 1999-10-18 09:57:00 +0000 |
commit | 910dc80a58cf3bcf91c51a72f117a46a7c9f77cf (patch) | |
tree | 35b972869c1275dc47aa6400a09fac4a60fa9c4c /Src/loop.c | |
parent | 2246999a843ba1e6cf34e41228228609e23e650a (diff) | |
download | zsh-910dc80a58cf3bcf91c51a72f117a46a7c9f77cf.tar.gz zsh-910dc80a58cf3bcf91c51a72f117a46a7c9f77cf.tar.xz zsh-910dc80a58cf3bcf91c51a72f117a46a7c9f77cf.zip |
zsh-workers/8319
Diffstat (limited to 'Src/loop.c')
-rw-r--r-- | Src/loop.c | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/Src/loop.c b/Src/loop.c index 5937efc7c..b74de41ed 100644 --- a/Src/loop.c +++ b/Src/loop.c @@ -422,10 +422,13 @@ execcase(Cmd cmd, LinkList args, int flags) char *word; List *l; char **p; + Patprog *pp, pprog; + int save; node = cmd->u.casecmd; l = node->lists; p = node->pats; + pp = node->progs; word = dupstring(*p++); singsub(&word); @@ -435,22 +438,47 @@ execcase(Cmd cmd, LinkList args, int flags) if (node) { cmdpush(CS_CASE); while (*p) { - char *pat = dupstring(*p + 1); - singsub(&pat); + char *pat = NULL, *opat; + + pprog = NULL; + save = 0; + if (isset(XTRACE)) { - char *pat2 = dupstring(pat); + char *pat2; + + opat = pat = dupstring(*p + 1); + singsub(&pat); + save = (!strcmp(pat, opat) && *pp != dummy_patprog2); + + pat2 = dupstring(pat); untokenize(pat2); printprompt4(); fprintf(stderr, "case %s (%s)\n", word, pat2); fflush(stderr); } - if (matchpat(word, pat)) { + if (*pp != dummy_patprog1 && *pp != dummy_patprog2) + pprog = *pp; + + if (!pprog) { + if (!pat) { + opat = pat = dupstring(*p + 1); + singsub(&pat); + save = (!strcmp(pat, opat) && *pp != dummy_patprog2); + } + if (!(pprog = patcompile(pat, (save ? PAT_ZDUP : PAT_STATIC), + NULL))) + zerr("bad pattern: %s", pat, 0); + else if (save) + *pp = pprog; + } + if (pprog && pattry(pprog, word)) { do { execlist(*l++, 1, **p == ';' && (flags & CFLAG_EXEC)); } while(**p++ == '&' && *p); break; } p++; + pp++; l++; } cmdpop(); |