}
extern OnigLen
-onig_get_tiny_min_len(Node* node, int* invalid_node)
+onig_get_tiny_min_len(Node* node, unsigned int inhibit_types, int* invalid_node)
{
OnigLen len;
OnigLen tmin;
+ if ((NODE_TYPE2BIT(NODE_TYPE(node)) & inhibit_types) != 0)
+ *invalid_node = 1;
+
len = 0;
switch (NODE_TYPE(node)) {
#ifdef USE_CALL
/* fall */
#endif
case NODE_BACKREF:
- *invalid_node = 1;
break;
case NODE_LIST:
do {
- tmin = onig_get_tiny_min_len(NODE_CAR(node), invalid_node);
+ tmin = onig_get_tiny_min_len(NODE_CAR(node), inhibit_types, invalid_node);
len = distance_add(len, tmin);
} while (IS_NOT_NULL(node = NODE_CDR(node)));
break;
y = node;
do {
x = NODE_CAR(y);
- tmin = onig_get_tiny_min_len(x, invalid_node);
+ tmin = onig_get_tiny_min_len(x, inhibit_types, invalid_node);
if (y == node) len = tmin;
else if (len > tmin) len = tmin;
} while (IS_NOT_NULL(y = NODE_CDR(y)));
QuantNode* qn = QUANT_(node);
if (qn->lower > 0) {
- len = onig_get_tiny_min_len(NODE_BODY(node), invalid_node);
+ len = onig_get_tiny_min_len(NODE_BODY(node), inhibit_types, invalid_node);
len = distance_multiply(len, qn->lower);
}
}
case ENCLOSURE_MEMORY:
case ENCLOSURE_OPTION:
case ENCLOSURE_STOP_BACKTRACK:
- len = onig_get_tiny_min_len(NODE_BODY(node), invalid_node);
+ len = onig_get_tiny_min_len(NODE_BODY(node), inhibit_types, invalid_node);
break;
case ENCLOSURE_IF_ELSE:
{
int elen;
- len = onig_get_tiny_min_len(NODE_BODY(node), invalid_node);
+ len = onig_get_tiny_min_len(NODE_BODY(node), inhibit_types, invalid_node);
if (IS_NOT_NULL(en->te.Then))
len = distance_add(len,
- onig_get_tiny_min_len(en->te.Then, invalid_node));
+ onig_get_tiny_min_len(en->te.Then, inhibit_types, invalid_node));
if (IS_NOT_NULL(en->te.Else))
- elen = onig_get_tiny_min_len(en->te.Else, invalid_node);
+ elen = onig_get_tiny_min_len(en->te.Else, inhibit_types, invalid_node);
else elen = 0;
if (elen < len) len = elen;
if (q->greedy == 0) goto err0;
body = NODE_BODY(generator);
invalid_node = 0;
- min_len = onig_get_tiny_min_len(body, &invalid_node);
- /* ignore invalid_node (backref and call) */
+ 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;
}
invalid_node = 0;
- min_len = onig_get_tiny_min_len(absent_body, &invalid_node);
+ 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;
extern int onig_parse_tree P_((Node** root, const UChar* pattern, const UChar* end, regex_t* reg, ScanEnv* env));
extern int onig_free_shared_cclass_table P_((void));
extern int onig_is_code_in_cc P_((OnigEncoding enc, OnigCodePoint code, CClassNode* cc));
-extern OnigLen onig_get_tiny_min_len(Node* node, int* invalid_node);
+extern OnigLen onig_get_tiny_min_len(Node* node, unsigned int inhibit_node_types, int* invalid_node);
#ifdef ONIG_DEBUG
#ifdef USE_NAMED_GROUP