From 00275d61a48cf5bc6aaaf07573bd57e8ac3692bc Mon Sep 17 00:00:00 2001 From: Gideon le Grange Date: Wed, 8 Oct 2014 06:08:19 +0200 Subject: [PATCH] Fixed regression to #7 caused by fix for #11 --- src/main/java/examples/Example8.java | 5 +- .../me/legrange/mikrotik/impl/Parser.java | 7 +- .../me/legrange/mikrotik/impl/Scanner.java | 68 +++++++++++-------- 3 files changed, 49 insertions(+), 31 deletions(-) diff --git a/src/main/java/examples/Example8.java b/src/main/java/examples/Example8.java index f203971..37ef4eb 100644 --- a/src/main/java/examples/Example8.java +++ b/src/main/java/examples/Example8.java @@ -19,9 +19,10 @@ public class Example8 extends Example { } private void test() throws MikrotikApiException, InterruptedException { - List> res = con.execute("/ip/hotspot/user/print where uptime!=1"); + List> res = con.execute("/ip/hotspot/user/print where uptime!=1"); for (Map r : res) { System.out.println(r); - } + } +// con.execute("/ip/firewall/filter/add chain=forward hotspot=!auth protocol=tcp src-port=8000-8084"); } } diff --git a/src/main/java/me/legrange/mikrotik/impl/Parser.java b/src/main/java/me/legrange/mikrotik/impl/Parser.java index f1db8e3..ef3a413 100644 --- a/src/main/java/me/legrange/mikrotik/impl/Parser.java +++ b/src/main/java/me/legrange/mikrotik/impl/Parser.java @@ -51,8 +51,13 @@ class Parser { next(); if (token == Token.EQUALS) { next(); + StringBuilder val = new StringBuilder(); + if (token == Token.PIPE) { // handle cases like hotspot=!auth + val.append(token); + next(); + } expect(Token.TEXT); - StringBuilder val = new StringBuilder(text); + val.append(text); next(); while (is(Token.COMMA, Token.SLASH)) { val.append(token); diff --git a/src/main/java/me/legrange/mikrotik/impl/Scanner.java b/src/main/java/me/legrange/mikrotik/impl/Scanner.java index 68f5558..25c54b4 100644 --- a/src/main/java/me/legrange/mikrotik/impl/Scanner.java +++ b/src/main/java/me/legrange/mikrotik/impl/Scanner.java @@ -15,6 +15,7 @@ */ package me.legrange.mikrotik.impl; +import static me.legrange.mikrotik.impl.Scanner.Token.*; /** * A simple scanner. * @@ -25,7 +26,7 @@ class Scanner { enum Token { SLASH("/"), COMMA(","), EOL(), WS, TEXT, - LESS("<"), MORE(">"), EQUALS("="), NOT_EQUALS("!="), + LESS("<"), MORE(">"), EQUALS("="), NOT_EQUALS("!="), PIPE("!"), WHERE, NOT, AND, OR, RETURN; @Override @@ -59,27 +60,27 @@ class Scanner { text = null; switch (c) { case '\n': - return Token.EOL; + return EOL; case ' ': case '\t': return whiteSpace(); case ',': nextChar(); - return Token.COMMA; + return COMMA; case '/': nextChar(); - return Token.SLASH; + return SLASH; case '<': nextChar(); - return Token.LESS; + return LESS; case '>': nextChar(); - return Token.MORE; + return MORE; case '=': nextChar(); - return Token.EQUALS; + return EQUALS; case '!': - return notEquals(); + return pipe(); case '"': return quotedText('"'); case '\'': @@ -119,17 +120,17 @@ class Scanner { String val = text.toString().toLowerCase(); switch (val) { case "where": - return Token.WHERE; + return WHERE; case "not": - return Token.NOT; + return NOT; case "and": - return Token.AND; + return AND; case "or": - return Token.OR; + return OR; case "return": - return Token.RETURN; + return RETURN; } - return Token.TEXT; + return TEXT; } /** @@ -146,7 +147,19 @@ class Scanner { nextChar(); } nextChar(); // eat the '"' - return Token.TEXT; + return TEXT; + } + + /** + * process notEquals ! + */ + private Token pipe() { + nextChar(); // eat ! + if (c == '=') { + nextChar(); // eat = + return NOT_EQUALS; + } + return PIPE; } /** @@ -156,19 +169,7 @@ class Scanner { while ((c == ' ') || (c == '\t')) { nextChar(); } - return Token.WS; - } - - /** - * process the not equals token - */ - private Token notEquals() throws ScanException { - nextChar(); // eat the ! - if (c != '=') { - throw new ScanException(String.format("Expected = after !, found '%c'", c)); - } - nextChar(); // eat the = - return Token.NOT_EQUALS; + return WS; } /** @@ -183,6 +184,17 @@ class Scanner { } } + /** + * look ahead one character + */ + private char peek() { + if (pos < line.length()) { + return line.charAt(pos); + } else { + return '\n'; + } + } + /** * check if the character matches the give expression */