From 358da5ee19c0513b95181302006f9bc57e5047a8 Mon Sep 17 00:00:00 2001 From: Tanaka Akira Date: Tue, 18 Jan 2000 12:31:52 +0000 Subject: zsh-workers/9348 --- Src/Modules/zutil.c | 220 +++++++++++++++++++++++++++++----------------------- 1 file changed, 121 insertions(+), 99 deletions(-) (limited to 'Src/Modules') diff --git a/Src/Modules/zutil.c b/Src/Modules/zutil.c index 1c0393578..e5e1bf57e 100644 --- a/Src/Modules/zutil.c +++ b/Src/Modules/zutil.c @@ -752,17 +752,20 @@ static void connectstates(LinkList out, LinkList in) { LinkNode outnode, innode, ln; - for(outnode = firstnode(out); outnode; outnode = nextnode(outnode)) { + + for (outnode = firstnode(out); outnode; outnode = nextnode(outnode)) { RParseBranch *outbranch = getdata(outnode); - for(innode = firstnode(in); innode; innode = nextnode(innode)) { + + for (innode = firstnode(in); innode; innode = nextnode(innode)) { RParseBranch *inbranch = getdata(innode); RParseBranch *br = ncalloc(sizeof(*br)); + br->state = inbranch->state; br->actions = newlinklist(); - for(ln = firstnode(outbranch->actions); ln; ln = nextnode(ln)) - addlinknode(br->actions, getdata(ln)); - for(ln = firstnode(inbranch->actions); ln; ln = nextnode(ln)) - addlinknode(br->actions, getdata(ln)); + for (ln = firstnode(outbranch->actions); ln; ln = nextnode(ln)) + addlinknode(br->actions, getdata(ln)); + for (ln = firstnode(inbranch->actions); ln; ln = nextnode(ln)) + addlinknode(br->actions, getdata(ln)); addlinknode(outbranch->state->branches, br); } } @@ -774,42 +777,41 @@ rparseelt(RParseResult *result, jmp_buf *perr) int l; char *s = *rparseargs; - if(!s) + if (!s) return 1; - switch(s[0]) { + switch (s[0]) { case '/': { RParseState *st; RParseBranch *br; char *pattern, *lookahead; int patternlen, lookaheadlen; + l = strlen(s); - if(!((2 <= l && s[l - 1] == '/') || - (3 <= l && s[l - 2] == '/' && (s[l - 1] == '+' || - s[l - 1] == '-')))) + if (!((2 <= l && s[l - 1] == '/') || + (3 <= l && s[l - 2] == '/' && (s[l - 1] == '+' || + s[l - 1] == '-')))) return 1; st = ncalloc(sizeof(*st)); st->branches = newlinklist(); st->cutoff = s[l - 1]; - if(s[l - 1] == '/') { + if (s[l - 1] == '/') { pattern = s + 1; patternlen = l - 2; - } - else { + } else { pattern = s + 1; patternlen = l - 3; } rparseargs++; - if((s = *rparseargs) && s[0] == '%' && + if ((s = *rparseargs) && s[0] == '%' && 2 <= (l = strlen(s)) && s[l - 1] == '%') { rparseargs++; lookahead = s + 1; lookaheadlen = l - 2; - } - else { + } else { lookahead = NULL; } - if(patternlen == 2 && !strncmp(pattern, "[]", 2)) + if (patternlen == 2 && !strncmp(pattern, "[]", 2)) st->pattern = NULL; else { char *cp; @@ -823,7 +825,7 @@ rparseelt(RParseResult *result, jmp_buf *perr) cp += patternlen; strcpy(cp, ")"); cp += 1; - if(lookahead) { + if (lookahead) { strcpy(cp, "(#B)"); cp += 4; strcpy(cp, lookahead); @@ -832,23 +834,21 @@ rparseelt(RParseResult *result, jmp_buf *perr) strcpy(cp, "*"); } st->patprog = NULL; - if((s = *rparseargs) && *s == '-') { + if ((s = *rparseargs) && *s == '-') { rparseargs++; l = strlen(s); st->guard = ncalloc(l); memcpy(st->guard, s + 1, l - 1); st->guard[l - 1] = '\0'; - } - else + } else st->guard = NULL; - if((s = *rparseargs) && *s == ':') { + if ((s = *rparseargs) && *s == ':') { rparseargs++; l = strlen(s); st->action = ncalloc(l); memcpy(st->action, s + 1, l - 1); st->action[l - 1] = '\0'; - } - else + } else st->action = NULL; result->nullacts = NULL; result->in = newlinklist(); @@ -864,13 +864,13 @@ rparseelt(RParseResult *result, jmp_buf *perr) break; } case '(': - if(s[1]) + if (s[1]) return 1; rparseargs++; - if(rparsealt(result, perr)) + if (rparsealt(result, perr)) longjmp(*perr, 2); s = *rparseargs; - if(!s || s[0] != ')' || s[1] != '\0') + if (!s || s[0] != ')' || s[1] != '\0') longjmp(*perr, 2); rparseargs++; break; @@ -884,12 +884,12 @@ rparseelt(RParseResult *result, jmp_buf *perr) static int rparseclo(RParseResult *result, jmp_buf *perr) { - if(rparseelt(result, perr)) + if (rparseelt(result, perr)) return 1; - if(*rparseargs && !strcmp(*rparseargs, "#")) { + if (*rparseargs && !strcmp(*rparseargs, "#")) { rparseargs++; - while(*rparseargs && !strcmp(*rparseargs, "#")) + while (*rparseargs && !strcmp(*rparseargs, "#")) rparseargs++; connectstates(result->out, result->in); @@ -902,9 +902,11 @@ static void prependactions(LinkList acts, LinkList branches) { LinkNode aln, bln; - for(bln = firstnode(branches); bln; bln = nextnode(bln)) { + + for (bln = firstnode(branches); bln; bln = nextnode(bln)) { RParseBranch *br = getdata(bln); - for(aln = lastnode(acts); aln != (LinkNode)acts; aln = prevnode(aln)) + + for (aln = lastnode(acts); aln != (LinkNode)acts; aln = prevnode(aln)) pushnode(br->actions, getdata(aln)); } } @@ -913,9 +915,10 @@ static void appendactions(LinkList acts, LinkList branches) { LinkNode aln, bln; - for(bln = firstnode(branches); bln; bln = nextnode(bln)) { + for (bln = firstnode(branches); bln; bln = nextnode(bln)) { RParseBranch *br = getdata(bln); - for(aln = firstnode(acts); aln; aln = nextnode(aln)) + + for (aln = firstnode(acts); aln; aln = nextnode(aln)) addlinknode(br->actions, getdata(aln)); } } @@ -931,36 +934,37 @@ rparseseq(RParseResult *result, jmp_buf *perr) result->in = newlinklist(); result->out = newlinklist(); - while(1) { - if((s = *rparseargs) && s[0] == '{' && s[(l = strlen(s)) - 1] == '}') { + while (1) { + if ((s = *rparseargs) && s[0] == '{' && s[(l = strlen(s)) - 1] == '}') { char *action = ncalloc(l - 1); LinkNode ln; + rparseargs++; memcpy(action, s + 1, l - 2); action[l - 2] = '\0'; - if(result->nullacts) + if (result->nullacts) addlinknode(result->nullacts, action); - for(ln = firstnode(result->out); ln; ln = nextnode(ln)) { + for (ln = firstnode(result->out); ln; ln = nextnode(ln)) { RParseBranch *br = getdata(ln); addlinknode(br->actions, action); } } - else if(!rparseclo(&sub, perr)) { + else if (!rparseclo(&sub, perr)) { connectstates(result->out, sub.in); - if(result->nullacts) { + if (result->nullacts) { prependactions(result->nullacts, sub.in); insertlinklist(sub.in, lastnode(result->in), result->in); } - if(sub.nullacts) { + if (sub.nullacts) { appendactions(sub.nullacts, result->out); insertlinklist(sub.out, lastnode(result->out), result->out); - } - else + } else result->out = sub.out; - if(result->nullacts && sub.nullacts) - insertlinklist(sub.nullacts, lastnode(result->nullacts), result->nullacts); + if (result->nullacts && sub.nullacts) + insertlinklist(sub.nullacts, lastnode(result->nullacts), + result->nullacts); else result->nullacts = NULL; } @@ -975,16 +979,16 @@ rparsealt(RParseResult *result, jmp_buf *perr) { RParseResult sub; - if(rparseseq(result, perr)) + if (rparseseq(result, perr)) return 1; - while(*rparseargs && !strcmp(*rparseargs, "|")) { + while (*rparseargs && !strcmp(*rparseargs, "|")) { rparseargs++; - if(rparseseq(&sub, perr)) + if (rparseseq(&sub, perr)) longjmp(*perr, 2); - if(!result->nullacts && sub.nullacts) { + if (!result->nullacts && sub.nullacts) result->nullacts = sub.nullacts; - } + insertlinklist(sub.in, lastnode(result->in), result->in); insertlinklist(sub.out, lastnode(result->out), result->out); } @@ -1004,11 +1008,12 @@ rmatch(RParseResult *sm, char *subj, char *var1, char *var2, int comp) setiparam(var1, point1); setiparam(var2, point2); - if(!*subj) { - if(sm->nullacts) - for(ln = firstnode(sm->nullacts); ln; ln = nextnode(ln)) { + if (!*subj) { + if (sm->nullacts) + for (ln = firstnode(sm->nullacts); ln; ln = nextnode(ln)) { char *action = getdata(ln); - if(action) + + if (action) execstring(action, 1, 0); } return 0; @@ -1020,84 +1025,102 @@ rmatch(RParseResult *sm, char *subj, char *var1, char *var2, int comp) do { char **savematch1, **savembegin1, **savemend1; char **savematch2, **savembegin2, **savemend2; + PERMALLOC { - savematch1 = duparray(getaparam("match"), (VFunc) dupstring); - savembegin1 = duparray(getaparam("mbegin"), (VFunc) dupstring); - savemend1 = duparray(getaparam("mend"), (VFunc) dupstring); + savematch1 = arrdup(getaparam("match")); + savembegin1 = arrdup(getaparam("mbegin")); + savemend1 = arrdup(getaparam("mend")); } LASTALLOC; - for(ln = firstnode(nexts); ln; ln = nextnode(ln)) { + + for (ln = firstnode(nexts); ln; ln = nextnode(ln)) { int i; RParseState *next; + br = getdata(ln); next = br->state; - if(next->pattern && !next->patprog) { + if (next->pattern && !next->patprog) { tokenize(next->pattern); - if(!(next->patprog = patcompile(next->pattern, 0, NULL))) { + if (!(next->patprog = patcompile(next->pattern, 0, NULL))) return 2; - } } - if(next->pattern && pattry(next->patprog, subj) && - (!next->guard || (execstring(next->guard, 1, 0), !lastval))) { + if (next->pattern && pattry(next->patprog, subj) && + (!next->guard || (execstring(next->guard, 1, 0), !lastval))) { LinkNode aln; char **mend = getaparam("mend"); int len = atoi(mend[0]); - for(i = len; i; i--) - if(*subj++ == Meta) + + for (i = len; i; i--) + if (*subj++ == Meta) subj++; + PERMALLOC { - savematch2 = duparray(getaparam("match"), (VFunc) dupstring); - savembegin2 = duparray(getaparam("mbegin"), (VFunc) dupstring); - savemend2 = duparray(getaparam("mend"), (VFunc) dupstring); + savematch2 = arrdup(getaparam("match")); + savembegin2 = arrdup(getaparam("mbegin")); + savemend2 = arrdup(getaparam("mend")); } LASTALLOC; - if(savematch1) setaparam("match", savematch1); - if(savembegin1) setaparam("mbegin", savembegin1); - if(savemend1) setaparam("mend", savemend1); - for(aln = firstnode(br->actions); aln; aln = nextnode(aln)) { + + if (savematch1) + setaparam("match", savematch1); + if (savembegin1) + setaparam("mbegin", savembegin1); + if (savemend1) + setaparam("mend", savemend1); + + for (aln = firstnode(br->actions); aln; aln = nextnode(aln)) { char *action = getdata(aln); - if(action) + + if (action) execstring(action, 1, 0); } - if(savematch2) setaparam("match", savematch2); - if(savembegin2) setaparam("mbegin", savembegin2); - if(savemend2) setaparam("mend", savemend2); + if (savematch2) + setaparam("match", savematch2); + if (savembegin2) + setaparam("mbegin", savembegin2); + if (savemend2) + setaparam("mend", savemend2); + point2 += len; setiparam(var2, point2); st = br->state; nexts = st->branches; - if(next->cutoff == '-' || (next->cutoff == '/' && len)) { - nextslist = newlinklist(); - point1 = point2; - setiparam(var1, point1); + if (next->cutoff == '-' || (next->cutoff == '/' && len)) { + nextslist = newlinklist(); + point1 = point2; + setiparam(var1, point1); } addlinknode(nextslist, nexts); break; } } - if(!ln) { - if(savematch1) freearray(savematch1); - if(savembegin1) freearray(savembegin1); - if(savemend1) freearray(savemend1); + if (!ln) { + if (savematch1) + freearray(savematch1); + if (savembegin1) + freearray(savembegin1); + if (savemend1) + freearray(savemend1); } - } while(ln); + } while (ln); - if(!comp && !*subj) - for(ln = firstnode(sm->out); ln; ln = nextnode(ln)) { + if (!comp && !*subj) + for (ln = firstnode(sm->out); ln; ln = nextnode(ln)) { br = getdata(ln); - if(br->state == st) { - for(ln = firstnode(br->actions); ln; ln = nextnode(ln)) { + if (br->state == st) { + for (ln = firstnode(br->actions); ln; ln = nextnode(ln)) { char *action = getdata(ln); - if(action) + + if (action) execstring(action, 1, 0); } return 0; } } - for(lnn = firstnode(nextslist); lnn; lnn = nextnode(lnn)) { + for (lnn = firstnode(nextslist); lnn; lnn = nextnode(lnn)) { nexts = getdata(lnn); - for(ln = firstnode(nexts); ln; ln = nextnode(ln)) { + for (ln = firstnode(nexts); ln; ln = nextnode(ln)) { br = getdata(ln); - if(br->state->action) + if (br->state->action) execstring(br->state->action, 1, 0); } } @@ -1130,17 +1153,16 @@ bin_zregexparse(char *nam, char **args, char *ops, int func) HEAPALLOC { pushheap(); rparsestates = newlinklist(); - if(setjmp(rparseerr) || rparsealt(&result, &rparseerr) || *rparseargs) { - if(*rparseargs) + if (setjmp(rparseerr) || rparsealt(&result, &rparseerr) || *rparseargs) { + if (*rparseargs) zwarnnam(nam, "invalid regex : %s", *rparseargs, 0); else zwarnnam(nam, "not enough regex arguments", NULL, 0); ret = 3; - } - else + } else ret = 0; - if(!ret) + if (!ret) ret = rmatch(&result, subj, var1, var2, ops['c']); popheap(); } LASTALLOC; -- cgit 1.4.1