void cfg_lexer_free(CfgLexer *self) { gint i; for (i = 0; i <= self->include_depth; i++) cfg_lexer_clear_include_level(self, &self->include_stack[i]); self->include_depth = 0; _cfg_lexer_lex_destroy(self->state); g_string_free(self->string_buffer, TRUE); if (self->token_text) g_string_free(self->token_text, TRUE); if (self->token_pretext) g_string_free(self->token_pretext, TRUE); while (self->context_stack) cfg_lexer_pop_context(self); g_list_foreach(self->token_blocks, (GFunc) cfg_token_block_free, NULL); g_list_free(self->token_blocks); g_free(self); }
/* construct a plugin instance by parsing a configuration file */ gpointer plugin_parse_config(Plugin *self, GlobalConfig *cfg, YYLTYPE *yylloc, gpointer arg) { gpointer instance = NULL; g_assert(self->construct == NULL); /* make sure '_' and '-' are handled equally in plugin name */ if (!self->setup_context) { CfgTokenBlock *block; YYSTYPE token; block = cfg_token_block_new(); memset(&token, 0, sizeof(token)); token.type = LL_TOKEN; token.token = self->type; cfg_token_block_add_token(block, &token); cfg_lexer_push_context(cfg->lexer, self->parser->context, self->parser->keywords, self->parser->name); cfg_lexer_lookup_keyword(cfg->lexer, &token, yylloc, self->name); cfg_lexer_pop_context(cfg->lexer); cfg_token_block_add_token(block, &token); cfg_lexer_inject_token_block(cfg->lexer, block); } else { (self->setup_context)(self, cfg, self->type, self->name); } if (!cfg_parser_parse(self->parser, cfg->lexer, &instance, arg)) { cfg_parser_cleanup(self->parser, instance); instance = NULL; } return instance; }