X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fparse.c;fp=openbox%2Fparse.c;h=a72cfd84b89542faccbc19c4e37ea300bc55f836;hb=cbbf90a718ecc6836ef7a77b9040aebb9da348b8;hp=80a918cb89e8e76140acfcf6d952e967fbf675b8;hpb=88f8ebada97c4c82252badeb57b7e71a2940600b;p=chaz%2Fopenbox diff --git a/openbox/parse.c b/openbox/parse.c index 80a918cb..a72cfd84 100644 --- a/openbox/parse.c +++ b/openbox/parse.c @@ -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); }