/* 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); }
/* 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; }
/* 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); }
/* 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); }