aboutsummaryrefslogtreecommitdiff
path: root/compiler.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2020-09-28 17:56:02 -0700
committerBruce Hill <bruce@bruce-hill.com>2020-09-28 17:56:02 -0700
commit699e7c8b9869fa9737a3c61ef9bcc599751fb88b (patch)
tree13eb334ce0eb76c2a31bb2817ec86cbd45b81b81 /compiler.c
parent544a88e9d4faa3f7e34316daaa01d2fa14d1d9f6 (diff)
Added !=
Diffstat (limited to 'compiler.c')
-rw-r--r--compiler.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/compiler.c b/compiler.c
index 5faf0f2..39a12b1 100644
--- a/compiler.c
+++ b/compiler.c
@@ -389,19 +389,22 @@ vm_op_t *bpeg_simplepattern(file_t *f, const char *str)
op->end = str;
op->len = -1;
goto postfix;
- } else if (strncmp(str, "==", 2) == 0) { // Equality <pat1>==<pat2>
+ } else if ((str[0] == '=' || str[0] == '!') && str[1] == '=') { // Equality <pat1>==<pat2> and inequality <pat1>!=<pat2>
+ int equal = str[0] == '=';
str = after_spaces(str+2);
vm_op_t *first = op;
vm_op_t *second = bpeg_simplepattern(f, str);
- check(second, "Expected pattern after '=='");
- check(first->len == -1 || second->len == -1 || first->len == second->len,
- "Two patterns cannot possibly match the same (different lengths: %ld != %ld)",
- first->len, second->len);
+ check(second, "Expected pattern after '%c='", equal? '=' : '!');
+ if (equal) {
+ check(first->len == -1 || second->len == -1 || first->len == second->len,
+ "Two patterns cannot possibly match the same (different lengths: %ld != %ld)",
+ first->len, second->len);
+ }
op = calloc(sizeof(vm_op_t), 1);
- op->op = VM_EQUAL;
+ op->op = equal ? VM_EQUAL : VM_NOT_EQUAL;
op->start = str;
op->end = second->end;
- op->len = (first->len == -1 || second->len == -1) ? -1 : first->len;
+ op->len = first->len != -1 ? first->len : second->len;
op->args.multiple.first = first;
op->args.multiple.second = second;
str = op->end;