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;
break;
case GIMMICK_KEEP:
+ case GIMMICK_SAVE:
len = SIZE_OP_PUSH_SAVE_VAL;
break;
}
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;
}
{
int nid = env->save_num;
+#if 0
if (IS_NULL(env->saves)) {
int n = 10;
env->saves = (SaveItem* )xmalloc(sizeof(SaveItem) * n);
}
env->saves[nid].type = type;
+#endif
env->save_num++;
*id = nid;
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)
{