From: K.Kosako Date: Fri, 7 Jul 2017 04:31:25 +0000 (+0900) Subject: implement \N X-Git-Tag: v6.5.0^2~144 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=feddec11549e69eb0d34e8f891810ec25933e708;p=onig implement \N --- diff --git a/src/oniguruma.h b/src/oniguruma.h index a4a70ce..239dbbc 100644 --- a/src/oniguruma.h +++ b/src/oniguruma.h @@ -498,6 +498,7 @@ ONIG_EXTERN OnigSyntaxType* OnigDefaultSyntax; #define ONIG_SYN_OP2_INEFFECTIVE_ESCAPE (1U<<20) /* \ */ #define ONIG_SYN_OP2_QMARK_LPAREN_IF_ELSE (1U<<21) /* (?(n)) (?(...)...|...) */ #define ONIG_SYN_OP2_ESC_CAPITAL_R_GENERAL_NEWLINE (1U<<22) /* \R \r\n else [\x0a-\x0d] */ +#define ONIG_SYN_OP2_ESC_CAPITAL_N_NO_NEWLINE (1U<<23) /* \N [^\n] */ /* syntax (behavior) */ #define ONIG_SYN_CONTEXT_INDEP_ANCHORS (1U<<31) /* not implemented */ diff --git a/src/regparse.c b/src/regparse.c index 55aa3aa..09d5578 100644 --- a/src/regparse.c +++ b/src/regparse.c @@ -50,6 +50,7 @@ OnigSyntaxType OnigSyntaxRuby = { ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP | ONIG_SYN_OP2_ESC_K_NAMED_BACKREF | ONIG_SYN_OP2_QMARK_LPAREN_IF_ELSE | ONIG_SYN_OP2_ESC_CAPITAL_R_GENERAL_NEWLINE | + ONIG_SYN_OP2_ESC_CAPITAL_N_NO_NEWLINE | ONIG_SYN_OP2_ESC_G_SUBEXP_CALL | ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY | ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT | @@ -2323,7 +2324,27 @@ node_new_general_newline(Node** node, ScanEnv* env) return 0; } +static int +node_new_no_newline(Node** node, ScanEnv* env) +{ + Node* a; + Node* o; + OnigOptionType option = env->option; + + ONOFF(option, ONIG_OPTION_MULTILINE, 1); + a = node_new_ctype(CTYPE_ANYCHAR, 0); + CHECK_NULL_RETURN_MEMERR(a); + o = node_new_option(option); + if (IS_NULL(o)) { + onig_node_free(a); + return ONIGERR_MEMORY; + } + NODE_BODY(o) = a; + + *node = o; + return 0; +} enum TokenSyms { TK_EOT = 0, /* end of token */ @@ -2345,7 +2366,8 @@ enum TokenSyms { TK_CC_OPEN, TK_QUOTE_OPEN, TK_CHAR_PROPERTY, /* \p{...}, \P{...} */ - TK_GENERAL_NEWLINE, + TK_GENERAL_NEWLINE, /* \R */ + TK_NO_NEWLINE, /* \N */ /* in cc */ TK_CC_CLOSE, @@ -3498,6 +3520,11 @@ fetch_token(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env) tok->type = TK_GENERAL_NEWLINE; break; + case 'N': + if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_CAPITAL_N_NO_NEWLINE)) break; + tok->type = TK_NO_NEWLINE; + break; + case 'A': if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR)) break; begin_buf: @@ -5662,6 +5689,11 @@ parse_exp(Node** np, OnigToken* tok, int term, if (r < 0) return r; break; + case TK_NO_NEWLINE: + r = node_new_no_newline(np, env); + if (r < 0) return r; + break; + default: return ONIGERR_PARSER_BUG; break; diff --git a/src/regsyntax.c b/src/regsyntax.c index 7b658a6..ba93691 100644 --- a/src/regsyntax.c +++ b/src/regsyntax.c @@ -177,7 +177,8 @@ OnigSyntaxType OnigSyntaxPerl = { ONIG_SYN_OP2_QMARK_LPAREN_IF_ELSE | ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY | ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT | - ONIG_SYN_OP2_ESC_CAPITAL_R_GENERAL_NEWLINE ) + ONIG_SYN_OP2_ESC_CAPITAL_R_GENERAL_NEWLINE | + ONIG_SYN_OP2_ESC_CAPITAL_N_NO_NEWLINE ) , SYN_GNU_REGEX_BV , ONIG_OPTION_SINGLELINE , @@ -207,7 +208,8 @@ OnigSyntaxType OnigSyntaxPerl_NG = { ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP | ONIG_SYN_OP2_ESC_K_NAMED_BACKREF | ONIG_SYN_OP2_ESC_G_SUBEXP_CALL | - ONIG_SYN_OP2_ESC_CAPITAL_R_GENERAL_NEWLINE ) + ONIG_SYN_OP2_ESC_CAPITAL_R_GENERAL_NEWLINE | + ONIG_SYN_OP2_ESC_CAPITAL_N_NO_NEWLINE ) , ( SYN_GNU_REGEX_BV | ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP | ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME )