case OP_LT:
op_str = "<";
break;
+ case OP_EQ:
+ op_str = "==";
+ break;
+ case OP_NE:
+ op_str = "!=";
+ break;
case OP_OBRACE:
op_str = "(";
break;
case OP_GT:
case OP_LE:
case OP_LT:
+ case OP_EQ:
+ case OP_NE:
ret = 4;
break;
case OP_AND:
case OP_GT:
case OP_LE:
case OP_LT:
+ case OP_EQ:
+ case OP_NE:
ret |= RSPAMD_EXPRESSION_BINARY|RSPAMD_EXPRESSION_COMPARISON;
break;
case OP_AND:
case '*':
case '-':
case '/':
+ case '=':
return TRUE;
}
case '/':
case '-':
case '(':
- case ')': {
+ case ')':
+ case '=': {
if (a < end - 1) {
if ((a[0] == '&' && a[1] == '&') ||
- (a[0] == '|' && a[1] == '|')) {
+ (a[0] == '|' && a[1] == '|') ||
+ (a[0] == '!' && a[1] == '=') ||
+ (a[0] == '=' && a[1] == '=')) {
*next = a + 2;
}
else {
/* XXX: not especially effective */
switch (*a) {
case '!':
- op = OP_NOT;
+ if (a < end - 1 && a[1] == '=') {
+ op = OP_NE;
+ }
+ else {
+ op = OP_NOT;
+ }
break;
case '&':
op = OP_AND;
case '-':
op = OP_MINUS;
break;
+ case '=':
+ op = OP_EQ;
+ break;
case ')':
op = OP_CBRACE;
break;
op = GPOINTER_TO_INT (rspamd_expr_stack_peek (e));
if (op == OP_MULT || op == OP_MINUS || op == OP_DIVIDE ||
- op == OP_PLUS || (op >= OP_LT && op <= OP_GE)) {
+ op == OP_PLUS || (op >= OP_LT && op <= OP_NE)) {
if (rspamd_regexp_search (num_re,
p,
end - p,
case OP_LT:
ret = op1 < op2;
break;
+ case OP_EQ:
+ ret = op1 == op2;
+ break;
+ case OP_NE:
+ ret = op1 != op2;
+ break;
case OP_NOT:
case OP_PLUS:
case OP_GT:
case OP_LE:
case OP_LT:
+ case OP_EQ:
+ case OP_NE:
g_assert_not_reached();
break;
}