+ upd: current Oniguruma development stage

This commit is contained in:
Rainer Kottenhoff 2020-06-01 19:36:46 +02:00
parent 42e23dfb66
commit fb66caacd8
6 changed files with 101 additions and 37 deletions

View File

@ -18,7 +18,7 @@ LINKFLAGS = -link -incremental:no -pdb:none
INSTALL = install -c
CP = copy
CC = cl
DEFS = -DHAVE_CONFIG_H -DUSE_POSIX_API_REGION_OPTION
DEFS = -DHAVE_CONFIG_H -DUSE_POSIX_API
subdirs =

View File

@ -4,6 +4,8 @@
#ifndef _ONIGURUMA_CONFIG_H_
#define _ONIGURUMA_CONFIG_H_
#define USE_POSIX_API 1
#define STDC_HEADERS 1
#define HAVE_SYS_TYPES_H 1
#define HAVE_SYS_STAT_H 1
@ -96,6 +98,4 @@
#define DLEXT ".so"
#define DLEXT2 ".dll"
#define USE_POSIX_API_REGION_OPTION 1
#endif //_ONIGURUMA_CONFIG_H_

View File

@ -7700,7 +7700,7 @@ node_detect_can_be_very_slow(Node* node)
#ifdef USE_BACKREF_WITH_LEVEL
case NODE_BACKREF:
if (NODE_IS_CHECKER(node) && NODE_IS_NEST_LEVEL(node))
if (NODE_IS_NEST_LEVEL(node))
r = 1;
else
r = 0;
@ -7921,6 +7921,11 @@ print_indent_tree(FILE* f, Node* node, int indent)
if (i > 0) fputs(", ", f);
fprintf(f, "%d", p[i]);
}
#ifdef USE_BACKREF_WITH_LEVEL
if (NODE_IS_NEST_LEVEL(node)) {
fprintf(f, ", level: %d", br->nest_level);
}
#endif
}
break;

View File

@ -2953,7 +2953,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
if (region) {
if (keep > s) keep = s;
#ifdef USE_POSIX_API_REGION_OPTION
#ifdef USE_POSIX_API
if (OPTON_POSIX_REGION(msa->options)) {
posix_regmatch_t* rmt = (posix_regmatch_t* )region;
@ -2970,7 +2970,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
}
}
else {
#endif /* USE_POSIX_API_REGION_OPTION */
#endif /* USE_POSIX_API */
region->beg[0] = (int )(keep - str);
region->end[0] = (int )(s - str);
for (i = 1; i <= num_mem; i++) {
@ -3007,7 +3007,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
if (r < 0) MATCH_AT_ERROR_RETURN(r);
}
#endif /* USE_CAPTURE_HISTORY */
#ifdef USE_POSIX_API_REGION_OPTION
#ifdef USE_POSIX_API
} /* else OPTON_POSIX_REGION() */
#endif
} /* if (region) */
@ -4980,14 +4980,14 @@ onig_match_with_param(regex_t* reg, const UChar* str, const UChar* end,
UChar *prev;
MatchArg msa;
#ifndef USE_POSIX_API_REGION_OPTION
#ifndef USE_POSIX_API
if (OPTON_POSIX_REGION(option)) return ONIGERR_INVALID_ARGUMENT;
#endif
ADJUST_MATCH_PARAM(reg, mp);
MATCH_ARG_INIT(msa, reg, option, region, at, mp);
if (region
#ifdef USE_POSIX_API_REGION_OPTION
#ifdef USE_POSIX_API
&& !OPTON_POSIX_REGION(option)
#endif
) {
@ -5300,7 +5300,7 @@ search_in_range(regex_t* reg, const UChar* str, const UChar* end,
ADJUST_MATCH_PARAM(reg, mp);
#ifndef USE_POSIX_API_REGION_OPTION
#ifndef USE_POSIX_API
if (OPTON_POSIX_REGION(option)) {
r = ONIGERR_INVALID_ARGUMENT;
goto finish_no_msa;
@ -5308,7 +5308,7 @@ search_in_range(regex_t* reg, const UChar* str, const UChar* end,
#endif
if (region
#ifdef USE_POSIX_API_REGION_OPTION
#ifdef USE_POSIX_API
&& ! OPTON_POSIX_REGION(option)
#endif
) {
@ -5608,7 +5608,7 @@ search_in_range(regex_t* reg, const UChar* str, const UChar* end,
/* If result is mismatch and no FIND_NOT_EMPTY option,
then the region is not set in match_at(). */
if (OPTON_FIND_NOT_EMPTY(reg->options) && region
#ifdef USE_POSIX_API_REGION_OPTION
#ifdef USE_POSIX_API
&& !OPTON_POSIX_REGION(option)
#endif
) {

View File

@ -83,7 +83,7 @@
/* #define USE_REPEAT_AND_EMPTY_CHECK_LOCAL_VAR */
/* enabled by configure --enable-posix-api=yes */
/* #define USE_POSIX_API_REGION_OPTION */
/* #define USE_POSIX_API */
#define INIT_MATCH_STACK_SIZE 160
#define DEFAULT_MATCH_STACK_LIMIT_SIZE 0 /* unlimited */

View File

@ -304,6 +304,8 @@ static int
backref_rel_to_abs(int rel_no, ScanEnv* env)
{
if (rel_no > 0) {
if (rel_no > ONIG_INT_MAX - env->num_mem)
return ONIGERR_INVALID_BACKREF;
return env->num_mem + rel_no;
}
else {
@ -7153,6 +7155,23 @@ parse_long(OnigEncoding enc, UChar* s, UChar* end, int sign_on, long max, long*
return ONIG_NORMAL;
}
static void
clear_callout_args(int n, unsigned int types[], OnigValue vals[])
{
int i;
for (i = 0; i < n; i++) {
switch (types[i]) {
case ONIG_TYPE_STRING:
if (IS_NOT_NULL(vals[i].s.start))
xfree(vals[i].s.start);
break;
default:
break;
}
}
}
static int
parse_callout_args(int skip_mode, int cterm, UChar** src, UChar* end,
int max_arg_num, unsigned int types[], OnigValue vals[],
@ -7184,7 +7203,10 @@ parse_callout_args(int skip_mode, int cterm, UChar** src, UChar* end,
bufend = buf;
s = e = p;
while (1) {
if (PEND) return ONIGERR_INVALID_CALLOUT_PATTERN;
if (PEND) {
r = ONIGERR_INVALID_CALLOUT_PATTERN;
goto err_clear;
}
e = p;
PFETCH_S(c);
@ -7212,8 +7234,10 @@ parse_callout_args(int skip_mode, int cterm, UChar** src, UChar* end,
add_char:
if (skip_mode == FALSE) {
clen = p - e;
if (bufend + clen > buf + MAX_CALLOUT_ARG_BYTE_LENGTH)
return ONIGERR_INVALID_CALLOUT_ARG; /* too long argument */
if (bufend + clen > buf + MAX_CALLOUT_ARG_BYTE_LENGTH) {
r = ONIGERR_INVALID_CALLOUT_ARG; /* too long argument */
goto err_clear;
}
xmemcpy(bufend, e, clen);
bufend += clen;
@ -7224,8 +7248,10 @@ parse_callout_args(int skip_mode, int cterm, UChar** src, UChar* end,
}
if (cn != 0) {
if (max_arg_num >= 0 && n >= max_arg_num)
return ONIGERR_INVALID_CALLOUT_ARG;
if (max_arg_num >= 0 && n >= max_arg_num) {
r = ONIGERR_INVALID_CALLOUT_ARG;
goto err_clear;
}
if (skip_mode == FALSE) {
if ((types[n] & ONIG_TYPE_LONG) != 0) {
@ -7242,8 +7268,10 @@ parse_callout_args(int skip_mode, int cterm, UChar** src, UChar* end,
if (fixed == 0) {
types[n] = (types[n] & ~ONIG_TYPE_LONG);
if (types[n] == ONIG_TYPE_VOID)
return ONIGERR_INVALID_CALLOUT_ARG;
if (types[n] == ONIG_TYPE_VOID) {
r = ONIGERR_INVALID_CALLOUT_ARG;
goto err_clear;
}
}
}
@ -7252,22 +7280,29 @@ parse_callout_args(int skip_mode, int cterm, UChar** src, UChar* end,
break;
case ONIG_TYPE_CHAR:
if (cn != 1) return ONIGERR_INVALID_CALLOUT_ARG;
if (cn != 1) {
r = ONIGERR_INVALID_CALLOUT_ARG;
goto err_clear;
}
vals[n].c = ONIGENC_MBC_TO_CODE(enc, buf, bufend);
break;
case ONIG_TYPE_STRING:
{
UChar* rs = onigenc_strdup(enc, buf, bufend);
CHECK_NULL_RETURN_MEMERR(rs);
if (IS_NULL(rs)) {
r = ONIGERR_MEMORY; goto err_clear;
}
vals[n].s.start = rs;
vals[n].s.end = rs + (e - s);
}
break;
case ONIG_TYPE_TAG:
if (eesc != 0 || ! is_allowed_callout_tag_name(enc, s, e))
return ONIGERR_INVALID_CALLOUT_TAG_NAME;
if (eesc != 0 || ! is_allowed_callout_tag_name(enc, s, e)) {
r = ONIGERR_INVALID_CALLOUT_TAG_NAME;
goto err_clear;
}
vals[n].s.start = s;
vals[n].s.end = e;
@ -7275,7 +7310,8 @@ parse_callout_args(int skip_mode, int cterm, UChar** src, UChar* end,
case ONIG_TYPE_VOID:
case ONIG_TYPE_POINTER:
return ONIGERR_PARSER_BUG;
r = ONIGERR_PARSER_BUG;
goto err_clear;
break;
}
}
@ -7286,10 +7322,18 @@ parse_callout_args(int skip_mode, int cterm, UChar** src, UChar* end,
if (c == cterm) break;
}
if (c != cterm) return ONIGERR_INVALID_CALLOUT_PATTERN;
if (c != cterm) {
r = ONIGERR_INVALID_CALLOUT_PATTERN;
goto err_clear;
}
*src = p;
return n;
err_clear:
if (skip_mode == FALSE)
clear_callout_args(n, types, vals);
return r;
}
/* (*name[TAG]) (*name[TAG]{a,b,..}) */
@ -7376,7 +7420,10 @@ parse_callout_of_name(Node** np, int cterm, UChar** src, UChar* end, ScanEnv* en
arg_num = parse_callout_args(FALSE, '}', &p, end, max_arg_num, types, vals, env);
if (arg_num < 0) return arg_num;
if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;
if (PEND) {
r = ONIGERR_END_PATTERN_IN_GROUP;
goto err_clear;
}
PFETCH_S(c);
}
else {
@ -7395,32 +7442,40 @@ parse_callout_of_name(Node** np, int cterm, UChar** src, UChar* end, ScanEnv* en
in = onig_get_callout_in_by_name_id(name_id);
opt_arg_num = get_callout_opt_arg_num_by_name_id(name_id);
if (arg_num > max_arg_num || arg_num < (max_arg_num - opt_arg_num))
return ONIGERR_INVALID_CALLOUT_ARG;
if (arg_num > max_arg_num || arg_num < (max_arg_num - opt_arg_num)) {
r = ONIGERR_INVALID_CALLOUT_ARG;
goto err_clear;
}
if (c != cterm)
return ONIGERR_INVALID_CALLOUT_PATTERN;
if (c != cterm) {
r = ONIGERR_INVALID_CALLOUT_PATTERN;
goto err_clear;
}
r = reg_callout_list_entry(env, &num);
if (r != 0) return r;
if (r != 0) goto err_clear;
ext = onig_get_regex_ext(env->reg);
CHECK_NULL_RETURN_MEMERR(ext);
if (IS_NULL(ext)) {
r = ONIGERR_MEMORY; goto err_clear;
}
if (IS_NULL(ext->pattern)) {
r = onig_ext_set_pattern(env->reg, env->pattern, env->pattern_end);
if (r != ONIG_NORMAL) return r;
if (r != ONIG_NORMAL) goto err_clear;
}
if (tag_start != tag_end) {
r = callout_tag_entry(env, env->reg, tag_start, tag_end, num);
if (r != ONIG_NORMAL) return r;
if (r != ONIG_NORMAL) goto err_clear;
}
r = node_new_callout(&node, ONIG_CALLOUT_OF_NAME, num, name_id, env);
if (r != ONIG_NORMAL) return r;
if (r != ONIG_NORMAL) goto err_clear;
e = onig_reg_callout_list_at(env->reg, num);
CHECK_NULL_RETURN_MEMERR(e);
if (IS_NULL(e)) {
r = ONIGERR_MEMORY; goto err_clear;
}
e->of = ONIG_CALLOUT_OF_NAME;
e->in = in;
@ -7441,6 +7496,10 @@ parse_callout_of_name(Node** np, int cterm, UChar** src, UChar* end, ScanEnv* en
*np = node;
*src = p;
return 0;
err_clear:
clear_callout_args(arg_num, types, vals);
return r;
}
#endif