commit c4b9af2f720b7261863f2d671b4ee24babcbec3c
parent 0aa5326a05be8deb3d1aa5a2d01cb6ddfb0738e6
Author: hhvn <dev@hhvn.uk>
Date: Fri, 7 Oct 2022 16:26:03 +0100
Save systree
Diffstat:
8 files changed, 122 insertions(+), 49 deletions(-)
diff --git a/src/data.c b/src/data.c
@@ -47,16 +47,13 @@ unsigned char settings_png[] = {
};
#define IMAGE_LOAD(name) \
- loading_update(lscr, "Loading image"); \
raw_image_##name = LoadImageFromMemory(".png", \
name##_png, sizeof(name##_png)); \
image_##name = LoadTextureFromImage(raw_image_##name); \
UnloadImage(raw_image_##name)
void
-data_load(Loader *lscr) {
- /* update main.h when adding loading steps */
- loading_update(lscr, "Loading fonts");
+data_load(void) {
font = LoadFontFromMemory(".ttf", DejaVuSansMono_ttf,
sizeof(DejaVuSansMono_ttf), FONT_SIZE, NULL, 0);
charpx = MeasureTextEx(font, ".", FONT_SIZE, FONT_SIZE/10).x + FONT_SIZE/10;
diff --git a/src/db.c b/src/db.c
@@ -1,5 +1,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
#include "main.h"
int
@@ -37,36 +39,6 @@ dbsetfloat(char *dir, char *group, char *key, float val) {
return dbsetf(dir, group, key, "%f", val);
}
-void
-dbsetbody(System *sys, Body *body) {
- char *group;
- char *parent;
-
- group = smprintf("%s/%s", sys->name, body->name);
-
- if (body->parent)
- parent = body->parent->name;
- else
- parent = sys->name;
- dbset(save->db.systems, group, "parent", parent);
-
- dbset(save->db.systems, group, "type", bodytype_strify(body));
- dbsetfloat(save->db.systems, group, "radius", body->radius);
- dbsetfloat(save->db.systems, group, "mass", body->mass);
- dbsetfloat(save->db.systems, group, "orbdays", body->orbdays);
- if (body->type == BODY_COMET) {
- dbsetfloat(save->db.systems, group, "mindist", 0 - body->mindist); /* see sys_load() */
- dbsetfloat(save->db.systems, group, "maxdist", body->maxdist);
- dbsetfloat(save->db.systems, group, "curdist", body->curdist);
- dbsetfloat(save->db.systems, group, "theta", body->theta);
- dbsetfloat(save->db.systems, group, "inward", body->inward);
- } else {
- dbsetfloat(save->db.systems, group, "dist", body->dist);
- dbsetfloat(save->db.systems, group, "curtheta", body->curtheta);
- }
- free(group);
-}
-
int
vdbgetf(char *dir, char *group, char *key, char *fmt, va_list args) {
va_list ap;
@@ -109,3 +81,48 @@ dbgetfloat(char *dir, char *group, char *key) {
dbgetf(dir, group, key, "%f", &ret);
return ret;
}
+
+int
+dbsettree(char *dir, Tree *t, Treesetter func) {
+ char *path[TREEMAX];
+ char group[PATH_MAX];
+ char *sp;
+ size_t sl, i, len;
+ int depth;
+ Tree *p;
+ int ret = 0;
+
+ for (p = NULL; tree_iter(t, TREEMAX, &p, &depth) != -1; ) {
+next:
+ path[depth] = p->name;
+
+ if (p->data) {
+ sl = sizeof(group);
+ sp = group;
+ for (i = 0; i <= depth; i++) {
+ len = strlen(path[i]);
+ if (len + (p->d ? strlen("index") : 0) >= sl) {
+ ret = -1;
+ warning("insufficient space to concatenate tree path\n");
+ goto next;
+ }
+
+ memcpy(sp, path[i], len);
+ if (i != depth || p->d)
+ sp[len] = '/';
+ else
+ sp[len] = '\0';
+ sp += len + 1;
+ sl -= len + 1;
+ }
+ if (p->d) {
+ len = strlen("index");
+ memcpy(sp, "index", len + 1);
+ }
+
+ func(dir, group, depth, p);
+ }
+ }
+
+ return ret;
+}
diff --git a/src/main.c b/src/main.c
@@ -1,11 +1,14 @@
#include <stdio.h>
#include <time.h>
#include <raylib.h>
+#include <signal.h>
#include "main.h"
#define DEFSAVE "default"
Save *save = NULL;
+int sigint = 0;
+int sigterm = 0;
void
warning(char *fmt, ...) {
@@ -17,22 +20,32 @@ warning(char *fmt, ...) {
va_end(ap);
}
+static void
+sighandler(int signal) {
+ switch (signal) {
+ case SIGINT: sigint = 1; break;
+ case SIGTERM: sigterm = 1; break;
+ }
+}
+
int
main(void) {
int view_prev;
- Loader *loader;
+ struct sigaction sa;
- loader = loading_open(DATA_LOAD_STEPS + SAVE_READ_STEPS + 3, "Initializing UI");
+ sa.sa_handler = sighandler;
+ sa.sa_flags = SA_RESTART;
+ sigemptyset(&sa.sa_mask);
+ sigaction(SIGINT, &sa, NULL);
+ sigaction(SIGTERM, &sa, NULL);
ui_init();
- data_load(loader);
+ data_load();
if (!save_exists(DEFSAVE))
save_create(DEFSAVE);
- save_read(loader, DEFSAVE);
-
- loading_close(loader);
+ save_read(DEFSAVE);
/* The window is hidden so that only the loading bar is shown. Hiding
* and unhiding the window also has the added effect of making it
diff --git a/src/main.h b/src/main.h
@@ -18,6 +18,8 @@
/* main.c */
extern Save *save;
+extern int sigint;
+extern int sigterm;
void warning(char *fmt, ...);
/* str.c */
@@ -43,6 +45,7 @@ void editins(wchar_t *str, int *len, int *cur, int size, wchar_t c);
Tree * tree_add_child(Tree *t, char *name, int type, void *data, Tree **ptr);
int tree_delete(Tree **t, int freedata);
int tree_delete_r(Tree **t, int freedata);
+int tree_iter(Tree *t, int maxdepth, Tree **p, int *depth);
/* ui.c */
#define VIEWS_MAX_WIDTH (UI_VIEW_LAST*100)
@@ -145,6 +148,7 @@ Vector2 sys_get_vector(Body *body);
Polar sys_get_polar(Body *body);
System *sys_init(char *name);
System *sys_load(System *s, char *name);
+void sys_tree_setter(char *dir, char *group, int depth, Tree *t);
System *sys_get(char *name);
System *sys_default(void);
@@ -156,7 +160,7 @@ void body_sort(Body **bodies, size_t n);
/* save.c */
#define SAVE_READ_STEPS 2
-void save_read(Loader *lscr, char *dir);
+void save_read(char *dir);
void save_write(void);
int save_exists(char *name);
int save_create(char *name);
@@ -174,7 +178,7 @@ extern Texture image_design;
extern Texture image_sys;
extern Texture image_settings;
#define DATA_LOAD_STEPS (1 + 7)
-void data_load(Loader *lscr);
+void data_load(void);
void data_unload(void);
/* db.c */
@@ -182,11 +186,11 @@ int vdbsetf(char *dir, char *group, char *key, char *fmt, va_list args);
int dbsetf(char *dir, char *group, char *key, char *fmt, ...);
int dbsetint(char *dir, char *group, char *key, int val);
int dbsetfloat(char *dir, char *group, char *key, float val);
-void dbsetbody(System *sys, Body *body);
int vdbgetf(char *dir, char *group, char *key, char *fmt, va_list args);
int dbgetf(char *dir, char *group, char *key, char *fmt, ...);
int dbgetint(char *dir, char *group, char *key);
float dbgetfloat(char *dir, char *group, char *key);
+int dbsettree(char *dir, Tree *t, Treesetter func);
/* loading.c */
Loader *loading_open(int steps, char *initstr);
diff --git a/src/save.c b/src/save.c
@@ -24,7 +24,7 @@ save_free(void) {
}
void
-save_read(Loader *lscr, char *name) {
+save_read(char *name) {
char dir[PATH_MAX];
char *str;
@@ -38,13 +38,11 @@ save_read(Loader *lscr, char *name) {
memset(&save->systems, 0, sizeof(save->systems));
- loading_update(lscr, "Initializing DB");
dbdeclare(dir);
save->db.dir = nstrdup(dir);
save->db.races = smprintf("%s/Races", dir);
save->db.systems = smprintf("%s/Systems", dir);
save->db.fleets = smprintf("%s/Fleets", dir);
- loading_update(lscr, "Loading systems");
if ((str = dbget(save->db.dir, "index", "homesystem")))
save->homesys = sys_get(str);
return;
@@ -54,6 +52,7 @@ void
save_write(void) {
if (view_main.sys)
dbset(save->db.dir, "index", "selsystem", view_main.sys->name);
+ dbsettree(save->db.systems, &save->systems, sys_tree_setter);
dbwrite(save->db.dir);
}
diff --git a/src/struct.h b/src/struct.h
@@ -2,6 +2,8 @@
#include <sys/types.h>
/* tree.c */
+#define TREEMAX 64 /* max depth: not actually enforced anywhere, anything
+ deeper than this will get ignored in some places */
typedef struct Tree Tree;
struct Tree {
Tree *p; /* previous */
@@ -14,6 +16,9 @@ struct Tree {
Tree *n; /* next */
};
+/* typedef void (*Treegetter)(char *dir, char *group, int depth, Tree *t); */
+typedef void (*Treesetter)(char *dir, char *group, int depth, Tree *t);
+
/* system.c */
enum {
SYSTREE_SYS,
diff --git a/src/system.c b/src/system.c
@@ -109,8 +109,8 @@ sys_load(System *s, char *name) {
if (!s) s = sys_init(name);
- s->lypos.x = strnum(dbget(save->db.systems, name, "x"));
- s->lypos.y = strnum(dbget(save->db.systems, name, "y"));
+ s->lypos.x = dbgetfloat(save->db.systems, name, "x");
+ s->lypos.y = dbgetfloat(save->db.systems, name, "y");
dir = smprintf("%s/", s->name);
blen = dblistgroups_f(&bname, save->db.systems, &filter_bodyinsystem, dir);
@@ -202,6 +202,44 @@ sys_load(System *s, char *name) {
return s;
}
+void
+sys_tree_setter(char *dir, char *group, int depth, Tree *t) {
+ System *s;
+ Body *b;
+ char *parent;
+
+ switch (t->type) {
+ case SYSTREE_SYS:
+ s = t->data;
+ dbsetfloat(dir, group, "x", s->lypos.x);
+ dbsetfloat(dir, group, "y", s->lypos.y);
+ case SYSTREE_BODY:
+ b = t->data;
+
+ if (body->parent) {
+ parent = b->parent->name;
+ } else {
+ s = t->u->data;
+ parent = s->name;
+ }
+ dbset(save->db.systems, group, "parent", parent);
+
+ dbsetfloat(dir, group, "radius", b->radius);
+ dbsetfloat(dir, group, "mass", b->mass);
+ dbsetfloat(dir, group, "orbdays", b->orbdays);
+ if (b->type == BODY_COMET) {
+ dbsetfloat(dir, group, "mindist", b->mindist);
+ dbsetfloat(dir, group, "maxdist", b->maxdist);
+ dbsetfloat(dir, group, "curdist", b->curdist);
+ dbsetfloat(dir, group, "theta", b->theta);
+ dbsetfloat(dir, group, "inward", b->inward);
+ } else {
+ dbsetfloat(dir, group, "dist", b->dist);
+ dbsetfloat(dir, group, "curtheta", b->curtheta);
+ }
+ }
+}
+
System *
sys_get(char *name) {
/* For now, call sys_load. In future, get the system via save. */
diff --git a/src/ui.c b/src/ui.c
@@ -89,7 +89,7 @@ ui_update_focus(enum UiElements type, void *p) {
int
ui_loop(void) {
- if (WindowShouldClose())
+ if (WindowShouldClose() || sigint || sigterm)
return 0;
ffree();