]> Nishi Git Mirror - gwion.git/commitdiff
:art: Put arg in gwion
authorfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 7 Mar 2019 13:30:48 +0000 (14:30 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 7 Mar 2019 13:30:48 +0000 (14:30 +0100)
include/gwion.h
src/gwion.c
src/main.c

index 4f5bc951f4400a5d65ddb0926b882cb05a0b5afb..7b0146b3139cfb10804baec7fd53d674d9e162ea 100644 (file)
@@ -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
index 04084e30679917e96260bda0618fb58c760239ad..d1c5d28a3f1c2893c8fd47f3cc0425a9472c0c4c 100644 (file)
@@ -10,7 +10,7 @@
 #include "driver.h"
 #include "arg.h"
 #include "gwion.h"
-
+#include "compile.h"
 
 #ifdef VMBENCH
 #include <time.h>
@@ -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);
index c5f554e2625b37b5867308e8a07efdca906103a0..95f9b74d0e44bc7d617ac41d5a4bec2362766c93 100644 (file)
@@ -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;
 }