summaryrefslogtreecommitdiff
path: root/regexec.c
diff options
context:
space:
mode:
authorksaito <ksaito@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-04-27 15:53:16 +0000
committerksaito <ksaito@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-04-27 15:53:16 +0000
commit653fbad62809d98e01a9bf70e7c6f69fbbc5b524 (patch)
tree9592a64a95b8b03df005c11a97016e4512d3706e /regexec.c
parent315b3e19061212fa96e98d291ad7f2b5fc090446 (diff)
downloadruby-653fbad62809d98e01a9bf70e7c6f69fbbc5b524.tar.gz
This commit was generated by cvs2svn to compensate for changes in r6225,
which included commits to RCS files with non-trunk default branches. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6226 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'regexec.c')
-rw-r--r--regexec.c57
1 files changed, 35 insertions, 22 deletions
diff --git a/regexec.c b/regexec.c
index 870a6535bd..1bae0d9516 100644
--- a/regexec.c
+++ b/regexec.c
@@ -362,11 +362,26 @@ typedef struct {
};\
} while(0)
+static unsigned int MatchStackLimitSize = DEFAULT_MATCH_STACK_LIMIT_SIZE;
+
+extern unsigned int
+onig_get_match_stack_limit_size(void)
+{
+ return MatchStackLimitSize;
+}
+
+extern int
+onig_set_match_stack_limit_size(unsigned int size)
+{
+ MatchStackLimitSize = size;
+ return 0;
+}
+
static int
stack_double(StackType** arg_stk_base, StackType** arg_stk_end,
StackType** arg_stk, StackType* stk_alloc, MatchArg* msa)
{
- int n;
+ unsigned int n;
StackType *x, *stk_base, *stk_end, *stk;
stk_base = *arg_stk_base;
@@ -385,7 +400,12 @@ stack_double(StackType** arg_stk_base, StackType** arg_stk_end,
}
else {
n *= 2;
- if (n > MATCH_STACK_LIMIT_SIZE) return ONIGERR_MATCH_STACK_LIMIT_OVER;
+ if (MatchStackLimitSize != 0 && n > MatchStackLimitSize) {
+ if ((unsigned int )(stk_end - stk_base) == MatchStackLimitSize)
+ return ONIGERR_MATCH_STACK_LIMIT_OVER;
+ else
+ n = MatchStackLimitSize;
+ }
x = (StackType* )xrealloc(stk_base, sizeof(StackType) * n);
if (IS_NULL(x)) {
STACK_SAVE;
@@ -1171,10 +1191,9 @@ match_at(regex_t* reg, UChar* str, UChar* end, UChar* sstart,
goto fail; /* for retry */
}
}
- else {
- /* default behavior: return first-matching result. */
- goto finish;
- }
+
+ /* default behavior: return first-matching result. */
+ goto finish;
break;
case OP_EXACT1: STAT_OP_IN(OP_EXACT1);
@@ -2574,11 +2593,13 @@ bm_search_notrev(regex_t* reg, UChar* target, UChar* target_end,
if (t < target) return p + 1;
skip = reg->map[*s];
- p++;
+ p = s + 1;
+ if (p >= text_end) return (UChar* )NULL;
t = p;
- while ((p - t) < skip) {
+ do {
p += enc_len(reg->enc, *p);
- }
+ } while ((p - t) < skip && p < text_end);
+
s += (p - t);
}
}
@@ -2592,11 +2613,13 @@ bm_search_notrev(regex_t* reg, UChar* target, UChar* target_end,
if (t < target) return p + 1;
skip = reg->int_map[*s];
- p++;
+ p = s + 1;
+ if (p >= text_end) return (UChar* )NULL;
t = p;
- while ((p - t) < skip) {
+ do {
p += enc_len(reg->enc, *p);
- }
+ } while ((p - t) < skip && p < text_end);
+
s += (p - t);
}
}
@@ -3288,13 +3311,3 @@ onig_get_syntax(regex_t* reg)
{
return reg->syntax;
}
-
-extern const char*
-onig_version(void)
-{
-#define MSTR(a) # a
-
- return (MSTR(ONIGURUMA_VERSION_MAJOR) "."
- MSTR(ONIGURUMA_VERSION_MINOR) "."
- MSTR(ONIGURUMA_VERSION_TEENY));
-}