diff options
author | Elias Fleckenstein <eliasfleckenstein@web.de> | 2021-12-30 18:31:53 +0100 |
---|---|---|
committer | Elias Fleckenstein <eliasfleckenstein@web.de> | 2021-12-30 18:31:53 +0100 |
commit | ec14f2955222932bb68704cc4590ba1dbd165cd9 (patch) | |
tree | 7bc4e580170231af32305f65875bd3cb2d9d541c /src/run.c | |
parent | 4c52777ca9e52edd0bff76168d886de9757ea457 (diff) | |
download | uwu-lang-ec14f2955222932bb68704cc4590ba1dbd165cd9.tar.xz |
Allow passing arguments to program, refactor directory structure
Diffstat (limited to 'src/run.c')
-rw-r--r-- | src/run.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/run.c b/src/run.c new file mode 100644 index 0000000..7733c8d --- /dev/null +++ b/src/run.c @@ -0,0 +1,74 @@ +#include <dlfcn.h> +#include <stdlib.h> +#include <stdio.h> +#include "common/err.h" +#include "load.h" +#include "run.h" + +static void free_expression(UwUVMExpression *expr) +{ + if (expr->type == EX_FNCALL) { + for (size_t i = 0; i < expr->value.cll_value.num_args; i++) + free_expression(&expr->value.cll_value.args[i]); + + free(expr->value.cll_value.args); + } + + if (expr->type == EX_STRLIT) + free(expr->value.str_value); +} + +void run_module(const char *progname, const char *modname, size_t num_args, char *args[]) +{ + (void) num_args; + (void) args; + + Program program = load_program(progname, modname); + + UwUVMValue (*uwuvm_call_function)(UwUVMFunction *, size_t, UwUVMExpression *, UwUVMArgs *) = dlsym(program.api_library, "uwuvm_call_function"); + char *(*uwuvm_print_value )(UwUVMValue ) = dlsym(program.api_library, "uwuvm_print_value" ); + void (*uwuvm_delet_value )(UwUVMValue ) = dlsym(program.api_library, "uwuvm_delet_value" ); + + char *err = dlerror(); + if (err) + error("library error: %s\n", err); + + UwUVMExpression arg_expressions[num_args]; + + for (size_t i = 0; i < num_args; i++) + arg_expressions[i] = (UwUVMExpression) { + .type = EX_STRLIT, + .value = { + .str_value = args[i], + }, + }; + + UwUVMValue result = uwuvm_call_function(program.main_function, num_args, arg_expressions, NULL); + + char *str = uwuvm_print_value(result); + printf("%s\n", str); + free(str); + + uwuvm_delet_value(result); + + for (size_t i = 0; i < program.num_functions; i++) { + UwUVMFunction *function = program.functions[i]; + + if (function->type == MODULE_PLAIN) { + free_expression(function->value.plain); + free(function->value.plain); + } + + free(function); + } + + free(program.functions); + + for (size_t i = 0; i < program.num_libraries; i++) + dlclose(program.libraries[i]); + + if (program.libraries) + free(program.libraries); + + dlclose(program.api_library); +} |