1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-04 10:41:11 +02:00

32468: save/restore match/mbegin/mend when doing pattern lookups against zstyle contexts

This commit is contained in:
Barton E. Schaefer 2014-03-09 00:29:02 -08:00
parent ff6d8115ef
commit 38be9fe84a
2 changed files with 67 additions and 55 deletions

View file

@ -1,6 +1,12 @@
2014-03-09 Barton E. Schaefer <schaefer@zsh.org>
* 32468: Src/Modules/zutil.c: save/restore match/mbegin/mend
when doing pattern lookups against zstyle contexts
2014-03-03 Barton E. Schaefer <schaefer@zsh.org>
* users/18550: Doc/Zsh/compsys.yo: matcher-list clarifications
2014-03-03 Simon Ruderich <simon@ruderich.org>
* 32289: Doc: Add zsh version to footer in HTML documentation.

View file

@ -30,6 +30,55 @@
#include "zutil.mdh"
#include "zutil.pro"
typedef struct {
char **match;
char **mbegin;
char **mend;
} MatchData;
static void
savematch(MatchData *m)
{
char **a;
queue_signals();
a = getaparam("match");
m->match = a ? zarrdup(a) : NULL;
a = getaparam("mbegin");
m->mbegin = a ? zarrdup(a) : NULL;
a = getaparam("mend");
m->mend = a ? zarrdup(a) : NULL;
unqueue_signals();
}
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);
}
/* Style stuff. */
typedef struct stypat *Stypat;
@ -370,15 +419,21 @@ lookupstyle(char *ctxt, char *style)
{
Style s;
Stypat p;
char **found = NULL;
s = (Style)zstyletab->getnode2(zstyletab, style);
if (!s)
return NULL;
if (s) {
MatchData match;
savematch(&match);
for (p = s->pats; p; p = p->next)
if (pattry(p->prog, ctxt))
return (p->eval ? evalstyle(p) : p->vals);
if (pattry(p->prog, ctxt)) {
found = (p->eval ? evalstyle(p) : p->vals);
break;
}
restorematch(&match);
}
return NULL;
return found;
}
static int
@ -914,55 +969,6 @@ bin_zformat(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
/* Zregexparse stuff. */
typedef struct {
char **match;
char **mbegin;
char **mend;
} MatchData;
static void
savematch(MatchData *m)
{
char **a;
queue_signals();
a = getaparam("match");
m->match = a ? zarrdup(a) : NULL;
a = getaparam("mbegin");
m->mbegin = a ? zarrdup(a) : NULL;
a = getaparam("mend");
m->mend = a ? zarrdup(a) : NULL;
unqueue_signals();
}
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 {
int cutoff;
char *pattern;