From 6b1c6e0e55707c78f7dba05e3f005269aa78fa3f Mon Sep 17 00:00:00 2001 From: naruse Date: Sat, 11 Feb 2017 15:08:33 +0000 Subject: Merge Onigmo 6.1.1 * Support absent operator https://github.com/k-takata/Onigmo/issues/82 * https://github.com/k-takata/Onigmo/blob/Onigmo-6.1.1/HISTORY git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57603 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- regparse.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) (limited to 'regparse.c') diff --git a/regparse.c b/regparse.c index 204aa46ce9..a2d2fcf6a7 100644 --- a/regparse.c +++ b/regparse.c @@ -58,7 +58,8 @@ const OnigSyntaxType OnigSyntaxRuby = { ONIG_SYN_OP2_ESC_CAPITAL_X_EXTENDED_GRAPHEME_CLUSTER | ONIG_SYN_OP2_QMARK_LPAREN_CONDITION | ONIG_SYN_OP2_ESC_CAPITAL_R_LINEBREAK | - ONIG_SYN_OP2_ESC_CAPITAL_K_KEEP ) + ONIG_SYN_OP2_ESC_CAPITAL_K_KEEP | + ONIG_SYN_OP2_QMARK_TILDE_ABSENT ) , ( SYN_GNU_REGEX_BV | ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV | ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND | @@ -1024,14 +1025,15 @@ scan_env_add_mem_entry(ScanEnv* env) if (IS_NULL(env->mem_nodes_dynamic)) { alloc = INIT_SCANENV_MEMNODES_ALLOC_SIZE; p = (Node** )xmalloc(sizeof(Node*) * alloc); + CHECK_NULL_RETURN_MEMERR(p); xmemcpy(p, env->mem_nodes_static, sizeof(Node*) * SCANENV_MEMNODES_SIZE); } else { alloc = env->mem_alloc * 2; p = (Node** )xrealloc(env->mem_nodes_dynamic, sizeof(Node*) * alloc); + CHECK_NULL_RETURN_MEMERR(p); } - CHECK_NULL_RETURN_MEMERR(p); for (i = env->num_mem + 1; i < alloc; i++) p[i] = NULL_NODE; @@ -3176,7 +3178,7 @@ fetch_token_in_cc(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env) PUNFETCH; num = fetch_escaped_value(&p, end, env, &c2); if (num < 0) return num; - if ((OnigCodePoint)tok->u.c != c2) { + if ((OnigCodePoint )tok->u.c != c2) { tok->u.code = (OnigCodePoint )c2; tok->type = TK_CODE_POINT; } @@ -3780,7 +3782,7 @@ fetch_token(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env) num = fetch_escaped_value(&p, end, env, &c2); if (num < 0) return num; /* set_raw: */ - if ((OnigCodePoint)tok->u.c != c2) { + if ((OnigCodePoint )tok->u.c != c2) { tok->type = TK_CODE_POINT; tok->u.code = (OnigCodePoint )c2; } @@ -4989,6 +4991,14 @@ parse_enclose(Node** np, OnigToken* tok, int term, UChar** src, UChar* end, case '>': /* (?>...) stop backtrack */ *np = node_new_enclose(ENCLOSE_STOP_BACKTRACK); break; + case '~': /* (?~...) absent operator */ + if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_TILDE_ABSENT)) { + *np = node_new_enclose(ENCLOSE_ABSENT); + } + else { + return ONIGERR_UNDEFINED_GROUP_OPTION; + } + break; #ifdef USE_NAMED_GROUP case '\'': @@ -5030,7 +5040,9 @@ parse_enclose(Node** np, OnigToken* tok, int term, UChar** src, UChar* end, named_group1: list_capture = 0; +# ifdef USE_CAPTURE_HISTORY named_group2: +# endif name = p; r = fetch_name((OnigCodePoint )c, &p, end, &name_end, env, &num, 0); if (r < 0) return r; @@ -5060,9 +5072,10 @@ parse_enclose(Node** np, OnigToken* tok, int term, UChar** src, UChar* end, #endif break; +#ifdef USE_CAPTURE_HISTORY case '@': if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY)) { -#ifdef USE_NAMED_GROUP +# ifdef USE_NAMED_GROUP if (!PEND && IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP)) { PFETCH(c); @@ -5072,7 +5085,7 @@ parse_enclose(Node** np, OnigToken* tok, int term, UChar** src, UChar* end, } PUNFETCH; } -#endif +# endif *np = node_new_enclose_memory(env->option, 0); CHECK_NULL_RETURN_MEMERR(*np); num = scan_env_add_mem_entry(env); @@ -5087,6 +5100,7 @@ parse_enclose(Node** np, OnigToken* tok, int term, UChar** src, UChar* end, return ONIGERR_UNDEFINED_GROUP_OPTION; } break; +#endif /* USE_CAPTURE_HISTORY */ case '(': /* conditional expression: (?(cond)yes), (?(cond)yes|no) */ if (!PEND && -- cgit v1.2.3