From d44b77d2405b54ec72f5c8f2d7451928c3a090f4 Mon Sep 17 00:00:00 2001 From: josh Date: Wed, 13 Jan 2010 22:06:05 +0000 Subject: [PATCH] successfully compiling tests/Initial.jtl!! git-svn-id: svn://anubis/jtlc/trunk@17 f5bc74b8-7b62-4e90-9214-7121d538519f --- main/jtlc.cc | 59 ++++++++++++++++++++++++++++++++++++++++++++--- tests/Initial.jtl | 2 +- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/main/jtlc.cc b/main/jtlc.cc index 6f65df4..ebe9cf0 100644 --- a/main/jtlc.cc +++ b/main/jtlc.cc @@ -2,6 +2,8 @@ #include /* tmpfile() */ #include /* exit() */ #include /* unlink() */ +#include +#include /* waitpid() */ #include #include "util/refptr.h" #include "parser/parser.h" @@ -9,7 +11,9 @@ using namespace std; int usage(); -void compile(const char * filename); +string compile(const char * filename); +void ccompile(const char * c_file, const char * obj_file); +void link(vector & obj_files, const char * out_file); int usage() { @@ -33,20 +37,69 @@ int main(int argc, char * argv[]) usage(); } + vector obj_files; for (int i = 0, num = source_files.size(); i < num; i++) { - compile(source_files[i]); + obj_files.push_back(compile(source_files[i])); } + link(obj_files, "a.out"); return 0; } -void compile(const char * filename) +string compile(const char * filename) { string out_filename = string(filename) + ".c"; + string obj_filename = string(filename) + ".o"; FILE * out = fopen(out_filename.c_str(), "w"); refptr tree = parse(filename); tree->process(out); fclose(out); + ccompile(out_filename.c_str(), obj_filename.c_str()); // unlink(out_filename.c_str()); + return obj_filename; +} + +void ccompile(const char * c_file, const char * obj_file) +{ + int id = fork(); + const char * const args[] = {"cc", "-c", "-o", obj_file, c_file, NULL}; + if (id == 0) + { + execvp("cc", (char * const *) args); + } + else if (id > 0) + { + waitpid(id, NULL, 0); + } +} + +void link(vector & obj_files, const char * out_file) +{ + vector args; + args.push_back("-o"); + args.push_back(out_file); + for (int i = 0, sz = obj_files.size(); i < sz; i++) + { + args.push_back(obj_files[i].c_str()); + } + int sz = args.size(); + const char ** args_static = new const char * [sz + 2]; + args_static[0] = "cc"; + for (int i = 0; i < sz; i++) + { + args_static[i + 1] = args[i]; + } + args_static[sz + 1] = NULL; + + int id = fork(); + if (id == 0) + { + execvp("cc", (char * const *) args_static); + } + else if (id > 0) + { + waitpid(id, NULL, 0); + } + delete[] args_static; } diff --git a/tests/Initial.jtl b/tests/Initial.jtl index cb6549b..213494a 100644 --- a/tests/Initial.jtl +++ b/tests/Initial.jtl @@ -1,2 +1,2 @@ -c("This is C to be output by my compiler"); +c("int main() { return 42; }");