]> Dogcows Code - chaz/openbox/blobdiff - openbox/parse.c
change how rc parsing will work. a=b will be parsed in any [section] and given to...
[chaz/openbox] / openbox / parse.c
index 80a918cb89e8e76140acfcf6d952e967fbf675b8..a72cfd84b89542faccbc19c4e37ea300bc55f836 100644 (file)
@@ -1,20 +1,18 @@
 #include "parse.h"
-#include "config.h"
 
-static GHashTable *reg = NULL;
-static ParseFunc func = NULL;
+static GHashTable     *reg = NULL;
 
-/* parse tokens from the [openbox] section of the rc file */
-static void parse_rc_token(ParseToken *token);
+struct Functions {
+    ParseFunc       func;
+    AssignParseFunc afunc;
+} *funcs;
 
-void destkey(gpointer key) { g_free(key); }
+void destshit(gpointer key) { g_free(key); }
 
 void parse_startup()
 {
-    reg = g_hash_table_new_full(g_str_hash, g_str_equal, destkey, NULL);
-    func = NULL;
-
-    parse_reg_section("openbox", parse_rc_token);
+    reg = g_hash_table_new_full(g_str_hash, g_str_equal, destshit, destshit);
+    funcs = NULL;
 }
 
 void parse_shutdown()
@@ -22,13 +20,17 @@ void parse_shutdown()
     g_hash_table_destroy(reg);
 }
 
-void parse_reg_section(char *section, ParseFunc func)
+void parse_reg_section(char *section, ParseFunc func, AssignParseFunc afunc)
 {
     if (g_hash_table_lookup(reg, section) != NULL)
         g_warning("duplicate request for section '%s' in the rc file",
                   section);
-    else
-        g_hash_table_insert(reg, g_ascii_strdown(section, -1), (void*)func);
+    else {
+        struct Functions *f = g_new(struct Functions, 1);
+        f->func = func;
+        f->afunc = afunc;
+        g_hash_table_insert(reg, g_ascii_strdown(section, -1), f);
+    }
 }
 
 void parse_free_token(ParseToken *token)
@@ -54,7 +56,6 @@ void parse_free_token(ParseToken *token)
     case TOKEN_BOOL:
     case TOKEN_LBRACE:
     case TOKEN_RBRACE:
-    case TOKEN_EQUALS:
     case TOKEN_COMMA:
     case TOKEN_NEWLINE:
         break;
@@ -63,82 +64,25 @@ void parse_free_token(ParseToken *token)
 
 void parse_set_section(char *section)
 {
-    func = (ParseFunc)g_hash_table_lookup(reg, section);
+    funcs = g_hash_table_lookup(reg, section);
 }
 
 void parse_token(ParseToken *token)
 {
-    if (func != NULL)
-        func(token);
+    if (funcs) {
+        if (funcs->func != NULL)
+            funcs->func(token);
+        else if (token->type != TOKEN_NEWLINE)
+            yyerror("syntax error");
+    }
 }
 
-static void parse_rc_token(ParseToken *token)
+void parse_assign(char *name, ParseToken *value)
 {
-    static int got_eq = FALSE;
-    static ParseTokenType got_val = 0;
-    static char *id = NULL, *s = NULL;
-    static int i;
-    static gboolean b;
-
-    if (id == NULL) {
-        if (token->type == TOKEN_IDENTIFIER) {
-            id = token->data.identifier;
-            return;
-        } else {
-            yyerror("syntax error");
-        }
-    } else if (!got_eq) {
-        if (token->type == TOKEN_EQUALS) {
-            got_eq = TRUE;
-            return;
-        } else {
-            yyerror("syntax error");
-        }
-    } else if (!got_val) {
-        if (token->type == TOKEN_STRING) {
-            s = token->data.string;
-            got_val = token->type;
-            return;
-        } else if (token->type == TOKEN_BOOL) {
-            b = token->data.bool;
-            got_val = token->type;
-            return;
-        } else if (token->type == TOKEN_INTEGER) {
-            i = token->data.integer;
-            got_val = token->type;
-            return;
-        } else
+    if (funcs) {
+        if (funcs->afunc != NULL)
+            funcs->afunc(name, value);
+        else
             yyerror("syntax error");
-    } else if (token->type != TOKEN_NEWLINE) {
-        yyerror("syntax error");
-    } else {
-        ConfigValue v;
-
-        switch (got_val) {
-        case TOKEN_STRING:
-            v.string = s;
-            if (!config_set(id, Config_String, v))
-                yyerror("invalid value type");
-            break;
-        case TOKEN_BOOL:
-            v.bool = b;
-            if (!config_set(id, Config_Bool, v))
-                yyerror("invalid value type");
-            break;
-        case TOKEN_INTEGER:
-            v.integer = i;
-            if (!config_set(id, Config_Integer, v))
-                yyerror("invalid value type");
-            break;
-        default:
-            g_assert_not_reached(); /* unhandled type got parsed */
-        }
     }
-
-    g_free(id);
-    g_free(s);
-    id = s = NULL;
-    got_eq = FALSE;
-    got_val = 0;
-    parse_free_token(token);
 }
This page took 0.023799 seconds and 4 git commands to generate.