1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-27 04:40:59 +01:00

20412, tweaked: Make test builtin more POSIX compatible

20435: Make pattern.c not alter strings.
This commit is contained in:
Peter Stephenson 2004-10-05 10:39:41 +00:00
parent 684da738b0
commit 46141be5f9
7 changed files with 198 additions and 90 deletions

View file

@ -1818,10 +1818,9 @@ patmatch(Upat prog)
syncstrp->p = (unsigned char *)zshcalloc(patinlen);
while ((ret = patmatch(P_OPERAND(scan)))) {
unsigned char *syncpt;
char savchar, *testptr;
char *savpatinstart = patinstart;
char *savpatinstart, *origsave, *origpatinstart;
int savforce = forceerrs, savpatinlen = patinlen;
int savpatflags = patflags;
int savpatflags = patflags, synclen;
forceerrs = -1;
savglobdots = globdots;
matchederrs = errsfound;
@ -1837,16 +1836,38 @@ patmatch(Upat prog)
*/
for (syncpt = syncstrp->p; !*syncpt; syncpt++)
;
testptr = patinstart + (syncpt - syncstrp->p);
DPUTS(testptr > matchpt, "BUG: EXCSYNC failed");
savchar = *testptr;
/*
* If this isn't really the end of the string,
* remember this for the (#e) assertion.
*/
if (savchar)
synclen = syncpt - syncstrp->p;
if (patinstart[synclen]) {
/*
* We need to truncate the string at
* this point. Copy a whole load of
* stuff to avoid modifying the string.
* This includes (at least) patinstart,
* patinput and save.
*/
origsave = save;
origpatinstart = patinstart;
DPUTS(patinstart + synclen > matchpt,
"BUG: EXCSYNC failed");
savpatinstart = patinstart =
ztrduppfx(patinstart, synclen);
patinput = patinstart +
(patinput - origpatinstart);
save = patinstart + (save - origpatinstart);
/*
* If this isn't really the end of the string,
* remember this for the (#e) assertion.
*/
patflags |= PAT_NOTEND;
*testptr = '\0';
}
else
{
/* Don't need to copy, already right length */
origsave = origpatinstart = NULL;
savpatinstart = patinstart;
}
next = PATNEXT(scan);
while (next && P_ISEXCLUDE(next)) {
char *buf = NULL;
@ -1893,7 +1914,17 @@ patmatch(Upat prog)
break;
next = PATNEXT(next);
}
*testptr = savchar;
/*
* Free copied string and restore if
* we needed to truncate.
*/
if (origpatinstart) {
patinput = origpatinstart +
(patinput - patinstart);
zfree(patinstart, synclen+1);
patinstart = origpatinstart;
save = origsave;
}
patflags = savpatflags;
globdots = savglobdots;
forceerrs = savforce;