diff options
author | Tanaka Akira <akr@users.sourceforge.net> | 2000-01-22 23:58:38 +0000 |
---|---|---|
committer | Tanaka Akira <akr@users.sourceforge.net> | 2000-01-22 23:58:38 +0000 |
commit | 5b0c4cae62f351a24260cb35a3a51c94ff556aa1 (patch) | |
tree | 2aae597eaff4ba9a85d694752317c9e0d688d2c7 /Src/pattern.c | |
parent | 7100a47961b04b8f5b7f025721787cd3b78f0cd6 (diff) | |
download | zsh-5b0c4cae62f351a24260cb35a3a51c94ff556aa1.tar.gz zsh-5b0c4cae62f351a24260cb35a3a51c94ff556aa1.tar.xz zsh-5b0c4cae62f351a24260cb35a3a51c94ff556aa1.zip |
zsh-workers/9408
Diffstat (limited to 'Src/pattern.c')
-rw-r--r-- | Src/pattern.c | 66 |
1 files changed, 41 insertions, 25 deletions
diff --git a/Src/pattern.c b/Src/pattern.c index 27fcd0a7e..1c4abbfb4 100644 --- a/Src/pattern.c +++ b/Src/pattern.c @@ -1376,12 +1376,17 @@ pattryrefs(Patprog prog, char *string, int *nump, int *begp, int *endp) ep = patendp; for (i = 0; i < prog->patnpar && i < maxnpos; i++) { - DPUTS(!*sp || !*ep, "BUG: backrefs not set."); - - if (begp) - *begp++ = ztrsub(*sp, patinstart) + patoffset; - if (endp) - *endp++ = ztrsub(*ep, patinstart) + patoffset - 1; + if (parsfound & (1 << i)) { + if (begp) + *begp++ = ztrsub(*sp, patinstart) + patoffset; + if (endp) + *endp++ = ztrsub(*ep, patinstart) + patoffset - 1; + } else { + if (begp) + *begp++ = -1; + if (endp) + *endp++ = -1; + } sp++; ep++; @@ -1403,25 +1408,36 @@ pattryrefs(Patprog prog, char *string, int *nump, int *begp, int *endp) PERMALLOC { for (i = 0; i < prog->patnpar; i++) { - DPUTS(!*sp || !*ep, "BUG: backrefs not set."); - matcharr[i] = dupstrpfx(*sp, *ep - *sp); - /* - * mbegin and mend give indexes into the string - * in the standard notation, i.e. respecting - * KSHARRAYS, and with the end index giving - * the last character, not one beyond. - * For example, foo=foo; [[ $foo = (f)oo ]] gives - * (without KSHARRAYS) indexes 1 and 1, which - * corresponds to indexing as ${foo[1,1]}. - */ - sprintf(numbuf, "%ld", - (long)(ztrsub(*sp, patinstart) + patoffset + - !isset(KSHARRAYS))); - mbeginarr[i] = ztrdup(numbuf); - sprintf(numbuf, "%ld", - (long)(ztrsub(*ep, patinstart) + patoffset + - !isset(KSHARRAYS) - 1)); - mendarr[i] = ztrdup(numbuf); + if (parsfound & (1 << i)) { + matcharr[i] = dupstrpfx(*sp, *ep - *sp); + /* + * mbegin and mend give indexes into the string + * in the standard notation, i.e. respecting + * KSHARRAYS, and with the end index giving + * the last character, not one beyond. + * For example, foo=foo; [[ $foo = (f)oo ]] gives + * (without KSHARRAYS) indexes 1 and 1, which + * corresponds to indexing as ${foo[1,1]}. + */ + sprintf(numbuf, "%ld", + (long)(ztrsub(*sp, patinstart) + + patoffset + + !isset(KSHARRAYS))); + mbeginarr[i] = ztrdup(numbuf); + sprintf(numbuf, "%ld", + (long)(ztrsub(*ep, patinstart) + + patoffset + + !isset(KSHARRAYS) - 1)); + mendarr[i] = ztrdup(numbuf); + } else { + /* Pattern wasn't set: either it was in an + * unmatched branch, or a hashed parenthesis + * that didn't match at all. + */ + matcharr[i] = ztrdup(""); + mbeginarr[i] = ztrdup("-1"); + mendarr[i] = ztrdup("-1"); + } sp++; ep++; } |