TOKEN_NE,
TOKEN_RBRACE,
TOKEN_LBRACE,
- TOKEN_GROUP,
TOKEN_GE,
TOKEN_LE,
TOKEN_GT,
continue;
case TOKEN_NOT:
- case TOKEN_GROUP:
case TOKEN_RBRACE:
case TOKEN_LBRACE:
if (!current->dump_done) {
break;
case TOKEN_RE:
- case TOKEN_RBRACE:
- case TOKEN_GROUP:
+ case TOKEN_RBRACE: /* cannot happen */
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
"Invalid expression \"%s\" in file %s",
expr, r->filename);
return retval;
}
- TYPE_TOKEN(¤t->token, TOKEN_GROUP);
+ /* empty groups return TRUE (backwards compat) */
+ if (!current->right) {
+ CREATE_NODE(ctx, current->right);
+ TYPE_TOKEN(¤t->right->token, TOKEN_STRING);
+ current->right->token.value = "()";
+ }
+
+ current->right->parent = current->parent;
+ if (!current->parent) {
+ current = root = current->right;
+ }
+ else if (current->parent->left == current) {
+ current = current->parent->left = current->right;
+ }
+ else {
+ current = current->parent->right = current->right;
+ }
break;
case TOKEN_NOT:
switch (current->token.type) {
case TOKEN_STRING:
case TOKEN_RE:
- case TOKEN_RBRACE:
- case TOKEN_GROUP:
+ case TOKEN_RBRACE: /* cannot happen */
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
"Invalid expression \"%s\" in file %s",
expr, r->filename);
new->parent = current;
current = new;
break;
-
- default:
- break;
}
}
current = current->parent;
break;
- case TOKEN_GROUP:
- if (current->right) {
- if (!current->right->done) {
- current = current->right;
- continue;
- }
- current->value = current->right->value;
- }
- else {
- current->value = 1;
- }
-
- DEBUG_DUMP_EVAL(ctx, current);
- current->done = 1;
- current = current->parent;
- break;
-
case TOKEN_LBRACE:
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
"Unmatched '(' in \"%s\" in file %s",
*was_error = 1;
return retval;
- case TOKEN_RBRACE:
- ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
- "Unmatched ')' in \"%s\" in file %s",
- expr, r->filename);
- *was_error = 1;
- return retval;
-
default:
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
"bad token type (internal parser error)");