about summary refs log tree commit diff
path: root/Src/pattern.c
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-12-02 14:05:59 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-12-02 14:05:59 +0000
commit158204bce06cc89519fe99dc38f76f2251bbaea3 (patch)
tree74ae714eeab01fa58e5895229f2ffc13bbb3bc02 /Src/pattern.c
parent7f7497c531841c7fa53bfa2618c7d5592abddfda (diff)
downloadzsh-158204bce06cc89519fe99dc38f76f2251bbaea3.tar.gz
zsh-158204bce06cc89519fe99dc38f76f2251bbaea3.tar.xz
zsh-158204bce06cc89519fe99dc38f76f2251bbaea3.zip
zsh-workers/8852
Diffstat (limited to 'Src/pattern.c')
-rw-r--r--Src/pattern.c40
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.
 		 */