diff options
Diffstat (limited to 'lr.c')
-rw-r--r-- | lr.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/lr.c b/lr.c index a92dcb8..00b6454 100644 --- a/lr.c +++ b/lr.c @@ -604,6 +604,7 @@ parse_strcmp() { enum prop prop; enum op op; + int negate = 0; if (token("fstype")) prop = PROP_FSTYPE; @@ -636,6 +637,18 @@ parse_strcmp() op = EXPR_STREQ; else if (token("=")) op = EXPR_STREQ; + else if (token("!~~~")) + negate = 1, op = EXPR_GLOBI; + else if (token("!~~")) + negate = 1, op = EXPR_GLOB; + else if (token("!=~~")) + negate = 1, op = EXPR_REGEXI; + else if (token("!=~") || token("!~")) + negate = 1, op = EXPR_REGEX; + else if (token("!===")) + negate = 1, op = EXPR_STREQI; + else if (token("!==") || token("!=")) + negate = 1, op = EXPR_STREQ; else parse_error("invalid string operator at '%.15s'", pos); @@ -661,6 +674,12 @@ parse_strcmp() exit(2); } + if (negate) { + struct expr *not = mkexpr(EXPR_NOT); + not->a.expr = e; + return not; + } + return e; } |