[rygel] core: Major refactoring of SearchCriteriaParser



commit 208d5d7bef3adc4c85fc4892dc07c7c005d9e49c
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date:   Thu Jan 7 18:29:15 2010 +0200

    core: Major refactoring of SearchCriteriaParser
    
    - Rename Symbol to SearchCriteriaSymbol.
    - Rename SearchCriteriaSymbol to SearchCriteriaToken.
    - Add private prop to fetch current parser token as SearchCriteriaSymbol.
    - No need to convert enum values to int everywhere.
    - SearchCriteriaSymbol should also include symbols that are already covered by
      GUPnP.SearchCriteriaOp but the common symbols must contain the same values.

 src/rygel/rygel-search-criteria-parser.vala |  110 ++++++++++++++++-----------
 1 files changed, 65 insertions(+), 45 deletions(-)
---
diff --git a/src/rygel/rygel-search-criteria-parser.vala b/src/rygel/rygel-search-criteria-parser.vala
index e666d49..54082d3 100644
--- a/src/rygel/rygel-search-criteria-parser.vala
+++ b/src/rygel/rygel-search-criteria-parser.vala
@@ -27,9 +27,28 @@ errordomain Rygel.SearchCriteriaError {
     SYNTAX_ERROR
 }
 
-private struct Rygel.SearchCriteriaSymbol {
-    public string symbol;
-    public int value;
+private enum Rygel.SearchCriteriaSymbol {
+    EQ = SearchCriteriaOp.EQ,
+    NEQ,
+    LESS,
+    LEQ,
+    GREATER,
+    GEQ,
+    CONTAINS,
+    DOES_NOT_CONTAIN,
+    DERIVED_FROM,
+    EXISTS,
+
+    ASTERISK,
+    AND,
+    OR,
+    TRUE,
+    FALSE
+}
+
+private struct Rygel.SearchCriteriaToken {
+    public string str_symbol;
+    public SearchCriteriaSymbol symbol;
 }
 
 /**
@@ -43,31 +62,30 @@ internal class Rygel.SearchCriteriaParser : Object, StateMachine {
 
     public Cancellable cancellable { get; set; }
 
-    private Scanner scanner;
-    private enum Symbol {
-        ASTERISK = TokenType.LAST + 11,
-        AND      = TokenType.LAST + 12,
-        OR       = TokenType.LAST + 13,
-        TRUE     = TokenType.LAST + 14,
-        FALSE    = TokenType.LAST + 15
+    private SearchCriteriaSymbol token {
+        get {
+            return (SearchCriteriaSymbol) this.scanner.token;
+        }
     }
 
-    private const SearchCriteriaSymbol[] symbols = {
-        { "*",              (int) Symbol.ASTERISK },
-        { "and",            (int) Symbol.AND },
-        { "or",             (int) Symbol.OR },
-        { "=",              (int) SearchCriteriaOp.EQ },
-        { "!=",             (int) SearchCriteriaOp.NEQ },
-        { "<",              (int) SearchCriteriaOp.LESS },
-        { "<=",             (int) SearchCriteriaOp.LEQ },
-        { ">",              (int) SearchCriteriaOp.GREATER },
-        { ">=",             (int) SearchCriteriaOp.GEQ },
-        { "contains",       (int) SearchCriteriaOp.CONTAINS },
-        { "doesNotContain", (int) SearchCriteriaOp.DOES_NOT_CONTAIN },
-        { "derivedfrom",    (int) SearchCriteriaOp.DERIVED_FROM },
-        { "exists",         (int) SearchCriteriaOp.EXISTS },
-        { "true",           (int) Symbol.TRUE },
-        { "false",          (int) Symbol.FALSE }
+    private Scanner scanner;
+
+    private const SearchCriteriaToken[] tokens = {
+        { "=",              SearchCriteriaSymbol.EQ },
+        { "!=",             SearchCriteriaSymbol.NEQ },
+        { "<",              SearchCriteriaSymbol.LESS },
+        { "<=",             SearchCriteriaSymbol.LEQ },
+        { ">",              SearchCriteriaSymbol.GREATER },
+        { ">=",             SearchCriteriaSymbol.GEQ },
+        { "contains",       SearchCriteriaSymbol.CONTAINS },
+        { "doesNotContain", SearchCriteriaSymbol.DOES_NOT_CONTAIN },
+        { "derivedfrom",    SearchCriteriaSymbol.DERIVED_FROM },
+        { "exists",         SearchCriteriaSymbol.EXISTS },
+        { "*",              SearchCriteriaSymbol.ASTERISK },
+        { "and",            SearchCriteriaSymbol.AND },
+        { "or",             SearchCriteriaSymbol.OR },
+        { "true",           SearchCriteriaSymbol.TRUE },
+        { "false",          SearchCriteriaSymbol.FALSE }
     };
 
     public SearchCriteriaParser (string str) throws Error {
@@ -86,8 +104,10 @@ internal class Rygel.SearchCriteriaParser : Object, StateMachine {
                                                CharacterSet.LATINC;
         scanner.config.symbol_2_token        = true;
 
-        foreach (SearchCriteriaSymbol s in symbols) {
-            scanner.scope_add_symbol (0, s.symbol, s.value.to_pointer ());
+        foreach (var token in tokens) {
+            scanner.scope_add_symbol (0,
+                                      token.str_symbol,
+                                      ((int) token.symbol).to_pointer ());
         }
     }
 
@@ -110,7 +130,7 @@ internal class Rygel.SearchCriteriaParser : Object, StateMachine {
 
     private SearchExpression? and_expression () throws Error {
         var exp = relational_expression ();
-        while (this.scanner.token == (int) Symbol.AND) {
+        while (this.token == SearchCriteriaSymbol.AND) {
             this.scanner.get_next_token ();
             var exp2 = new LogicalExpression();
             exp2.operand1 = exp;
@@ -127,17 +147,18 @@ internal class Rygel.SearchCriteriaParser : Object, StateMachine {
         if (this.scanner.token == TokenType.IDENTIFIER) {
             exp.operand1 = this.scanner.value.identifier;
             this.scanner.get_next_token ();
-            if (this.scanner.token == (int) SearchCriteriaOp.EQ ||
-                this.scanner.token == (int) SearchCriteriaOp.NEQ ||
-                this.scanner.token == (int) SearchCriteriaOp.LESS ||
-                this.scanner.token == (int) SearchCriteriaOp.LEQ ||
-                this.scanner.token == (int) SearchCriteriaOp.GREATER ||
-                this.scanner.token == (int) SearchCriteriaOp.GEQ ||
-                this.scanner.token == (int) SearchCriteriaOp.CONTAINS ||
-                this.scanner.token == (int) SearchCriteriaOp.DOES_NOT_CONTAIN ||
-                this.scanner.token == (int) SearchCriteriaOp.DERIVED_FROM) {
-               exp.op = (SearchCriteriaOp) this.scanner.token;
-               this.scanner.get_next_token ();
+
+            if (this.token == SearchCriteriaSymbol.EQ ||
+                this.token == SearchCriteriaSymbol.NEQ ||
+                this.token == SearchCriteriaSymbol.LESS ||
+                this.token == SearchCriteriaSymbol.LEQ ||
+                this.token == SearchCriteriaSymbol.GREATER ||
+                this.token == SearchCriteriaSymbol.GEQ ||
+                this.token == SearchCriteriaSymbol.CONTAINS ||
+                this.token == SearchCriteriaSymbol.DOES_NOT_CONTAIN ||
+                this.token == SearchCriteriaSymbol.DERIVED_FROM) {
+                exp.op = (SearchCriteriaOp) this.scanner.token;
+                this.scanner.get_next_token ();
                if (this.scanner.token == TokenType.STRING) {
                    exp.operand2 = this.scanner.value.string;
                    this.scanner.get_next_token ();
@@ -147,15 +168,15 @@ internal class Rygel.SearchCriteriaParser : Object, StateMachine {
                     throw new SearchCriteriaError.SYNTAX_ERROR (
                                  "relational_expression: expected \"string\"");
                }
-            } else if (this.scanner.token == (int) SearchCriteriaOp.EXISTS) {
+            } else if (this.token == SearchCriteriaSymbol.EXISTS) {
                 exp.op = (SearchCriteriaOp) this.scanner.token;
                 this.scanner.get_next_token ();
-                if (this.scanner.token == (int) Symbol.TRUE) {
+                if (this.token == SearchCriteriaSymbol.TRUE) {
                     exp.operand2 = "true";
                     this.scanner.get_next_token ();
 
                     return exp;
-                } else if (this.scanner.token == (int) Symbol.FALSE) {
+                } else if (this.token == SearchCriteriaSymbol.FALSE) {
                     exp.operand2 = "false";
                     this.scanner.get_next_token ();
 
@@ -188,7 +209,7 @@ internal class Rygel.SearchCriteriaParser : Object, StateMachine {
 
     private SearchExpression? or_expression () throws Error {
         var exp = and_expression ();
-        while (this.scanner.token == (int) Symbol.OR) {
+        while (this.token == SearchCriteriaSymbol.OR) {
             this.scanner.get_next_token ();
             var exp2 = new LogicalExpression();
             exp2.operand1 = exp;
@@ -199,6 +220,5 @@ internal class Rygel.SearchCriteriaParser : Object, StateMachine {
 
         return exp;
     }
-
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]