From: fennecdjay Date: Thu, 7 Mar 2019 13:30:48 +0000 (+0100) Subject: :art: Put arg in gwion X-Git-Tag: nightly~2753^2~19 X-Git-Url: http://10.11.0.4:5575/?a=commitdiff_plain;h=f4ae58dd07cbb31c90e765a36d8bcb9f85721bc1;p=gwion.git :art: Put arg in gwion --- diff --git a/include/gwion.h b/include/gwion.h index 4f5bc951..7b0146b3 100644 --- a/include/gwion.h +++ b/include/gwion.h @@ -8,17 +8,14 @@ typedef struct Gwion_* Gwion; struct Gwion_ { PlugInfo* plug; DriverInfo* di; -// struct Arg* arg; - + struct Arg_* arg; // sym // mem Env env; Emitter emit; VM* vm; }; -ANN void gwion_init(const Gwion, struct Arg_*); -ANN m_bool gwion_audio(const Gwion gwion); -ANN void gwion_run(const Gwion gwion); -ANN m_bool gwion_engine(const Gwion gwion); -ANN void gwion_release(const Gwion gwion); +ANN m_bool gwion_ini(const Gwion, int, char**); +ANN void gwion_run(const Gwion gwion); +ANN void gwion_end(const Gwion gwion); #endif diff --git a/src/gwion.c b/src/gwion.c index 04084e30..d1c5d28a 100644 --- a/src/gwion.c +++ b/src/gwion.c @@ -10,7 +10,7 @@ #include "driver.h" #include "arg.h" #include "gwion.h" - +#include "compile.h" #ifdef VMBENCH #include @@ -35,18 +35,12 @@ ANN static DriverInfo* new_driverinfo(void) { return di; } -ANN void gwion_init(const Gwion gwion, Arg* arg) { - gwion->vm = new_vm(); - gwion->emit = new_emitter(); - gwion->env = new_env(); - gwion->emit->env = gwion->env; - gwion->vm->gwion = gwion; - gwion->env->gwion = gwion; - gwion->di = new_driverinfo(); - gwion->plug = (PlugInfo*)xmalloc(sizeof(PlugInfo)); - arg_parse(arg, gwion->di); - plug_discover(gwion->plug, &arg->lib); - shreduler_set_loop(gwion->vm->shreduler, arg->loop); +ANN static Arg* new_arg(int argc, char** argv) { + Arg *arg = (Arg*)xcalloc(1, sizeof(Arg)); + arg->argc = argc; + arg->argv = argv; + arg->loop = -1; + return arg; } ANN m_bool gwion_audio(const Gwion gwion) { @@ -69,10 +63,35 @@ ANN m_bool gwion_audio(const Gwion gwion) { return GW_OK; } -ANN m_bool gwion_engine(const Gwion gwion) { +ANN static inline m_bool gwion_engine(const Gwion gwion) { return type_engine_init(gwion->vm, &gwion->plug->vec[GWPLUG_IMPORT]) > 0; } +ANN static inline void gwion_compile(const Gwion gwion) { + for(m_uint i = 0; i < vector_size(&gwion->arg->add); i++) + compile_filename(gwion, (m_str)vector_at(&gwion->arg->add, i)); +} +ANN m_bool gwion_ini(const Gwion gwion, int argc, char** argv) { + gwion->vm = new_vm(); + gwion->emit = new_emitter(); + gwion->env = new_env(); + gwion->emit->env = gwion->env; + gwion->vm->gwion = gwion; + gwion->env->gwion = gwion; + gwion->di = new_driverinfo(); + gwion->arg = new_arg(argc, argv); + gwion->plug = (PlugInfo*)xmalloc(sizeof(PlugInfo)); + arg_parse(gwion->arg, gwion->di); + plug_discover(gwion->plug, &gwion->arg->lib); + shreduler_set_loop(gwion->vm->shreduler, gwion->arg->loop); + if(gwion_audio(gwion) > 0 && gwion_engine(gwion)) { + plug_ini(gwion, &gwion->arg->mod); + gwion_compile(gwion); + return GW_OK; + } + return GW_ERROR; +} + ANN void gwion_run(const Gwion gwion) { VM* vm = gwion->vm; vm->is_running = 1; @@ -87,9 +106,11 @@ ANN static void free_driverinfo(DriverInfo* di, VM* vm) { xfree(di->driver); xfree(di); } -ANN void gwion_release(const Gwion gwion) { +ANN void gwion_end(const Gwion gwion) { free_driverinfo(gwion->di, gwion->vm); plug_end(gwion); + arg_release(gwion->arg); + xfree(gwion->arg); free_env(gwion->env); free_emitter(gwion->emit); free_vm(gwion->vm); diff --git a/src/main.c b/src/main.c index c5f554e2..95f9b74d 100644 --- a/src/main.c +++ b/src/main.c @@ -4,10 +4,7 @@ #include "oo.h" #include "vm.h" #include "env.h" -#include "compile.h" -#include "driver.h" #include "gwion.h" -#include "arg.h" static struct Gwion_ gwion; @@ -16,17 +13,10 @@ static void sig(int unused __attribute__((unused))) { } int main(int argc, char** argv) { - Arg arg = { .argc = argc, .argv=argv, .loop=-1 }; - gwion_init(&gwion, &arg); signal(SIGINT, sig); signal(SIGTERM, sig); - if(gwion_audio(&gwion) > 0 && gwion_engine(&gwion)) { - plug_ini(&gwion, &arg.mod); - for(m_uint i = 0; i < vector_size(&arg.add); i++) - compile_filename(&gwion, (m_str)vector_at(&arg.add, i)); + if(gwion_ini(&gwion, argc, argv) > 0) gwion_run(&gwion); - } - gwion_release(&gwion); - arg_release(&arg); + gwion_end(&gwion); return 0; }