void cfg_lexer_unput_token(CfgLexer *self, YYSTYPE *yylval) { CfgTokenBlock *block; block = cfg_token_block_new(); cfg_token_block_add_token(block, yylval); cfg_lexer_inject_token_block(self, block); }
/* 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; }