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

zsh-workers/7948

This commit is contained in:
Tanaka Akira 1999-09-21 01:33:28 +00:00
parent 1107e2f75f
commit 0abdec4fa3
2 changed files with 20 additions and 21 deletions

View file

@ -2002,7 +2002,7 @@ static int
igetmatch(char **sp, Patprog p, int fl, int n, char *replstr)
{
char *s = *sp, *t, *start, sav;
int i, l = strlen(*sp), matched = 1;
int i, l = strlen(*sp), ml = ztrlen(*sp), matched = 1;
MUSTUSEHEAP("igetmatch"); /* presumably covered by prefork() test */
repllist = NULL;
@ -2053,8 +2053,8 @@ igetmatch(char **sp, Patprog p, int fl, int n, char *replstr)
/* Smallest possible match at tail of string: *
* move back down string until we get a match. *
* There's no optimization here. */
for (t = s + l; t >= s; t--) {
patoffset = t - s;
patoffset = ml;
for (t = s + l; t >= s; t--, patoffset--) {
if (pattry(p, t)) {
*sp = get_match_ret(*sp, t - s, l, fl, replstr);
patoffset = 0;
@ -2070,8 +2070,7 @@ igetmatch(char **sp, Patprog p, int fl, int n, char *replstr)
/* Largest possible match at tail of string: *
* move forward along string until we get a match. *
* Again there's no optimisation. */
for (i = 0, t = s; i < l; i++, t++) {
patoffset = i;
for (i = 0, t = s; i < l; i++, t++, patoffset++) {
if (pattry(p, t)) {
*sp = get_match_ret(*sp, i, l, fl, replstr);
patoffset = 0;
@ -2091,15 +2090,14 @@ igetmatch(char **sp, Patprog p, int fl, int n, char *replstr)
} /* fall through */
case (SUB_SUBSTR|SUB_LONG):
/* longest or smallest at start with substrings */
start = s;
t = s;
if (fl & SUB_GLOBAL)
repllist = newlinklist();
do {
/* loop over all matches for global substitution */
matched = 0;
for (t = start; t < s + l; t++) {
for (; t < s + l; t++, patoffset++) {
/* Find the longest match from this position. */
patoffset = t - start;
if (pattry(p, t) && patinput > t) {
char *mpos = patinput;
if (!(fl & SUB_LONG) && !(p->flags & PAT_PURES)) {
@ -2117,8 +2115,8 @@ igetmatch(char **sp, Patprog p, int fl, int n, char *replstr)
}
if (!--n || (n <= 0 && (fl & SUB_GLOBAL))) {
*sp = get_match_ret(*sp, t-s, mpos-s, fl, replstr);
if (mpos == start)
mpos++;
if (mpos == t)
METAINC(mpos);
}
if (!(fl & SUB_GLOBAL)) {
if (n) {
@ -2139,7 +2137,9 @@ igetmatch(char **sp, Patprog p, int fl, int n, char *replstr)
* which is already marked for replacement.
*/
matched = 1;
start = mpos;
for ( ; t < mpos; t++, patoffset++)
if (*t == Meta)
t++;
break;
}
if (*t == Meta)
@ -2161,17 +2161,16 @@ igetmatch(char **sp, Patprog p, int fl, int n, char *replstr)
case (SUB_END|SUB_SUBSTR):
/* Shortest at end with substrings */
patoffset = l;
patoffset = ml;
if (pattry(p, s + l) && !--n) {
*sp = get_match_ret(*sp, l, l, fl, replstr);
patoffset = 0;
return 1;
} /* fall through */
patoffset = 0;
case (SUB_END|SUB_LONG|SUB_SUBSTR):
/* Longest/shortest at end, matching substrings. */
for (t = s + l - 1; t >= s; t--) {
patoffset = t - s;
patoffset--;
for (t = s + l - 1; t >= s; t--, patoffset--) {
if (t > s && t[-1] == Meta)
t--;
if (pattry(p, t) && patinput > t && !--n) {
@ -2195,7 +2194,7 @@ igetmatch(char **sp, Patprog p, int fl, int n, char *replstr)
return 1;
}
}
patoffset = l;
patoffset = ml;
if ((fl & SUB_LONG) && pattry(p, s + l) && !--n) {
*sp = get_match_ret(*sp, l, l, fl, replstr);
patoffset = 0;

View file

@ -1335,15 +1335,15 @@ pattry(Patprog prog, char *string)
* in the pattern matching part.
*/
char *str;
int len = patinput - patinstart;
int mlen = ztrsub(patinput, patinstart);
PERMALLOC {
str = dupstrpfx(patinstart, len);
str = dupstrpfx(patinstart, patinput - patinstart);
} LASTALLOC;
setsparam("MATCH", str);
setiparam("MBEGIN", (zlong)(patoffset + !isset(KSHARRAYS)));
setiparam("MEND",
(zlong)(len + patoffset + !isset(KSHARRAYS) - 1));
(zlong)(mlen + patoffset + !isset(KSHARRAYS) - 1));
}
if (prog->patnpar && !(patflags & PAT_FILE)) {
/*
@ -1374,11 +1374,11 @@ pattry(Patprog prog, char *string)
* corresponds to indexing as ${foo[1,1]}.
*/
sprintf(numbuf, "%ld",
(long)((*sp - patinstart) + patoffset +
(long)(ztrsub(*sp, patinstart) + patoffset +
!isset(KSHARRAYS)));
mbeginarr[i] = ztrdup(numbuf);
sprintf(numbuf, "%ld",
(long)((*ep - patinstart) + patoffset +
(long)(ztrsub(*ep, patinstart) + patoffset +
!isset(KSHARRAYS) - 1));
mendarr[i] = ztrdup(numbuf);
sp++;