diff options
Diffstat (limited to 'mcc.cpp')
-rw-r--r-- | mcc.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
@@ -1,6 +1,50 @@ +// // CLI +// + +#include "cpp.h" +#include "elf.h" +#include "file.h" + +#include <iostream> + +using namespace std::string_literals; + +namespace { + +void usage() { + std::cout << "Usage: mcc <translation_unit>" << std::endl; +} + +} int main(int argc, char* argv[]) { + try { + CPP cpp; + + if (argc != 2) { + usage(); + return 1; + } + + fs::path in_filename{argv[1]}; + 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<char*>(unit.data()), unit.size()); + + cpp.translate(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; } |