]> granicus.if.org Git - onig/commitdiff
add node_new_save_gimmick()
authorK.Kosako <kosako@sofnec.co.jp>
Wed, 12 Jul 2017 04:57:30 +0000 (13:57 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Wed, 12 Jul 2017 04:57:30 +0000 (13:57 +0900)
src/regcomp.c
src/regexec.c
src/regint.h
src/regparse.c
src/regparse.h

index edb374906d7dc500972896e6271c6b3c1b2e8d9e..1f535110529d653c7ae7ba2f35c6166a8e68c7c1 100644 (file)
@@ -1698,6 +1698,14 @@ compile_gimmick_node(GimmickNode* node, regex_t* reg)
     if (r != 0) return r;
     r = add_mem_num(reg, node->id);
     break;
+
+  case GIMMICK_SAVE:
+    r = add_opcode(reg, OP_PUSH_SAVE_VAL);
+    if (r != 0) return r;
+    r = add_save_type(reg, node->detail_type);
+    if (r != 0) return r;
+    r = add_mem_num(reg, node->id);
+    break;
   }
 
   return r;
@@ -1714,6 +1722,7 @@ compile_length_gimmick_node(GimmickNode* node, regex_t* reg)
     break;
 
   case GIMMICK_KEEP:
+  case GIMMICK_SAVE:
     len = SIZE_OP_PUSH_SAVE_VAL;
     break;
   }
index 956dac6fab57ccf597c4f3c8bb338c59624ee95d..b0c8fd8cf62539800919a4ca86b709725674de97 100644 (file)
@@ -2887,6 +2887,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
         GET_MEMNUM_INC(mem, p); /* mem: save id */
         switch ((enum SaveType )type) {
         case SAVE_KEEP:
+        case SAVE_RIGHT_RANGE:
           STACK_PUSH_SAVE_VAL(mem, type, s);
           break;
         }
index 3a02599bc9281e828afa547c56122f9a596a57d2..348229b5206fa28e4c7c9148d076d167ce9f08f8 100644 (file)
@@ -549,7 +549,8 @@ enum OpCode {
 };
 
 enum SaveType {
-  SAVE_KEEP  = 0,
+  SAVE_KEEP = 0,
+  SAVE_RIGHT_RANGE = 1,
 };
 
 enum UpdateVarType {
index 565e03e69b5a237c46ddd8ee6699dd2922e12392..f92f425bb113c3fc11c4381c17331ce715ca127e 100644 (file)
@@ -313,6 +313,7 @@ save_entry(ScanEnv* env, enum SaveType type, int* id)
 {
   int nid = env->save_num;
 
+#if 0
   if (IS_NULL(env->saves)) {
     int n = 10;
     env->saves = (SaveItem* )xmalloc(sizeof(SaveItem) * n);
@@ -328,6 +329,7 @@ save_entry(ScanEnv* env, enum SaveType type, int* id)
   }
 
   env->saves[nid].type = type;
+#endif
 
   env->save_num++;
   *id = nid;
@@ -1526,6 +1528,26 @@ node_new_keep(Node** node, ScanEnv* env)
   return ONIG_NORMAL;
 }
 
+static int
+node_new_save_gimmick(Node** node, ScanEnv* env)
+{
+  int id;
+  int r;
+
+  r = save_entry(env, SAVE_RIGHT_RANGE, &id);
+  if (r != ONIG_NORMAL) return r;
+
+  *node = node_new();
+  CHECK_NULL_RETURN_MEMERR(*node);
+
+  NODE_SET_TYPE(*node, NODE_GIMMICK);
+  GIMMICK_(*node)->id   = id;
+  GIMMICK_(*node)->type = GIMMICK_SAVE;
+  GIMMICK_(*node)->detail_type = SAVE_RIGHT_RANGE;
+
+  return ONIG_NORMAL;
+}
+
 extern int
 onig_node_str_cat(Node* node, const UChar* s, const UChar* end)
 {
index 5374cbe6f590ef1aef2e8f6a3bbebb36219b2b5e..eb70988785f20f1228b484cf99511246178853c2 100644 (file)
@@ -49,6 +49,7 @@ typedef enum {
 enum GimmickType {
   GIMMICK_FAIL = 0,
   GIMMICK_KEEP = 1,
+  GIMMICK_SAVE = 2,
 };
 
 /* node type bit */
@@ -318,8 +319,9 @@ typedef struct {
   NodeType node_type;
   int status;
 
-  int id;
   enum GimmickType type;
+  int  detail_type;
+  int  id;
 } GimmickNode;
 
 typedef struct _Node {