aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTristan Riehs <tristan.riehs@bordeaux-inp.fr>2024-06-20 20:39:08 +0900
committerTristan Riehs <tristan.riehs@bordeaux-inp.fr>2024-06-20 20:39:08 +0900
commit82b1cce1bc5c91c0b56501f5dab912390206ace5 (patch)
treeccb0b9b293b6dccfdc95cbd657fb63227274dc41 /src
parent685ec81e127c9409a91299a5ac8415bb94f55ad9 (diff)
Use cli and gui as shared libraries
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am27
-rw-r--r--src/calculer.c34
-rw-r--r--src/cli.c9
-rw-r--r--src/disp.c21
-rw-r--r--src/ray.c24
5 files changed, 73 insertions, 42 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index a2817d3..7094734 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,5 +1,6 @@
bin_PROGRAMS = calculer
AM_CFLAGS = -Wall -Wextra
+calculer_CFLAGS = $(AM_CFLAGS)
AM_LDFLAGS =
calculer_SOURCES = calculer.c disp.c
@@ -7,16 +8,32 @@ if DEBUG_COND
noinst_LTLIBRARIES = ray.la
ray_la_SOURCES = ray.c
ray_la_LDFLAGS = -module -rpath @abs_srcdir@ -lraylib
-else
+
+noinst_LTLIBRARIES += cli.la
+cli_la_SOURCES = cli.c
+cli_la_LDFLAGS = -module -rpath @abs_srcdir@
+
+if USE_READLINE_COND
+cli_la_LDFLAGS += -lreadline
+else # USE_READLINE_COND
+EXTRA_cli_la_SOURCES = linenoise.c
+cli_la_AM_CFLAGS = -I../linenoise/
+BUILT_SOURCES: linenoise_lib.c
+linenoise_lib.c:
+ cp ../linenoise/linenoise.c ./$@
+endif # USE_READLINE_COND
+
+else # DEBUG_COND
AM_CFLAGS += -DNDEBUG -Wno-unused-variable
-endif
if USE_READLINE_COND
AM_LDFLAGS += -lreadline
-else
+else # USE_READLINE_COND
calculer_SOURCES += linenoise.c
AM_CFLAGS += -I../linenoise/
BUILT_SOURCES: linenoise.c
linenoise.c:
- cp ../linenoise/linenoise.c .
-endif
+ cp ../linenoise/linenoise.c ./$@
+endif # USE_READLINE_COND
+
+endif # DEBUG_COND
diff --git a/src/calculer.c b/src/calculer.c
index de2dcf8..eab2bde 100644
--- a/src/calculer.c
+++ b/src/calculer.c
@@ -18,6 +18,7 @@
#include "config.h"
#include <assert.h>
+#include <limits.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -25,7 +26,6 @@
#include <time.h>
#include <unistd.h>
-#include "_readline.h"
#include "disp.h"
static int lower = 0;
@@ -187,43 +187,27 @@ main(int argc, char *argv[])
logfile = fopen(logpath, "a");
assert(logfile); /* TODO: handle non-fatal error properly */
disp = get_disp(disp_name);
+ disp->init();
while (1)
{
- char prompt[32] = {0};
int x, y, res;
- char *input;
- int input_val;
+ int input;
x = calculer_rand();
y = calculer_rand();
res = x+y;
-
- sprintf(prompt, "%d + %d = ", x, y);
+ disp->display_calc(x, y);
void *measure_data = measure_before();
- input = readline(prompt);
-
- if ((!input) || (*input == '\0'))
+ input = disp->read_input();
+ if (input == INT_MAX)
{
- free(input);
+ disp->destroy();
fclose(logfile);
exit(0);
}
-
- input_val = atoi(input);
- if (measure_after(measure_data, input_val == res))
- {
- free(input);
- fclose(logfile);
- exit(1);
- }
-
- if (input_val == res)
- printf("RIGHT\n");
- else
- printf("WRONG\n");
-
- free(input);
+ measure_after(measure_data, input == res);
+ disp->display_res(input == res, 0);
}
fclose(logfile);
diff --git a/src/cli.c b/src/cli.c
index 902a693..af8522b 100644
--- a/src/cli.c
+++ b/src/cli.c
@@ -17,21 +17,28 @@
#include "config.h"
#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
#include "_readline.h"
+#include "disp.h"
void init(void) {}
void
display_calc(int x, int y)
{
- printf(prompt, "%d + %d = ", x, y);
+ printf("%d + %d = ", x, y);
}
int
read_input(void)
{
char *txt = readline("");
+
+ if ((!txt) || (*txt == '\0'))
+ return INT_MAX;
+
return atoi(txt);
}
diff --git a/src/disp.c b/src/disp.c
index 6710f40..27f74e4 100644
--- a/src/disp.c
+++ b/src/disp.c
@@ -24,12 +24,14 @@
#include "disp.h"
-#define dlsym_and_check(dest, name) \
- dest->name = dlsym(dest->dl_handle, #name); \
- if (!dest->name) { \
- dlclose(dest->dl_handle); \
- free(dest); \
- return NULL; \
+#define dlsym_and_check(dest, name) \
+ dest->name = dlsym(dest->dl_handle, #name); \
+ if ((!dest->name) || (dest->name == dest->dl_handle)) { \
+ char *msg = dlerror(); \
+ fprintf(stderr, "calculer: %s\n", msg); \
+ dlclose(dest->dl_handle); \
+ free(dest); \
+ return NULL; \
}
struct disp *
@@ -37,10 +39,10 @@ get_disp(char *disp_name)
{
#ifndef NDEBUG
/* displays are shared libraries */
- char so_path[16] = {0};
- strcpy(so_path, "./");
+ char so_path[64] = {0};
+ strcpy(so_path, "./src/.libs/");
strcat(so_path, disp_name);
- strcat(so_path, ".la");
+ strcat(so_path, ".so.0.0.0");
void *handle = dlopen(so_path, RTLD_LAZY);
if (!handle)
@@ -52,6 +54,7 @@ get_disp(char *disp_name)
struct disp *disp = malloc(sizeof(*disp));
disp->dl_handle = handle;
+ dlsym_and_check(disp, init);
dlsym_and_check(disp, display_calc);
dlsym_and_check(disp, read_input);
dlsym_and_check(disp, display_res);
diff --git a/src/ray.c b/src/ray.c
index ad69902..81cc808 100644
--- a/src/ray.c
+++ b/src/ray.c
@@ -16,17 +16,29 @@
*/
#include "config.h"
+#include <limits.h>
#include <raylib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
#include "disp.h"
#define DEFAULT_HEIGHT 200
-#define DEFAULT_WIDTH 16*9/DEFAULT_HEIGHT
+#define DEFAULT_WIDTH 16*DEFAULT_HEIGHT/9
void
init(void)
{
+ printf("info: raylib interface initialized\n");
InitWindow(DEFAULT_WIDTH, DEFAULT_HEIGHT, "calculer");
+
+ if (!IsWindowReady())
+ {
+ fprintf(stderr, "calculer: error initialiazing Raylib \
+window\n");
+ exit(1);
+ }
SetTargetFPS(24);
}
@@ -39,7 +51,15 @@ display_calc(int x, int y)
int
read_input(void)
{
-
+ if (!WindowShouldClose())
+ {
+ sleep(1);
+ return 0;
+ }
+ else
+ {
+ return INT_MAX;
+ }
}
void