bool language_uit::parse(const std::string &filename) { #ifdef _MSC_VER std::ifstream infile(widen(filename).c_str()); #else std::ifstream infile(filename.c_str()); #endif if(!infile) { error("failed to open input file", filename); return true; } std::pair<language_filest::filemapt::iterator, bool> result=language_files.filemap.insert( std::pair<std::string, language_filet>(filename, language_filet())); language_filet &lf=result.first->second; lf.filename=filename; lf.language=get_language_from_filename(filename); if(lf.language==NULL) { error("failed to figure out type of file", filename); return true; } languaget &language=*lf.language; status("Parsing", filename); if(language.parse(infile, filename, get_message_handler())) { if(get_ui()==ui_message_handlert::PLAIN) std::cerr << "PARSING ERROR" << std::endl; return true; } lf.get_modules(); return false; }
bool get_goto_modelt::operator()(const std::vector<std::string> &files) { if(files.empty()) { error() << "Please provide a program" << eom; return true; } try { std::vector<std::string> binaries, sources; binaries.reserve(files.size()); sources.reserve(files.size()); for(const auto &file : files) { if(is_goto_binary(file)) binaries.push_back(file); else sources.push_back(file); } if(!sources.empty()) { language_filest language_files; language_files.set_message_handler(get_message_handler()); for(const auto &filename : sources) { #ifdef _MSC_VER std::ifstream infile(widen(filename)); #else std::ifstream infile(filename); #endif if(!infile) { error() << "failed to open input file `" << filename << '\'' << eom; return true; } std::pair<language_filest::file_mapt::iterator, bool> result=language_files.file_map.insert( std::pair<std::string, language_filet>(filename, language_filet())); language_filet &lf=result.first->second; lf.filename=filename; lf.language=get_language_from_filename(filename); if(lf.language==NULL) { error("failed to figure out type of file", filename); return true; } languaget &language=*lf.language; language.set_message_handler(get_message_handler()); status() << "Parsing " << filename << eom; if(language.parse(infile, filename)) { error() << "PARSING ERROR" << eom; return true; } lf.get_modules(); } status() << "Converting" << eom; if(language_files.typecheck(symbol_table)) { error() << "CONVERSION ERROR" << eom; return true; } if(binaries.empty()) { if(language_files.final(symbol_table)) { error() << "CONVERSION ERROR" << eom; return true; } } } for(const auto &file : binaries) { status() << "Reading GOTO program from file" << eom; if(read_object_and_link(file, *this, get_message_handler())) return true; } if(!binaries.empty()) config.set_from_symbol_table(symbol_table); status() << "Generating GOTO Program" << eom; goto_convert(symbol_table, goto_functions, get_message_handler()); }