diff options
author | Tanaka Akira <akr@users.sourceforge.net> | 1999-12-02 14:05:59 +0000 |
---|---|---|
committer | Tanaka Akira <akr@users.sourceforge.net> | 1999-12-02 14:05:59 +0000 |
commit | 158204bce06cc89519fe99dc38f76f2251bbaea3 (patch) | |
tree | 74ae714eeab01fa58e5895229f2ffc13bbb3bc02 /Src/pattern.c | |
parent | 7f7497c531841c7fa53bfa2618c7d5592abddfda (diff) | |
download | zsh-158204bce06cc89519fe99dc38f76f2251bbaea3.tar.gz zsh-158204bce06cc89519fe99dc38f76f2251bbaea3.tar.xz zsh-158204bce06cc89519fe99dc38f76f2251bbaea3.zip |
zsh-workers/8852
Diffstat (limited to 'Src/pattern.c')
-rw-r--r-- | Src/pattern.c | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/Src/pattern.c b/Src/pattern.c index 35e11161b..7d77a94da 100644 --- a/Src/pattern.c +++ b/Src/pattern.c @@ -1283,10 +1283,25 @@ pattrystart(void) mod_export int pattry(Patprog prog, char *string) { - int i; + return pattryrefs(prog, string, NULL, NULL, NULL); +} + +/* The last three arguments are used to report the positions for the + * backreferences. On entry, *nump should contain the maximum number + * positions to report. */ + +/**/ +mod_export int +pattryrefs(Patprog prog, char *string, int *nump, int *begp, int *endp) +{ + int i, maxnpos; char **sp, **ep; char *progstr = (char *)prog + prog->startoff; + if (nump) { + maxnpos = *nump; + *nump = 0; + } /* inherited from domatch, but why, exactly? */ if (*string == Nularg) string++; @@ -1350,7 +1365,28 @@ pattry(Patprog prog, char *string) setiparam("MEND", (zlong)(mlen + patoffset + !isset(KSHARRAYS) - 1)); } - if (prog->patnpar && !(patflags & PAT_FILE)) { + if (prog->patnpar && nump) { + /* + * b flag: for backreferences using parentheses. Reported + * directly. + */ + *nump = prog->patnpar; + + sp = patbeginp; + 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; + + sp++; + ep++; + } + } else if (prog->patnpar && !(patflags & PAT_FILE)) { /* * b flag: for backreferences using parentheses. */ |