summaryrefslogtreecommitdiffhomepage
path: root/mcc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mcc.cpp')
-rw-r--r--mcc.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/mcc.cpp b/mcc.cpp
index da2a981..fa9b0b8 100644
--- a/mcc.cpp
+++ b/mcc.cpp
@@ -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;
}