From 4318d16f057d2561bbf1010734cff6db72431775 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Wed, 27 May 2020 13:25:03 +0200
Subject: [PATCH] Create modules

---
 inc/lektor/reg.h         |  2 +-
 src/main/server.c        |  7 ++++---
 src/module/module_sdl2.c | 39 +++++++++++++++++++++++----------------
 src/module/repo.c        |  8 ++++++--
 4 files changed, 34 insertions(+), 22 deletions(-)

diff --git a/inc/lektor/reg.h b/inc/lektor/reg.h
index 8d4e1e20..ba8a6021 100644
--- a/inc/lektor/reg.h
+++ b/inc/lektor/reg.h
@@ -48,7 +48,7 @@ struct lkt_module {
 
 /* Call a function from a reg. */
 #define MOD_CALL(module, name, ...)     \
-    reg_call((module).reg, name, 1 + (GET_VA_COUNT(__VA_ARGS__)), (module).data, __VA_ARGS__)
+    reg_call((module).reg, name, 1 + (GET_VA_COUNT(__VA_ARGS__)), &(module).data, __VA_ARGS__)
 int reg_call(struct module_reg *reg, const char *name, int count, ...);
 
 /* Import a module, from a file (mod is a filepath) or from the __reg__ in the
diff --git a/src/main/server.c b/src/main/server.c
index 3c534073..eb9054ad 100644
--- a/src/main/server.c
+++ b/src/main/server.c
@@ -122,9 +122,10 @@ normal_launch:
     reg_import("repo", &srv.repo_mod.reg, &srv.repo_mod.handle);
     free(module);
 
-    srv.repo_mod.data = safe_zero_malloc(sizeof(struct lkt_repo));
-    MOD_CALL(srv.repo_mod, "new", &srv, srv.repo_mod.handle);
-    MOD_CALL(srv.window_mod, "new", &srv.queue, srv.db);
+    if (MOD_CALL(srv.repo_mod, "new", &srv, srv.repo_mod.handle))
+        return 100;
+    if (MOD_CALL(srv.window_mod, "new", &srv.queue, srv.db))
+        return 101;
 
     /* Get ENV */
     /* Not working -> race condition with player module */
diff --git a/src/module/module_sdl2.c b/src/module/module_sdl2.c
index 775f1b69..718852ba 100644
--- a/src/module/module_sdl2.c
+++ b/src/module/module_sdl2.c
@@ -118,9 +118,9 @@ int
 mod_new(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    void **win_void = va_arg(copy, void **);
-    struct module_sdl2_window **win = (struct module_sdl2_window **) win_void;
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
     struct queue *queue  = va_arg(copy, struct queue *);
     volatile sqlite3 *db = va_arg(copy, volatile sqlite3 *);
     bool ret = module_sdl2_new(win, queue, db);
@@ -132,9 +132,10 @@ int
 mod_close(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
-    module_sdl2_close(win);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
+    module_sdl2_close(*win);
     va_end(copy);
     return 0;
 }
@@ -143,9 +144,10 @@ int
 mod_free(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
-    module_sdl2_free(win);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
+    module_sdl2_free(*win);
     va_end(copy);
     return 0;
 }
@@ -154,9 +156,10 @@ int
 mod_toggle_pause(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
-    bool ret = module_sdl2_toggle_pause(win);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
+    bool ret = module_sdl2_toggle_pause(*win);
     va_end(copy);
     return ! ret;
 }
@@ -165,10 +168,11 @@ int
 mod_load_file(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
     const char *file = va_arg(copy, const char *);
-    bool ret = module_sdl2_load_file(win, file);
+    bool ret = module_sdl2_load_file(*win, file);
     va_end(copy);
     return ! ret;
 }
@@ -177,10 +181,11 @@ int
 mod_set_volume(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
     int volume = va_arg(copy, int);
-    bool ret = module_sdl2_set_volume(win, volume);
+    bool ret = module_sdl2_set_volume(*win, volume);
     va_end(copy);
     return ! ret;
 }
@@ -189,10 +194,11 @@ int
 mod_get_duration(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
     int *duration = va_arg(copy, int *);
-    bool ret = module_sdl2_get_duration(win, duration);
+    bool ret = module_sdl2_get_duration(*win, duration);
     va_end(copy);
     return ! ret;
 }
@@ -201,10 +207,11 @@ int
 mod_get_elapsed(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
     int *elapsed = va_arg(copy, int *);
-    bool ret = module_sdl2_get_elapsed(win, elapsed);
+    bool ret = module_sdl2_get_elapsed(*win, elapsed);
     va_end(copy);
     return ! ret;
 }
diff --git a/src/module/repo.c b/src/module/repo.c
index dba9a1b9..84f8967a 100644
--- a/src/module/repo.c
+++ b/src/module/repo.c
@@ -96,9 +96,13 @@ load_repo_https(va_list *va)
 {
     va_list copy;
     va_copy(copy, *va);
-    struct lkt_repo *repo = va_arg(copy, void *);
+    struct lkt_repo **repo = (struct lkt_repo **) va_arg(copy, void **);
     struct lkt_state *srv = va_arg(copy, struct lkt_state *);
-    int ret = repo_new(repo, srv);
+    if (!*repo)
+        *repo = malloc(sizeof(struct lkt_repo));
+    if (!*repo)
+        return 1;
+    int ret = repo_new(*repo, srv);
     va_end(copy);
     return ret;
 }
-- 
GitLab