summaryrefslogtreecommitdiff
path: root/harnesses/base.c
diff options
context:
space:
mode:
Diffstat (limited to 'harnesses/base.c')
-rw-r--r--harnesses/base.c45
1 files changed, 36 insertions, 9 deletions
diff --git a/harnesses/base.c b/harnesses/base.c
index 70f98f7..78a157a 100644
--- a/harnesses/base.c
+++ b/harnesses/base.c
@@ -148,6 +148,8 @@ dump_data(FILE* fp, unsigned char* data, int len)
if (isprint((int )c)) {
if (c == '\\')
fprintf(fp, " '\\\\'");
+ else if (c == '\'')
+ fprintf(fp, " '\\''");
else
fprintf(fp, " '%c'", c);
}
@@ -199,6 +201,38 @@ each_match_callback_func(const UChar* str, const UChar* end,
return ONIG_NORMAL;
}
+static unsigned int calc_retry_limit(sl, len)
+{
+ unsigned int r;
+ unsigned int upper;
+ int heavy;
+
+ heavy = sl >> 8;
+ sl &= 0xff;
+ sl += heavy;
+
+ upper = BASE_RETRY_LIMIT;
+ if (sl == 2) {
+ upper = SLOW_RETRY_LIMIT;
+ }
+ else if (sl > 2) {
+ upper = SLOW_RETRY_LIMIT * 3 / sl;
+ if (upper <= 10) upper = 10;
+ }
+
+ if (len < BASE_LENGTH) {
+ r = BASE_RETRY_LIMIT;
+ }
+ else {
+ r = BASE_RETRY_LIMIT * BASE_LENGTH / len;
+ }
+
+ if (r > upper)
+ r = upper;
+
+ return r;
+}
+
static int
search(regex_t* reg, unsigned char* str, unsigned char* end, OnigOptionType options, int backward, int sl)
{
@@ -211,14 +245,7 @@ search(regex_t* reg, unsigned char* str, unsigned char* end, OnigOptionType opti
region = onig_region_new();
len = (size_t )(end - str);
- if (len < BASE_LENGTH) {
- if (sl >= 2)
- retry_limit = (unsigned int )SLOW_RETRY_LIMIT;
- else
- retry_limit = (unsigned int )BASE_RETRY_LIMIT;
- }
- else
- retry_limit = (unsigned int )(BASE_RETRY_LIMIT * BASE_LENGTH / len);
+ retry_limit = calc_retry_limit(sl, len);
#ifdef STANDALONE
fprintf(stdout, "retry limit: %u\n", retry_limit);
@@ -376,7 +403,7 @@ alloc_exec(OnigEncoding enc, OnigOptionType options, OnigSyntaxType* syntax,
fprintf(stdout, "sl: %d\n", sl);
#endif
if (sl > 0) {
- if (sl >= 100) {
+ if (sl >= 256) { // 256: exists heavy element
if (rem_size > MAX_SLOW_REM_SIZE2)
rem_size = MAX_SLOW_REM_SIZE2;
}