static ParseFunc func = NULL;
/* parse tokens from the [openbox] section of the rc file */
-static void parse_rc_token(ParseTokenType type, union ParseToken token);
+static void parse_rc_token(ParseToken *token);
void destkey(gpointer key) { g_free(key); }
g_hash_table_insert(reg, g_ascii_strdown(section, -1), (void*)func);
}
-void parse_free_token(ParseTokenType type, union ParseToken token)
+void parse_free_token(ParseToken *token)
{
- switch (type) {
+ GList *it;
+
+ switch (token->type) {
case TOKEN_STRING:
- g_free(token.string);
+ g_free(token->data.string);
break;
case TOKEN_IDENTIFIER:
- g_free(token.identifier);
+ g_free(token->data.identifier);
+ break;
+ case TOKEN_LIST:
+ for (it = token->data.list; it; it = it->next) {
+ parse_free_token(it->data);
+ g_free(it->data);
+ }
+ g_list_free(token->data.list);
break;
case TOKEN_REAL:
case TOKEN_INTEGER:
case TOKEN_BOOL:
- case TOKEN_LBRACKET:
- case TOKEN_RBRACKET:
case TOKEN_LBRACE:
case TOKEN_RBRACE:
case TOKEN_EQUALS:
func = (ParseFunc)g_hash_table_lookup(reg, section);
}
-void parse_token(ParseTokenType type, union ParseToken token)
+void parse_token(ParseToken *token)
{
if (func != NULL)
- func(type, token);
+ func(token);
}
static void parse_rc_token(ParseToken *token)
if (id == NULL) {
if (token->type == TOKEN_IDENTIFIER) {
- id = token.identifier;
+ id = token->data.identifier;
return;
} else {
yyerror("syntax error");
}
} else if (!got_val) {
if (token->type == TOKEN_STRING) {
- s = token.string;
- got_val = type;
+ s = token->data.string;
+ got_val = token->type;
return;
} else if (token->type == TOKEN_BOOL) {
- b = token.bool;
- got_val = type;
+ b = token->data.bool;
+ got_val = token->type;
return;
} else if (token->type == TOKEN_INTEGER) {
- i = token.integer;
- got_val = type;
+ i = token->data.integer;
+ got_val = token->type;
return;
} else
yyerror("syntax error");
id = s = NULL;
got_eq = FALSE;
got_val = 0;
- parse_free_token(token->type, token);
+ parse_free_token(token);
}