]> granicus.if.org Git - onig/commitdiff
implement \N
authorK.Kosako <kosako@sofnec.co.jp>
Fri, 7 Jul 2017 04:31:25 +0000 (13:31 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Fri, 7 Jul 2017 04:31:25 +0000 (13:31 +0900)
src/oniguruma.h
src/regparse.c
src/regsyntax.c

index a4a70ceb106d343d8b7c2bb1c9b3cdd074d99483..239dbbc4ed34b94164271c306cd2842e5418fe0e 100644 (file)
@@ -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 */
index 55aa3aa8d78ebf2e9dbe4314dbb85fcae781df4f..09d55786eac033ffafbb63cdf9576f4fcf393de5 100644 (file)
@@ -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;
index 7b658a6ca35e341f09c66dafef7f7bceea97a913..ba93691de46429dba8467e5d1c7e7f1f20a95a08 100644 (file)
@@ -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 )