aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-10-16 19:34:41 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-20 10:25:57 +1000
commitba3931f5846e4214bdb7cdc75868741e3208f63d (patch)
tree33347b6bee037e2e760300d859a20f398c9de278
parent42b758e85d9992caea4cef72b62886d13c51cbc5 (diff)
downloadjimtcl-ba3931f5846e4214bdb7cdc75868741e3208f63d.zip
jimtcl-ba3931f5846e4214bdb7cdc75868741e3208f63d.tar.gz
jimtcl-ba3931f5846e4214bdb7cdc75868741e3208f63d.tar.bz2
Fix regexp -all -line with an anchored search
Need to set REG_NOTBOL on subsequent calls to regexec() Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim-regexp.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/jim-regexp.c b/jim-regexp.c
index c64c8da..713d90c 100644
--- a/jim-regexp.c
+++ b/jim-regexp.c
@@ -122,6 +122,7 @@ int Jim_RegexpCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
int num_vars;
Jim_Obj *resultListObj = NULL;
int regcomp_flags = 0;
+ int eflags = 0;
if (argc < 3) {
wrongNumArgs:
@@ -212,7 +213,7 @@ int Jim_RegexpCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
}
next_match:
- match = regexec(regex, source_str, num_vars + 1, pmatch, 0);
+ match = regexec(regex, source_str, num_vars + 1, pmatch, eflags);
if (match >= REG_BADPAT) {
char buf[100];
@@ -284,7 +285,7 @@ int Jim_RegexpCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
}
try_next_match:
- if (opt_all && pattern[0] != '^' && *source_str) {
+ if (opt_all && (pattern[0] != '^' || (regcomp_flags & REG_NEWLINE)) && *source_str) {
if (pmatch[0].rm_eo) {
source_str += pmatch[0].rm_eo;
}
@@ -292,6 +293,7 @@ int Jim_RegexpCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
source_str++;
}
if (*source_str) {
+ eflags = REG_NOTBOL;
goto next_match;
}
}
@@ -412,7 +414,7 @@ int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
n = source_len - offset;
for (p = source_str + offset; n;) {
- int match = regexec(regex, p, MAX_SUB_MATCHES, pmatch, 0);
+ int match = regexec(regex, p, MAX_SUB_MATCHES, pmatch, p == source_str ? 0 : REG_NOTBOL);
if (match >= REG_BADPAT) {
char buf[100];