aboutsummaryrefslogtreecommitdiff
path: root/tomo.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-04-12 13:09:31 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-04-12 13:09:31 -0400
commit6c01eef851439549018267fdc439e4884af0c624 (patch)
tree0599dd071b8a5effb67e6a87ed1c34777eb8d8c7 /tomo.c
parent17cb6ffd88c4464c513b045f4b06c4e6e46e8f22 (diff)
Introducing the main() function
Diffstat (limited to 'tomo.c')
-rw-r--r--tomo.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/tomo.c b/tomo.c
index 37c6d4ee..07e9a1a6 100644
--- a/tomo.c
+++ b/tomo.c
@@ -31,12 +31,13 @@ static const char *cc;
static array_t get_file_dependencies(const char *filename);
static int transpile(const char *filename, bool force_retranspile);
static int compile_object_file(const char *filename, bool force_recompile);
-static int run_program(const char *filename, const char *object_files);
+static int compile_executable(const char *filename, const char *object_files);
int main(int argc, char *argv[])
{
mode_e mode = MODE_RUN;
const char *filename = NULL;
+ int program_arg_index = argc + 1;
for (int i = 1; i < argc; i++) {
if (streq(argv[i], "-t")) {
mode = MODE_TRANSPILE;
@@ -52,6 +53,7 @@ int main(int argc, char *argv[])
setenv(argv[i], eq + 1, 1);
} else {
filename = argv[i];
+ program_arg_index = i + 1;
break;
}
}
@@ -107,11 +109,23 @@ int main(int argc, char *argv[])
object_files_cord = object_files_cord ? CORD_all(object_files_cord, " ", dep, ".o") : CORD_cat(dep, ".o");
}
+ const char *object_files = CORD_to_const_char_star(object_files_cord);
+ assert(object_files);
+ int executable_status = compile_executable(filename, object_files);
+ if (executable_status != 0)
+ return executable_status;
+
if (mode == MODE_RUN) {
- const char *object_files = CORD_to_const_char_star(object_files_cord);
- assert(object_files);
- return run_program(filename, object_files);
+ char *exe_name = file_base_name(filename);
+ int num_args = argc - program_arg_index;
+ char *prog_args[num_args + 2];
+ prog_args[0] = exe_name;
+ for (int i = 0; i < num_args; i++)
+ prog_args[i+1] = argv[program_arg_index+i];
+ prog_args[num_args+1] = NULL;
+ execv(exe_name, prog_args);
}
+
return 0;
}
@@ -280,11 +294,10 @@ int compile_object_file(const char *filename, bool force_recompile)
return WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE;
}
-int run_program(const char *filename, const char *object_files)
+int compile_executable(const char *filename, const char *object_files)
{
const char *bin_name = file_base_name(filename);
- const char *run = streq(cc, "tcc") ? heap_strf("%s | tcc %s %s %s %s -run -", autofmt, cflags, ldflags, ldlibs, object_files)
- : heap_strf("%s | %s %s %s %s %s -x c - -o %s && ./%s", autofmt, cc, cflags, ldflags, ldlibs, object_files, bin_name, bin_name);
+ const char *run = heap_strf("%s | %s %s %s %s %s -x c - -o %s", autofmt, cc, cflags, ldflags, ldlibs, object_files, bin_name);
if (verbose)
printf("%s\n", run);
FILE *runner = popen(run, "w");
@@ -294,17 +307,18 @@ int run_program(const char *filename, const char *object_files)
"#include <tomo/tomo.h>\n"
"#include \"", filename, ".h\"\n"
"\n"
- "int main(int argc, const char *argv[]) {\n"
+ "int main(int argc, char *argv[]) {\n"
"(void)argc;\n"
"(void)argv;\n"
"GC_INIT();\n"
"srand(arc4random_uniform(UINT32_MAX));\n"
"srand48(arc4random_uniform(UINT32_MAX));\n"
"detect_color();\n",
- module_name, "$use();\n"
+ module_name, "$main$run(argc, argv);\n",
"return 0;\n"
"}\n"
);
+
if (verbose) {
FILE *out = popen(heap_strf("%s | bat -P --file-name=run.c", autofmt), "w");
CORD_put(program, out);