add GIMMICK_FAIL
authorK.Kosako <kosako@sofnec.co.jp>
Wed, 12 Jul 2017 02:40:40 +0000 (11:40 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Wed, 12 Jul 2017 02:40:40 +0000 (11:40 +0900)
src/regcomp.c
src/regparse.c
src/regparse.h

index 3540f83a4ce191d0616ab5026ca89cb25d44deea..edb374906d7dc500972896e6271c6b3c1b2e8d9e 100644 (file)
@@ -1687,6 +1687,10 @@ compile_gimmick_node(GimmickNode* node, regex_t* reg)
   int r;
 
   switch (node->type) {
+  case GIMMICK_FAIL:
+    r = add_opcode(reg, OP_FAIL);
+    break;
+
   case GIMMICK_KEEP:
     r = add_opcode(reg, OP_PUSH_SAVE_VAL);
     if (r != 0) return r;
@@ -1705,6 +1709,10 @@ compile_length_gimmick_node(GimmickNode* node, regex_t* reg)
   int len;
 
   switch (node->type) {
+  case GIMMICK_FAIL:
+    len = SIZE_OP_FAIL;
+    break;
+
   case GIMMICK_KEEP:
     len = SIZE_OP_PUSH_SAVE_VAL;
     break;
index 659acf241d86078607896cbec90737441b6d216b..565e03e69b5a237c46ddd8ee6699dd2922e12392 100644 (file)
@@ -1493,6 +1493,19 @@ node_new_option(OnigOptionType option)
   return node;
 }
 
+/* Used in absent group
+static int
+node_new_fail(Node** node, ScanEnv* env)
+{
+  *node = node_new();
+  CHECK_NULL_RETURN_MEMERR(*node);
+
+  NODE_SET_TYPE(*node, NODE_GIMMICK);
+  GIMMICK_(*node)->type = GIMMICK_FAIL;
+  return ONIG_NORMAL;
+}
+*/
+
 static int
 node_new_keep(Node** node, ScanEnv* env)
 {
index b2baf6224affbb50e8a97635bc9734d42fe82f9f..5374cbe6f590ef1aef2e8f6a3bbebb36219b2b5e 100644 (file)
@@ -47,7 +47,8 @@ typedef enum {
 } NodeType;
 
 enum GimmickType {
-  GIMMICK_KEEP = 0,
+  GIMMICK_FAIL = 0,
+  GIMMICK_KEEP = 1,
 };
 
 /* node type bit */