return ONIG_NORMAL;
}
-#if 0
-static int
-node_is_include_enclosure_memory(Node* node)
-{
- int t;
- int r = 0;
-
- switch (NODE_TYPE(node)) {
- case NODE_LIST:
- case NODE_ALT:
- do {
- t = node_is_include_enclosure_memory(NODE_CAR(node));
- if (t != 0) return t;
- } while (IS_NOT_NULL(node = NODE_CDR(node)));
- break;
-
- case NODE_QUANT:
- r = node_is_include_enclosure_memory(NODE_BODY(node));
- break;
-
- case NODE_ENCLOSURE:
- {
- EnclosureNode* en = ENCLOSURE_(node);
- switch (en->type) {
- case ENCLOSURE_MEMORY:
- return 1;
- break;
-
- case ENCLOSURE_OPTION:
- case ENCLOSURE_STOP_BACKTRACK:
- r = node_is_include_enclosure_memory(NODE_BODY(node));
- break;
- case ENCLOSURE_IF_ELSE:
- r = node_is_include_enclosure_memory(NODE_BODY(node));
- if (r != 0) return r;
-
- if (IS_NOT_NULL(en->te.Then)) {
- r = node_is_include_enclosure_memory(en->te.Then);
- if (r != 0) return r;
- }
- if (IS_NOT_NULL(en->te.Else)) {
- r = node_is_include_enclosure_memory(en->te.Else);
- if (r != 0) return r;
- }
- break;
- }
- }
- break;
-
-#ifdef USE_CALL
- case NODE_CALL:
- /* fall */
-#endif
- default:
- break;
- }
-
- return r;
-}
-
-static int
-make_fail_with_after(Node** rnode, ScanEnv* env, int num, Node* ns[])
-{
- int r;
- int i;
- int n;
- int* used;
- Node** us;
- Node* f;
- Node* x;
-
- *rnode = NULL_NODE;
- r = node_new_fail(&f, env);
- if (r != 0) return r;
-
- if (num <= 0) {
- *rnode = f;
- return ONIG_NORMAL;
- }
-
- us = (Node** )xmalloc(sizeof(*us) * (num + 1));
- if (IS_NULL(us)) {
- onig_node_free(f);
- return ONIGERR_MEMORY;
- }
-
- used = (int* )xmalloc(sizeof(*used) * num);
- if (IS_NULL(used)) goto err1;
- for (i = 0; i < num; i++) used[i] = 0;
-
- n = 0;
- us[n++] = f;
- for (i = 0; i < num; i++) {
- if (node_is_include_enclosure_memory(ns[i])) {
- us[n++] = ns[i];
- used[i] = 1;
- }
- }
-
- if (n == 1) {
- *rnode = f;
- goto end;
- }
-
- x = make_list(n, us);
- if (IS_NULL(x)) {
- xfree(used);
- err1:
- xfree(us);
- onig_node_free(f);
- return ONIGERR_MEMORY;
- }
-
- *rnode = x;
- end:
- for (i = 0; i < num; i++) {
- if (used[i] == 0) onig_node_free(ns[i]);
- }
-
- xfree(used);
- xfree(us);
- return ONIG_NORMAL;
-}
-
-static int
-make_absent_group_repeated_body_tree(Node** node,
- Node* absent_body, Node* step_body,
- ScanEnv* env, int* rid)
-{
- int i;
- int r;
- int id;
- Node* top;
- Node* ns1[3];
- Node* ns2[2];
-
- *node = NULL_NODE;
-
- for (i = 0; i < 3; i++) ns1[i] = NULL_NODE;
- for (i = 0; i < 2; i++) ns2[i] = NULL_NODE;
-
- ns1[0] = absent_body;
- ns2[1] = step_body;
-
- r = node_new_update_var_gimmick(&ns1[1], UPDATE_VAR_RIGHT_RANGE_SPREV, 0, env);
- if (r != 0) goto err;
- *rid = id = GIMMICK_(ns1[1])->id;
-
- r = node_new_fail(&ns1[2], env);
- if (r != 0) goto err;
-
- ns2[0] = make_list(3, ns1 + 0);
- if (IS_NULL(ns2[0])) goto err;
- for (i = 0; i < 3; i++) ns1[i] = NULL_NODE;
-
- top = make_alt(2, ns2 + 0);
- if (IS_NULL(top)) goto err;
-
- *node = top;
- return ONIG_NORMAL;
-
- err:
- for (i = 0; i < 3; i++) onig_node_free(ns1[i]);
- for (i = 0; i < 2; i++) onig_node_free(ns2[i]);
- return ONIGERR_MEMORY;
-}
-
-static int
-make_absent_group_restore_fail_for_lower_no_zero(Node** node, Node* repeat_line,
- int id, ScanEnv* env)
-{
- int r;
- Node* restore;
- Node* alt;
- Node* ns[2];
-
- restore = NULL_NODE;
- ns[0] = ns[1] = NULL_NODE;
- r = node_new_update_var_gimmick(&ns[0],
- UPDATE_VAR_RIGHT_RANGE_FROM_STACK, id, env);
- if (r != 0) goto err;
-
- r = node_new_fail(&ns[1], env);
- if (r != 0) goto err;
-
- restore = make_list(2, ns);
- if (IS_NULL(restore)) {
- r = ONIGERR_MEMORY;
- goto err;
- }
-
- ns[0] = repeat_line;
- ns[1] = restore;
- alt = make_alt(2, ns);
- if (IS_NULL(alt)) {
- r = ONIGERR_MEMORY;
- goto err1;
- }
- *node = alt;
- return ONIG_NORMAL;
-
- err:
- onig_node_free(ns[0]);
- onig_node_free(ns[1]);
- err1:
- onig_node_free(restore);
- return r;
-}
-
-static int
-make_absent_group_tree(Node** node, Node* absent_body,
- Node* generator, ScanEnv* env)
-{
- int r;
- int invalid_node;
- int lower;
- int id;
- OnigLen min_len;
- Node* top;
- Node* repeat;
- Node* step_body;
- Node* repeat_body;
- Node* stop_bt;
- Node* save;
- Node* update;
- Node* ns[3];
-
- *node = NULL_NODE;
- update = stop_bt = save = repeat_body = repeat = step_body = NULL_NODE;
-
- r = ONIGERR_MEMORY;
- if (IS_NULL(generator)) {
- /* default generator */
-#if 1
- r = node_new_true_anychar(&step_body, env);
- if (r != 0) goto err1;
-#else
- step_body = node_new_anychar();
- if (IS_NULL(step_body)) goto err1;
-#endif
- lower = 0;
- repeat = node_new_quantifier(lower, REPEAT_INFINITE, 0);
- if (IS_NULL(repeat)) goto err1;
- }
- else {
- QuantNode* q;
- Node* body;
-
- r = ONIGERR_INVALID_ABSENT_GROUP_GENERATOR_PATTERN;
- if (NODE_TYPE(generator) != NODE_QUANT) {
- if (NODE_TYPE(generator) != NODE_ENCLOSURE ||
- ENCLOSURE_(generator)->type != ENCLOSURE_STOP_BACKTRACK)
- goto err0;
-
- stop_bt = generator;
- generator = NODE_BODY(stop_bt);
- NODE_BODY(stop_bt) = NULL_NODE;
- if (NODE_TYPE(generator) != NODE_QUANT) goto err0;
- }
-
- q = QUANT_(generator);
- if (q->greedy == 0) goto err0;
- body = NODE_BODY(generator);
- invalid_node = 0;
- min_len = onig_get_tiny_min_len(body, (BIT_NODE_CALL), &invalid_node);
- if (invalid_node != 0) {
- r = ONIGERR_INVALID_ABSENT_GROUP_GENERATOR_PATTERN;
- goto err0;
- }
- if (min_len == 0) goto err0;
-
- repeat = generator;
- step_body = body;
- NODE_BODY(repeat) = NULL_NODE;
- generator = NULL_NODE;
- lower = QUANT_(repeat)->lower;
- }
-
- invalid_node = 0;
- min_len = onig_get_tiny_min_len(absent_body, (BIT_NODE_CALL | BIT_NODE_BACKREF),
- &invalid_node);
- if (invalid_node != 0) {
- r = ONIGERR_INVALID_ABSENT_GROUP_PATTERN;
- goto err0;
- }
- if (min_len == 0) { // (?~) ==> simple fail
- Node* fail_with_after;
- Node* ns[2];
-
- ns[0] = step_body; ns[1] = absent_body;
- r = make_fail_with_after(&fail_with_after, env, 2, ns);
- if (r != 0) goto err0;
-
- *node = fail_with_after;
- onig_node_free(repeat);
- onig_node_free(stop_bt);
- return ONIG_NORMAL;
- }
-
- r = make_absent_group_repeated_body_tree(&repeat_body, absent_body,
- step_body, env, &id);
- if (r != 0) goto err2;
-
- NODE_BODY(repeat) = repeat_body;
- if (IS_NOT_NULL(stop_bt)) {
- NODE_BODY(stop_bt) = repeat;
- repeat = NULL_NODE;
- }
-
- r = node_new_save_gimmick(&save, SAVE_RIGHT_RANGE, env);
- if (r != 0) goto err2;
-
- ns[0] = save;
- ns[1] = IS_NULL(stop_bt) ? repeat : stop_bt;
-
- r = node_new_update_var_gimmick(&update, UPDATE_VAR_RIGHT_RANGE_FROM_STACK,
- id, env);
- if (r != 0) goto err2;
- ns[2] = update;
-
- if (lower == 0) {
- top = make_list(3, ns);
- if (IS_NULL(top)) {
- r = ONIGERR_MEMORY;
- goto err2;
- }
- }
- else {
- Node* alt;
- Node* repeat_line;
- repeat_line = make_list(2, ns + 1);
- if (IS_NULL(repeat_line)) {
- r = ONIGERR_MEMORY;
- goto err2;
- }
-
- r = make_absent_group_restore_fail_for_lower_no_zero(&alt, repeat_line, id, env);
- if (r != 0) goto err2;
-
- ns[1] = alt;
- top = make_list(2, ns);
- if (IS_NULL(top)) {
- NODE_CAR(alt) = NULL_NODE;
- onig_node_free(alt);
- r = ONIGERR_MEMORY;
- goto err2;
- }
- }
-
- *node = top;
- return ONIG_NORMAL;
-
- err0:
- onig_node_free(generator);
- err1:
- onig_node_free(absent_body);
- onig_node_free(step_body);
- err2:
- onig_node_free(repeat);
- onig_node_free(stop_bt);
- onig_node_free(save);
- onig_node_free(update);
-
- return r;
-}
-#endif
-
static int
make_absent_engine(Node** node, int pre_save_right_id, Node* absent,
Node* step_one, int lower, int upper, int possessive,