// // CLI // #include "cpp.h" #include "elf.h" #include "file.h" #include "programopts.h" #include using namespace std::string_literals; namespace { void usage() { std::cout << "Usage: mcc " << std::endl; } } int main(int argc, char* argv[]) { // Processing of options in lambdas: each do return true iff parameter was consumed std::map> option_prefixes{ {"-h", [&](const std::string& parameter) -> bool { usage(); return false; }}, }; try { CPP cpp; ProgramOpts options(argc, argv, option_prefixes); options.process(); std::vector parameters {options.nonOptionArguments()}; if (parameters.size() != 1) { usage(); return 1; } fs::path in_filename{parameters[0]}; fs::path out_filename{in_filename.parent_path() / in_filename.stem()}; if (in_filename == out_filename) throw std::runtime_error("Bad output filename: "s + out_filename.generic_string()); auto unit {File::getFile(in_filename)}; std::string unit_string(reinterpret_cast(unit.data()), unit.size()); cpp.compile(unit_string); Elf::Write(out_filename, cpp.getCode(), cpp.getData()); } catch (const std::exception& ex) { std::cout << "Error: " << ex.what() << std::endl; return 1; } return 0; }