summaryrefslogtreecommitdiff
path: root/regex.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-12-25 07:44:33 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-12-25 07:44:33 +0000
commit1b07582fcc575e21b6fc3d5166492783b1bdcf35 (patch)
tree2e6ffe65d86d5216b86bd90847ab4eeb51177746 /regex.c
parent25fa63dc042c14021276c80ee3f9ff9613bd7bff (diff)
* regex.c (re_match_exec): fix odd \G behavior based on the patch
from Nobu. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3216 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'regex.c')
-rw-r--r--regex.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/regex.c b/regex.c
index 28fefcb..d6246d4 100644
--- a/regex.c
+++ b/regex.c
@@ -3089,6 +3089,9 @@ re_adjust_startpos(bufp, string, size, startpos, range)
}
+static int re_match_exec _((struct re_pattern_buffer *, const char *, int, int, int,
+ struct re_registers *));
+
/* Using the compiled pattern in BUFP->buffer, first tries to match
STRING, starting first at index STARTPOS, then at STARTPOS + 1, and
so on. RANGE is the number of places to try before giving up. If
@@ -3109,7 +3112,7 @@ re_search(bufp, string, size, startpos, range, regs)
struct re_registers *regs;
{
register char *fastmap = bufp->fastmap;
- int val, anchor = 0;
+ int val, anchor = 0, initpos = startpos;
/* Check for out-of-range starting position. */
if (startpos < 0 || startpos > size)
@@ -3238,7 +3241,7 @@ re_search(bufp, string, size, startpos, range, regs)
if (startpos > size) return -1;
if ((anchor || !bufp->can_be_null) && range > 0 && size > 0 && startpos == size)
return -1;
- val = re_match(bufp, string, size, startpos, regs);
+ val = re_match_exec(bufp, string, size, startpos, initpos, regs);
if (val >= 0) return startpos;
if (val == -2) return -2;
@@ -3473,6 +3476,16 @@ re_match(bufp, string_arg, size, pos, regs)
int size, pos;
struct re_registers *regs;
{
+ return re_match_exec(bufp, string_arg, size, pos, 0, regs);
+}
+
+static int
+re_match_exec(bufp, string_arg, size, pos, beg, regs)
+ struct re_pattern_buffer *bufp;
+ const char *string_arg;
+ int size, pos, beg;
+ struct re_registers *regs;
+{
register unsigned char *p = (unsigned char*)bufp->buffer;
unsigned char *p1;
@@ -3884,7 +3897,7 @@ re_match(bufp, string_arg, size, pos, regs)
/* Match at the starting position. */
case begpos:
- if (d - string == pos)
+ if (d - string == beg)
break;
goto fail;