Esempio n. 1
0
/* cppparser_delete */
void cppparser_delete(CppParser * cp)
{
	string_delete(cp->queue_string);
	if(cp->subparser != NULL)
		cppparser_delete(cp->subparser);
	if(cp->parser != NULL)
		parser_delete(cp->parser);
	string_delete(cp->inject);
	object_delete(cp);
}
Esempio n. 2
0
/* cppparser_new */
CppParser * cppparser_new(Cpp * cpp, CppParser * parent, char const * filename,
		int filters)
{
	/* FIXME factor code */
	CppParser * cp;

	if((cp = object_new(sizeof(*cp))) == NULL)
		return NULL;
	cp->cpp = cpp;
	cp->parent = parent;
	cp->parser = parser_new(filename);
	cp->filters = filters;
	cp->inject = NULL;
	cp->inject_first = 0;
	cp->newlines_last = 0;
	cp->newlines_last_cnt = 0;
	cp->trigraphs_last = 0;
	cp->trigraphs_last_cnt = 0;
	cp->directive_newline = 1;
	cp->directive_control = 0;
	cp->queue_ready = 0;
	cp->queue_code = CPP_CODE_NULL;
	cp->queue_string = NULL;
	cp->subparser = NULL;
	if(cp->parser == NULL)
	{
		cppparser_delete(cp);
		return NULL;
	}
	parser_add_filter(cp->parser, _cpp_filter_inject, cp);
	parser_add_filter(cp->parser, _cpp_filter_newlines, cp);
	if(cp->filters & CPP_FILTER_TRIGRAPH)
		parser_add_filter(cp->parser, _cpp_filter_trigraphs, cp);
	parser_add_callback(cp->parser, _cpp_callback_inject, cp);
	parser_add_callback(cp->parser, _cpp_callback_dequeue, cp);
	if(cp->filters & CPP_FILTER_WHITESPACE)
		parser_add_callback(cp->parser, _cpp_callback_whitespace, cp);
	else
	{
		parser_add_callback(cp->parser, _cpp_callback_newline, cp);
		parser_add_callback(cp->parser, _cpp_callback_otherspace, cp);
	}
	parser_add_callback(cp->parser, _cpp_callback_comment, cp);
	parser_add_callback(cp->parser, _cpp_callback_header, cp);
	parser_add_callback(cp->parser, _cpp_callback_control, cp);
	parser_add_callback(cp->parser, _cpp_callback_comma, cp);
	parser_add_callback(cp->parser, _cpp_callback_operator, cp);
	parser_add_callback(cp->parser, _cpp_callback_quote, cp);
	parser_add_callback(cp->parser, _cpp_callback_directive, cp);
	parser_add_callback(cp->parser, _cpp_callback_word, cp);
	parser_add_callback(cp->parser, _cpp_callback_unknown, cp);
	return cp;
}
Esempio n. 3
0
/* cppparser_scan */
int cppparser_scan(CppParser * cp, Token ** token)
{
	if(cp->subparser != NULL)
	{
		if(cppparser_scan(cp->subparser, token) != 0)
			return 1;
		if(*token != NULL)
			return 0;
		cppparser_delete(cp->subparser); /* end of file */
		cp->subparser = NULL;
	}
	return parser_get_token(cp->parser, token);
}
Esempio n. 4
0
/* cpp_delete */
void cpp_delete(Cpp * cpp)
{
	size_t i;

	for(i = 0; i < cpp->defines_cnt; i++)
	{
		free(cpp->defines[i].name);
		free(cpp->defines[i].value);
	}
	free(cpp->defines);
	for(i = 0; i < cpp->paths_cnt; i++)
		free(cpp->paths[i]);
	free(cpp->paths);
	if(cpp->parser != NULL)
		cppparser_delete(cpp->parser);
	if(cpp->scopes != NULL)
		free(cpp->scopes);
	object_delete(cpp);
}