mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-10 12:40:58 +02:00
zsh-workers/9544
This commit is contained in:
parent
d4a43a774e
commit
59ca53e6a5
1 changed files with 58 additions and 35 deletions
|
@ -682,6 +682,55 @@ bin_zformat(char *nam, char **args, char *ops, int func)
|
||||||
|
|
||||||
/* Zregexparse stuff. */
|
/* Zregexparse stuff. */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char **match;
|
||||||
|
char **mbegin;
|
||||||
|
char **mend;
|
||||||
|
} MatchData;
|
||||||
|
|
||||||
|
static void
|
||||||
|
savematch(MatchData *m)
|
||||||
|
{
|
||||||
|
char **a;
|
||||||
|
|
||||||
|
PERMALLOC {
|
||||||
|
a = getaparam("match");
|
||||||
|
m->match = a ? arrdup(a) : NULL;
|
||||||
|
a = getaparam("mbegin");
|
||||||
|
m->mbegin = a ? arrdup(a) : NULL;
|
||||||
|
a = getaparam("mend");
|
||||||
|
m->mend = a ? arrdup(a) : NULL;
|
||||||
|
} LASTALLOC;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
restorematch(MatchData *m)
|
||||||
|
{
|
||||||
|
if (m->match)
|
||||||
|
setaparam("match", m->match);
|
||||||
|
else
|
||||||
|
unsetparam("match");
|
||||||
|
if (m->mbegin)
|
||||||
|
setaparam("mbegin", m->mbegin);
|
||||||
|
else
|
||||||
|
unsetparam("mbegin");
|
||||||
|
if (m->mend)
|
||||||
|
setaparam("mend", m->mend);
|
||||||
|
else
|
||||||
|
unsetparam("mend");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
freematch(MatchData *m)
|
||||||
|
{
|
||||||
|
if (m->match)
|
||||||
|
freearray(m->match);
|
||||||
|
if (m->mbegin)
|
||||||
|
freearray(m->mbegin);
|
||||||
|
if (m->mend)
|
||||||
|
freearray(m->mend);
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int cutoff;
|
int cutoff;
|
||||||
char *pattern;
|
char *pattern;
|
||||||
|
@ -982,14 +1031,9 @@ rmatch(RParseResult *sm, char *subj, char *var1, char *var2, int comp)
|
||||||
nexts = sm->in;
|
nexts = sm->in;
|
||||||
addlinknode(nextslist, nexts);
|
addlinknode(nextslist, nexts);
|
||||||
do {
|
do {
|
||||||
char **savematch1, **savembegin1, **savemend1;
|
MatchData match1, match2;
|
||||||
char **savematch2, **savembegin2, **savemend2;
|
|
||||||
|
|
||||||
PERMALLOC {
|
savematch(&match1);
|
||||||
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;
|
int i;
|
||||||
|
@ -1012,18 +1056,8 @@ rmatch(RParseResult *sm, char *subj, char *var1, char *var2, int comp)
|
||||||
if (*subj++ == Meta)
|
if (*subj++ == Meta)
|
||||||
subj++;
|
subj++;
|
||||||
|
|
||||||
PERMALLOC {
|
savematch(&match2);
|
||||||
savematch2 = arrdup(getaparam("match"));
|
restorematch(&match1);
|
||||||
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)) {
|
for (aln = firstnode(br->actions); aln; aln = nextnode(aln)) {
|
||||||
char *action = getdata(aln);
|
char *action = getdata(aln);
|
||||||
|
@ -1031,12 +1065,7 @@ rmatch(RParseResult *sm, char *subj, char *var1, char *var2, int comp)
|
||||||
if (action)
|
if (action)
|
||||||
execstring(action, 1, 0);
|
execstring(action, 1, 0);
|
||||||
}
|
}
|
||||||
if (savematch2)
|
restorematch(&match2);
|
||||||
setaparam("match", savematch2);
|
|
||||||
if (savembegin2)
|
|
||||||
setaparam("mbegin", savembegin2);
|
|
||||||
if (savemend2)
|
|
||||||
setaparam("mend", savemend2);
|
|
||||||
|
|
||||||
point2 += len;
|
point2 += len;
|
||||||
setiparam(var2, point2);
|
setiparam(var2, point2);
|
||||||
|
@ -1051,14 +1080,8 @@ rmatch(RParseResult *sm, char *subj, char *var1, char *var2, int comp)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ln) {
|
if (!ln)
|
||||||
if (savematch1)
|
freematch(&match1);
|
||||||
freearray(savematch1);
|
|
||||||
if (savembegin1)
|
|
||||||
freearray(savembegin1);
|
|
||||||
if (savemend1)
|
|
||||||
freearray(savemend1);
|
|
||||||
}
|
|
||||||
} while (ln);
|
} while (ln);
|
||||||
|
|
||||||
if (!comp && !*subj)
|
if (!comp && !*subj)
|
||||||
|
|
Loading…
Reference in a new issue