From 6d958c8466fef11755cbc1cbdf8cf757c5b9bc1a Mon Sep 17 00:00:00 2001 From: Jean Sirmai Date: Tue, 4 Jun 2024 22:40:15 +0200 Subject: [PATCH] WIP: trying to include : graph_stack, parsing but : undefined reference to symbol 'epoxy_glDeleteBuffers' --- callback.d | 3 - callback.o | Bin 17520 -> 0 bytes contain.d | 3 - contain.h | 2 + contain.o | Bin 42424 -> 0 bytes dimers random walk.xml | 118 ++++++++++ display.d | 3 - display.o | Bin 35072 -> 0 bytes graph_area.c | 4 +- graph_area.d | 3 - graph_area.h | 17 +- graph_area.o | Bin 19928 -> 0 bytes graph_stack.c.todo | 333 ++++++++++++++++++++++++++++ in_depth.d | 1 - in_depth.o | Bin 7192 -> 0 bytes main.d | 1 - main.o | Bin 9336 -> 0 bytes manifest.scm | 30 +++ myprogram | Bin 86296 -> 0 bytes parsing.c.todo | 483 +++++++++++++++++++++++++++++++++++++++++ parsing.h.todo | 39 ++++ texts.d | 1 - texts.o | Bin 5944 -> 0 bytes tree.d | 1 - tree.o | Bin 47616 -> 0 bytes 25 files changed, 1016 insertions(+), 26 deletions(-) delete mode 100644 callback.d delete mode 100644 callback.o delete mode 100644 contain.d delete mode 100644 contain.o create mode 100644 dimers random walk.xml delete mode 100644 display.d delete mode 100644 display.o delete mode 100644 graph_area.d delete mode 100644 graph_area.o create mode 100644 graph_stack.c.todo delete mode 100644 in_depth.d delete mode 100644 in_depth.o delete mode 100644 main.d delete mode 100644 main.o create mode 100644 manifest.scm delete mode 100755 myprogram create mode 100644 parsing.c.todo create mode 100644 parsing.h.todo delete mode 100644 texts.d delete mode 100644 texts.o delete mode 100644 tree.d delete mode 100644 tree.o diff --git a/callback.d b/callback.d deleted file mode 100644 index 79a723e..0000000 --- a/callback.d +++ /dev/null @@ -1,3 +0,0 @@ -callback.o: callback.c tree.h \ - /gnu/store/fkmpkdav2zmz1k72989bdgpdrfac7rz1-glib-2.78.0/include/glib-2.0/glib.h \ - display.h contain.h texts.h in_depth.h diff --git a/callback.o b/callback.o deleted file mode 100644 index b0ee77b632644b393c46aeabbbe45f6cc2db552f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17520 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 diff --git a/contain.d b/contain.d deleted file mode 100644 index 80faf3a..0000000 --- a/contain.d +++ /dev/null @@ -1,3 +0,0 @@ -contain.o: contain.c tree.h \ - /gnu/store/fkmpkdav2zmz1k72989bdgpdrfac7rz1-glib-2.78.0/include/glib-2.0/glib.h \ - display.h contain.h texts.h callback.h diff --git a/contain.h b/contain.h index 4e7e9d7..75dbd48 100644 --- a/contain.h +++ b/contain.h @@ -7,6 +7,8 @@ /* */ /******************************************************************************/ +#include + #define W 1920 #define H 960 #define W_IMAGE W - 320 diff --git a/contain.o b/contain.o deleted file mode 100644 index b275591a6ad0ab5ff4832380dd28b14a00ac1162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42424 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%0DOu#&Yr_7 z;e0NF|8I_82QCi}V6gV)16SwxGvJ0CF9SY_;~#*}5CMWpS{4H#i;u$B~B|w}A0e#Q86R<3$~(XZL-7BTg-Xpns)RCHbWBP(B-YE5zxt zEf9Zu#HoG-=sR(I8E_TEsgFFwsew54*#`Q49N!FlAaK_28^Onn<9mU-ar`*&0FIvr zzKrA7fN$eCdrmZs9ZERvGcdxF!`-wCEAhtsp?r1KG{TtzNgT<_n+|xf?g9i>z4@F&lqrgIu(#ImgA2=KZ)bvupe;cIJ+M14P1(NHX|?g zd*hLuevUM)RUn8(oc8-2;Hx;E1AHBD=0A#7Ldp(~PXL~ZI8DuXv05OwggBMX0{vT# z2Lb<$IQ4M`pVsP<2^P<4&=2MKCg9@{r#_zG{; z8uafz#A%+{_ZALuoc+$-an7H8Kk6dKr$N2>h|3UvxVTOzh*KYSe`gZM_k)i&;?$=vdC?M#IQ3!IueNhM4}4A`PJM<^6H+cBPJKRr zzJlXlfd4|A`i!O~q_pZId8ab!(}n&aMHe{hcUw3gFy{DK&|7i52>3LPKL8&uj`xt3 z)H|2sOdrMZP2jVZ<7~Wb->o_B*X-IKC9(xx#V!d;hfD;rLNHs7ZOwaebO> zQp!2bzUT7=ILp68O@8wh1`N$VwQd1EojESPh)9;Ja$Fho>KyL`ydQ8@FWjyYj6xhz zAP&g_ahd}7cp`A*I1Dp^JI8gzF64SS$Blt+0M6R04smYbIQ@NnT2eS}2z(#MhXFs% z@d?0FIc^U8EO3?|2T8SpJdV2oe~ma;h?i6$PV*K3dKpd01ofwRhFL)y#Hs!tiA*qn z<1xU;b36gKH^+|yU&8S;;2Stz4EzLe)-UY1pT==#X!Iq{rxtv!BYi8v;BgE=eiOV9 z@s>m%2L3NN&c6Ru&hh1-ujKeL;2(jr{{0GZw&*9BVEqDEpolo_7ilUWr8~#vfNOEQ z6L4dWS4wOI)*NTw*I2~yOjEM zdOMD10e9s19pFa5e1bC7E4+3ih2YCHklTApPGS1Ia&@)F%JV#KRZny#hi91_cKO34=o-pl+eJ1{iDs5ORp_GWA-nJR`4$eqb7t)~?T;5NSaH{&VCpCzc|1U$D2 z@`g7UMh)`=$Q1SbKV4s!tV=!Fag9uhOFGowpR16?&#*C3|84yecz&N<|B<*#v~-%S zPd_(^rCGRx<^t^~w!}33qu)oz`4*hnS z1xj?Zu=OQ#lFuuDTmLxRA7RhcF+IP2G+Dq^A(pc1xjJk`c;~eX3IALBl{ZUPVC&QN z(^RthS^L)!#(UB=FRIbMjn}^5yXUv-nRDM(fvM3&=Dri!>zf$M8ubK}^QlOpl{~TVJQYWPNsAkj(vi{X1-Z zCV=^=Mi?E}aJZlnaoGv$v;JqCwV%!Z zCKJ??Uq27lpUExY*Z)S={agRVCrN791Oe0jqmLM}^;!S@t!}!e&LH}iJYNAjW~!Gb pFMj>jgz@`6f&{JL#9yE5e?EV7H}kjkHMdh2@|$Pe3f!#Ve*x(mTuJ}{ diff --git a/dimers random walk.xml b/dimers random walk.xml new file mode 100644 index 0000000..12ae465 --- /dev/null +++ b/dimers random walk.xml @@ -0,0 +1,118 @@ + + + + + Modèle de test + + Léontine Patinette + + 2 + + 1630000000 + + 1.0 + + Ref + + + + + 0 + 9 + + + + + + + + + + + + + + + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/display.d b/display.d deleted file mode 100644 index 35b0d59..0000000 --- a/display.d +++ /dev/null @@ -1,3 +0,0 @@ -display.o: display.c tree.h \ - /gnu/store/fkmpkdav2zmz1k72989bdgpdrfac7rz1-glib-2.78.0/include/glib-2.0/glib.h \ - display.h contain.h texts.h diff --git a/display.o b/display.o deleted file mode 100644 index 5c92f89bca03ba13e280c3a3bab1d9f9ace4af25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35072 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 #include "base.h" -//#include "ui.h" -//#include "graphics.h" +#include "contain.h" +#include "graph_area.h" struct stack_index_t { long stack_id; diff --git a/graph_area.d b/graph_area.d deleted file mode 100644 index 682843f..0000000 --- a/graph_area.d +++ /dev/null @@ -1,3 +0,0 @@ -graph_area.o: graph_area.c \ - /gnu/store/fkmpkdav2zmz1k72989bdgpdrfac7rz1-glib-2.78.0/include/glib-2.0/glib.h \ - base.h diff --git a/graph_area.h b/graph_area.h index 8d622ee..9324857 100644 --- a/graph_area.h +++ b/graph_area.h @@ -172,25 +172,26 @@ void graphics_draw_plan (const int stack_id, GLuint a, GLuint b, GLuint c); * * @return shader id */ +/* static inline GLuint create_shader(const int stack_id, int type, const char *src) { GLuint shader; int status; - shader = glCreateShader(type); - glShaderSource(shader, 1, &src, NULL); - glCompileShader(shader); +////////////////////////// shader = glCreateShader(type); +////////////////////////// glShaderSource(shader, 1, &src, NULL); +////////////////////////// glCompileShader(shader); - glGetShaderiv(shader, GL_COMPILE_STATUS, &status); +////////////////////////// glGetShaderiv(shader, GL_COMPILE_STATUS, &status); if(status == GL_FALSE) { int log_len; char *buffer; - glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len); +////////////////////////// glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len); buffer = g_malloc(log_len + 1); assert (buffer); - glGetShaderInfoLog(shader, log_len, NULL, buffer); +////////////////////////// glGetShaderInfoLog(shader, log_len, NULL, buffer); g_warning("Compile failure in %s shader:\n%s", type == GL_VERTEX_SHADER ? "vertex" : "fragment", @@ -198,14 +199,14 @@ static inline GLuint create_shader(const int stack_id, int type, const char *src g_free(buffer); - glDeleteShader(shader); +////////////////////////// glDeleteShader(shader); return 0; } return shader; } - +*/ static inline void print_stack(int stack_id) { static int n = 0; diff --git a/graph_area.o b/graph_area.o deleted file mode 100644 index 714e38b3e4e6a88dd5287eda0b3c091d1ab24a90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19928 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 diff --git a/graph_stack.c.todo b/graph_stack.c.todo new file mode 100644 index 0000000..55f5db2 --- /dev/null +++ b/graph_stack.c.todo @@ -0,0 +1,333 @@ +/* + * Gem-graph OpenGL experiments + * + * Desc: GL functions + * + * Copyright (C) 2023 Arthur Menges + * Copyright (C) 2023 Adrien Bourmault + * Copyright (C) 2023 Jean Sirmai + * + * This file is part of Gem-graph. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include +#include "base.h" +#include "contain.h" +//#include "parsing.h" +#include "graph_area.h" + +#define TEST 0 + +struct graphic_stack_t *graphic_stack = NULL; +size_t graphic_stack_size = 0; +int *free_stack_slot = NULL; +size_t free_stack_slot_size = 0; + +/* + * Prints verbose human-readable debug messages + * + * @param source, XXX + * type, XXX + * id, XXX + * severity, XXX + * length, XXX + * msg, XXX + * data, XXX + * + * @return void + */ + +static void graphics_debug_callback(GLenum source, GLenum type, GLuint id, + GLenum severity, GLsizei length, + const GLchar *msg, const void *data) +{ + const char *errsource; + const char *errtype; + const char *errseverity; + const GLubyte *string; + GLenum code; + + switch (source) { + case GL_DEBUG_SOURCE_API: errsource = "API"; break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: errsource = "WINDOW SYSTEM"; break; + case GL_DEBUG_SOURCE_SHADER_COMPILER: errsource = "SHADER COMPILER"; break; + case GL_DEBUG_SOURCE_THIRD_PARTY: errsource = "THIRD PARTY"; break; + case GL_DEBUG_SOURCE_APPLICATION: errsource = "APPLICATION"; break; + case GL_DEBUG_SOURCE_OTHER: errsource = "UNKNOWN"; break; + default: errsource = "UNKNOWN"; break; + } + + switch (type) { + case GL_DEBUG_TYPE_ERROR: errtype = "ERROR"; break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: errtype = "DEPRECATED BEHAVIOR";break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: errtype = "UNDEFINED BEHAVIOR"; break; + case GL_DEBUG_TYPE_PORTABILITY: errtype = "PORTABILITY"; break; + case GL_DEBUG_TYPE_PERFORMANCE: errtype = "PERFORMANCE"; break; + case GL_DEBUG_TYPE_OTHER: errtype = "OTHER"; break; + case GL_DEBUG_TYPE_MARKER: errtype = "MARKER"; break; + default: errtype = "UNKNOWN"; break; + } + + switch (severity) { + case GL_DEBUG_SEVERITY_HIGH: errseverity = "CRITICAL"; break; + case GL_DEBUG_SEVERITY_MEDIUM: errseverity = "ERROR"; break; + case GL_DEBUG_SEVERITY_LOW: errseverity = "WARNING"; break; + case GL_DEBUG_SEVERITY_NOTIFICATION: errseverity = "INFO"; break; + default: errseverity = "UNKNOWN"; break; + } + + code = glGetError(); + string = gluErrorString(code); + + g_printerr("[%s] %s (%s) from %s: %s\n", + errseverity, string, errtype, errsource, msg); +} + +/* -------------------------------------------------------------------------- */ + +/* + * Initializes graphical stack + * + * @param gl_area, ptr to the gl_area widget + * + * @return id if initialized + */ +int graphics_init(void *error_buffer) +{ + int cur_id = 0; + struct graphic_stack_t *stack; + + /* g_printerr("[debug] graphics_init()\n"); */ + + if (graphic_stack == NULL) { + graphic_stack = g_malloc0(sizeof(struct graphic_stack_t)); + graphic_stack_size = 1; + /* g_printerr("[debug] graphics_init(): init graphic_stack @ %p\n", graphic_stack); */ + } else { + // Check if there are free slots + if (free_stack_slot_size) { + // We get the last free slot registered + cur_id = free_stack_slot[free_stack_slot_size-1]; + // Unregister it (ofc) + free_stack_slot = g_realloc(free_stack_slot, + free_stack_slot_size-- * + sizeof(int)); + } else { + cur_id = graphic_stack_size; + graphic_stack = g_realloc(graphic_stack, + ++graphic_stack_size * + sizeof(struct graphic_stack_t)); + } + } + + memset(&graphic_stack[cur_id], 0, sizeof(struct graphic_stack_t)); + + /* g_printerr("[debug] graphics_init() : graphic_stack (@0x%p) has %ld elements\n", */ + /* graphic_stack, */ + /* graphic_stack_size); */ + + stack = &graphic_stack[cur_id]; + stack->id = cur_id; + +////////////////////////// glEnable(GL_DEBUG_OUTPUT); +////////////////////////// glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); +////////////////////////// glEnable(GL_MULTISAMPLE); + + if (!graphics_init_shaders(cur_id)) + return -1; + + //print_stack(cur_id); + + graphics_init_buffers(cur_id); + +////////////////////////// glDebugMessageCallback(graphics_debug_callback, NULL); + + //print_stack(cur_id); + + return cur_id; +} + +/* + * Shutdowns a gl_area + * + * @param gl_area, ptr to the gl_area widget + * + * @return true if success + */ +bool graphics_shutdown(const int id, void *error_buffer) +{ + struct graphic_stack_t *stack; + + if (id >= graphic_stack_size || + graphic_stack_size == 0 || + graphic_stack == NULL) + return false; + + stack = &graphic_stack[id]; + + //XXX + free(stack->arrows_ptr); + stack->arrows_ptr = NULL; + stack->arrows_nb = 0; + + glDeleteBuffers(1, &stack->position_buffer); + glDeleteBuffers(1, &stack->color_buffer); + glDeleteProgram(stack->program); + + g_free(stack->buffer_vertex_origin); + g_free(stack->buffer_colors_origin); + g_free(stack->buffer_lines_origin); + g_free(stack->buffer_plans_origin); + + if (graphic_stack_size == 1) { + free(graphic_stack); + graphic_stack = NULL; + graphic_stack_size = 0; + } else { + memset(&graphic_stack[id], 0, sizeof(struct graphic_stack_t)); + free_stack_slot = g_realloc(free_stack_slot, + ++free_stack_slot_size * + sizeof(int)); + free_stack_slot[free_stack_slot_size-1] = id; + } + + return true; +} + +/* TODO + * #pragma omp parallel schedule(static, 12) + * void __attribute__((optimize("no-unroll-loops"))) main_test_graphics (void) {} + * +// assert : space dimensions (x,y,z) > 0 +// assert : arrows localization within space and sites +// assert : no more than one arrow per address +// notify : weights are replaced, NOT added (could be !) + * + * Init space and arrows (= initial state) + * and allows ulterior creations, suppressions or modifications of the arrows[] array + * + * draws the space() + * triggers set_arrows() that modifies the list () and draws arrows + * + * Initialisation du générateur pseudo-aléatoire + * Attention, les vertex centraux de chaque unité d'espace (cube) + * peuvent être redondants (max 6) +*/ +void graphics_model_setup (const int stack_id) +{ + /*------------------------------------------------------------------------*/ + + /* I N I T I A L D A T A S P E C I F I C A T I O N */ + + /*------------------------------------------------------------------------*/ + + struct graphic_stack_t *stack = &graphic_stack[stack_id]; + char dimension; + long space_X; + long space_Y; + long space_Z; + long announced_arrows_nb; + int density_max; + char multiplicity; + +////////////////////////// dimension = model_get_dim(); +dimension = 1; // AD HOC (2024-06-04) + + g_print("[GRAPH DEBUG] dim = %d\n", dimension); + + space_X = 1; + space_Y = 1; + space_Z = 1; + + switch(dimension) { + case 3: +////////////////////////// space_Z = model_get_dim_value("z"); +; + case 2: +////////////////////////// space_Y = model_get_dim_value("y"); +; + // even in 1D, we must be able to see a grid (or not !) + if (!space_Y) + space_Y = 1; + case 1: +////////////////////////// space_X = model_get_dim_value("x"); +; + if (!space_X) + space_X = 1; + default: + break; + } + + g_print("[GRAPH DEBUG] x = %ld\n", space_X); + g_print("[GRAPH DEBUG] y = %ld\n", space_Y); + g_print("[GRAPH DEBUG] z = %ld\n", space_Z); + + density_max = space_X * space_Y * space_Z; + stack->arrows_nb = 0; + +////////////////////////// multiplicity = model_get_multiplicity(); +////////////////////////// g_print("[GRAPH DEBUG] site_multiplicity = %ld\n", multiplicity); + + /*------------------------------------------------------------------------*/ + + /* S P A C E D R A W I N G */ + + /*------------------------------------------------------------------------*/ + + draw_space_ridges_vertex (stack_id, stack->buffer_vertex_size, + space_X, space_Y, space_Z); + draw_space_ridges_lines (stack_id); + draw_grids_on_space_faces_vertex (stack_id, space_X, space_Y, space_Z); + draw_grids_on_space_faces_lines (stack_id, stack->buffer_lines_size, + space_X, space_Y, space_Z); + + stack->buffer_vertex_0_arrow = stack->buffer_vertex_size; + stack->buffer_colors_0_arrow = stack->buffer_colors_size; + stack->buffer_lines_0_arrow = stack->buffer_lines_size; + + /*------------------------------------------------------------------------*/ + + /* A R R O W S D R A W I N G */ + + /*------------------------------------------------------------------------*/ + + char state_id[30] = {0}; + struct arrow_t arrow = {0}; + +////////////////////////// assert(model_get_next_state(&state_id)); + + g_print("[GRAPH DEBUG] first state is = %s\n", state_id); + +////////////////////////// announced_arrows_nb = model_get_state_arrows_count(state_id); + +////////////////////////// g_print("[GRAPH DEBUG] announced_arrows_nb is = %ld\n", announced_arrows_nb); + +////////////////////////// while (model_get_next_arrow(&arrow, &state_id, dimension)) { +////////////////////////// g_print("[GRAPH DEBUG] cur arrow has x = %d\n", arrow.x); +////////////////////////// stack->arrows_nb = +////////////////////////// set_arrow (stack_id, stack->arrows_nb, space_X, space_Y, space_Z, +////////////////////////// arrow.load, // load +////////////////////////// arrow.site, // site +////////////////////////// arrow.x, // x +////////////////////////// arrow.y, // y +////////////////////////// arrow.z); // z +////////////////////////// } + +////////////////////////// if (stack->arrows_nb != announced_arrows_nb) +////////////////////////// g_printerr("ARGH : all the arrows have not been parsed !\n"); +} + diff --git a/in_depth.d b/in_depth.d deleted file mode 100644 index cced342..0000000 --- a/in_depth.d +++ /dev/null @@ -1 +0,0 @@ -in_depth.o: in_depth.c callback.h diff --git a/in_depth.o b/in_depth.o deleted file mode 100644 index f1014eddb4d7aae2a21eaf3d3fac917cd247b6a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7192 zcmbuDdpwlc8^GV8aw$wV4a$;BZVghAjZiLKMHJnbVTM`P#yu&Olv`AiS|w4Tlr6

D@7Q9!#72z4pm1YQ=G1_M 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 E2PbXqr~m)} diff --git a/manifest.scm b/manifest.scm new file mode 100644 index 0000000..c1ac365 --- /dev/null +++ b/manifest.scm @@ -0,0 +1,30 @@ +;; +;; Dépendances sous GNU Guix +;; + + +(specifications->manifest + (list + "bash" + "coreutils" + "gcc-toolchain" + "pkg-config" + "valgrind" + "findutils" + "gdb" + "make" + "gtk" + "libxml2" + "glu" + "glew" + "glfw" + "cglm" + "libepoxy" + "pango@1.90.0" + "xorgproto" + "glib" + "mesa-headers" + "mesa" + "libadwaita" + ) +) diff --git a/myprogram b/myprogram deleted file mode 100755 index 32366c7361bb069e9e9af2f2d497c749d079b9ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86296 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 C + * Copyright (C) 2024 Adrien Bourmault + * + * This file is part of Gem-graph. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include // http://xmlsoft.org/examples/#parse1.c + // https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/general.html + +#include "base.h" + +#define READ_SITE 1 << 0 +#define READ_WEIGHT 1 << 1 +#define READ_X 1 << 2 +#define READ_Y 1 << 3 +#define READ_Z 1 << 4 +#define SUCCESSFUL_READ_ARROW_X (READ_SITE | READ_WEIGHT | READ_X) +#define SUCCESSFUL_READ_ARROW_XY (READ_SITE | READ_WEIGHT | READ_X | READ_Y) +#define SUCCESSFUL_READ_ARROW_XYZ (READ_SITE | READ_WEIGHT | READ_X | READ_Y | READ_Z) + +static xmlDocPtr model; +static xmlHashTablePtr model_hashtable; + +bool model_init(const char *content, size_t length, const char *basename) +{ + xmlNode *node; + + /* + * this initialize the library and check potential ABI mismatches + * between the version it was compiled for and the actual shared + * library used. + */ + LIBXML_TEST_VERSION + + model = xmlReadMemory(content, length, basename, NULL, 0); + + if (model == NULL ) { + return false; + } + + node = xmlDocGetRootElement(model); + + if (node == NULL) { + g_printerr("Empty XML model !\n"); + xmlFreeDoc(model); + return false; + } + + if (xmlStrcmp(node->name, (xmlChar *) "gem-graph-model")) { + g_printerr("document of the wrong type, root node != gem-graph-model\n"); + xmlFreeDoc(model); + return false; + } + + model_hashtable = xmlHashCreate(0); + + if (model_hashtable == NULL) { + g_printerr("Can't create model hash table !\n"); + xmlFreeDoc(model); + return false; + } + + return true; +} + +bool model_shutdown(void) +{ + xmlFreeDoc(model); + xmlHashFree(model_hashtable, NULL); + + // Cleanup function for the XML library + xmlCleanupParser(); + + // This is to debug memory for regression tests + xmlMemoryDump(); + + return true; +} + +/******************************************************************************/ + +static inline xmlNodePtr getNextChild(xmlNodePtr node, xmlChar *last) +{ + while (node != NULL && xmlStrcmp(node->name, last)) { + // //printf(" <>--- line n°%lu <%s>\n", xmlGetLineNo(node), node->name); + node = node->next; + } + return node; +} + +static inline xmlChar* splitStrAtSlash(xmlChar *toSplit) +{ + toSplit = (xmlChar *)xmlStrchr(toSplit, '/'); + toSplit = xmlStrsub (toSplit, 1, xmlStrlen(toSplit)); + return toSplit; +} + +static inline xmlChar* getFirstTag(xmlChar *path) +{ + xmlChar *preop = path; + path = (xmlChar *)xmlStrchr(path, '/'); + path = xmlStrsub (path, 1, xmlStrlen(path)); + + //printf("%s = %s + / + %s\n", preop,\ + xmlStrsub (preop, 0, xmlStrlen(preop) - xmlStrlen(path) - 1), path); + + return xmlStrsub (preop, 0, xmlStrlen(preop) - xmlStrlen(path) - 1); +} + +static inline xmlChar* getLastTag(xmlChar *path) +{ + while ((ulong)xmlStrchr (path, '/')) + path = splitStrAtSlash((xmlChar *)path); + + // //printf("last tag in the path = <%s>\n", path); + return path; // which is no more the given path but only its last tag ! +} + +/******************************************************************************/ + +static xmlNodePtr model_get_node(xmlChar *path) +{ + xmlNodePtr node; + xmlChar *extrait; + xmlChar *reste, *last, *affich; + + // Lookup for node from path in hash table + node = xmlHashLookup(model_hashtable, path); + + // Found a node in hash table + if (node) { + return node; + + // no node found in hash table + } else { + reste = path; + affich = reste; + last = getLastTag(reste); + node = xmlDocGetRootElement(model); + + while (xmlStrchr (reste, '/')) { + extrait = getFirstTag(reste); + reste = splitStrAtSlash((xmlChar *)reste); + node = node->xmlChildrenNode; + node = getNextChild(node, extrait); + } + + if(node && xmlStrcmp(node->name, last)) { + node = node->xmlChildrenNode; + + while (node && xmlStrcmp(node->name, last)) { + node = node->next; + } + xmlHashAddEntry (model_hashtable, path, node); + } + + return node; + + } + + return NULL; +} + +/******************************************************************************/ + +static inline long model_get_node_long_attrib(xmlNodePtr node, char *id) +{ + xmlAttr *attribute; + xmlChar* value; + long ret_value; + + if (node && node->properties) { + attribute = node->properties; + while(attribute && attribute->name && attribute->children) { + if (!xmlStrcmp(attribute->name, (const xmlChar *)id)) { + value = xmlNodeListGetString(node->doc, attribute->children, 1); + ret_value = strtol((char *)value, NULL, 0); + xmlFree(value); + return ret_value; + } + attribute = attribute->next; + } + } + return 0; +} + +static inline bool model_get_node_str_attrib(xmlNodePtr node, + char *id, + char *dest) +{ + xmlAttr *attribute; + xmlChar* value; + + if (node && node->properties) { + attribute = node->properties; + while(attribute && attribute->name && attribute->children) { + if (!xmlStrcmp(attribute->name, (const xmlChar *)id)) { + value = xmlNodeListGetString(node->doc, attribute->children, 1); + strcpy(dest, value); + xmlFree(value); + return true; + } + attribute = attribute->next; + } + } + return false; +} + +/******************************************************************************/ + +char model_get_dim(void) +{ + xmlAttr *attribute; + xmlChar* value; + xmlNodePtr node = model_get_node( + (xmlChar *)"parameters/space-param/dimension"); + + if (xmlHasProp (node, (xmlChar *) "z")) return 3; + if (xmlHasProp (node, (xmlChar *) "y")) return 2; + if (xmlHasProp (node, (xmlChar *) "x")) return 1; + return 0; +} + +long model_get_dim_value(const char *axis) +{ + xmlAttr *attribute; + xmlChar *value; + long ret_value; + xmlNodePtr node = model_get_node( + (xmlChar *)"parameters/space-param/dimension"); + + return model_get_node_long_attrib(node, axis); +} + +char model_get_multiplicity(void) +{ + xmlAttr *attribute; + xmlChar* value; + xmlNodePtr node = model_get_node( + (xmlChar *)"parameters/space-param/site_multiplicity"); + + if (node->children) + if (node->children->content) + return (char)strtol((char *)node->children->content, NULL, 0); + + return 0; +} + +bool model_get_next_state(char *new_state_id) +{ + static xmlNodePtr cur_node = NULL; + xmlAttr *attribute; + xmlChar *value; + + if (cur_node == NULL) { + // Get first state + cur_node = model_get_node((xmlChar *)"savedstates/state"); + + } else { + // Get next state + if (cur_node->next) + cur_node = cur_node->next; + else + return false; + } + + // Lookup in properties + if (model_get_node_str_attrib(cur_node, "id", new_state_id)) + return true; + + cur_node = NULL; + return false; +} + +long model_get_state_arrows_count(const char *state_id) +{ + xmlNodePtr cur_node = NULL; + xmlAttr *attribute; + long value = 0; + bool found = false; + char temp_char[25]; + uint check = 0; // bit field checker + + //printf("NEW CALL : cur_node = %p\n", cur_node); + + assert(state_id); + + // Get first state node + cur_node = model_get_node((xmlChar *)"savedstates/state"); + + // Lookup in properties + while (cur_node && cur_node->properties) { + attribute = cur_node->properties; + + // Look for the id attribute + if (model_get_node_str_attrib(cur_node, "id", &temp_char)) { + if (!xmlStrcmp(temp_char, (const xmlChar *)state_id)) { + found = true; + break; + } + } + cur_node = cur_node->next; + } + + // Check if the state has been found + if (!found) { + cur_node = NULL; + return -1; + } + + + // Count arrows + if (cur_node->children) { + cur_node = cur_node->children; + while (cur_node) { + if (!xmlStrcmp(cur_node->name, (const xmlChar *)"arrow")) + value++; + cur_node = cur_node->next; + } + } else { + return -1; + } + return value; +} + +bool model_get_next_arrow(struct arrow_t *new_arrow, + const char *state_id, + char dimension) +{ + static xmlNodePtr cur_node = NULL; + xmlAttr *attribute; + xmlChar *value; + bool found = false; + char temp_char[25]; + uint check = 0; // bit field checker + + //printf("NEW CALL : cur_node = %p\n", cur_node); + + assert(new_arrow); + assert(state_id); + + if (cur_node == NULL) { + // Get first state node + cur_node = model_get_node((xmlChar *)"savedstates/state"); + + // Lookup in properties + while (cur_node && cur_node->properties) { + attribute = cur_node->properties; + + // Look for the id attribute + if (model_get_node_str_attrib(cur_node, "id", &temp_char)) { + if (!xmlStrcmp(temp_char, (const xmlChar *)state_id)) { + found = true; + break; + } + } + cur_node = cur_node->next; + } + + // Check if the state has been found + if (!found) { + cur_node = NULL; + return false; + } + + // Get first arrow + if (cur_node->children) { + cur_node = cur_node->children; + + found = false; + while (cur_node && cur_node->name) { + if (!xmlStrcmp(cur_node->name, (const xmlChar *)"arrow")) { + found = true; + break; + } + cur_node = cur_node->next; + } + } + + // Check if the state has been found + if (!found) { + cur_node = NULL; + return false; + } + + } else { + // Get next arrow + found = false; + while (cur_node->next) { + cur_node = cur_node->next; + if (!xmlStrcmp(cur_node->name, (const xmlChar *)"arrow")) { + found = true; + break; + } + } + + // Check if the state has been found + if (!found) { + cur_node = NULL; + return false; + } + } + + //printf("DURING CALL : cur_node = %p\n", cur_node); + //printf("DURING CALL : cur_node->name = %s\n", cur_node->name); + + // Lookup in properties + if (cur_node && cur_node->properties) { + attribute = cur_node->properties; + + while(attribute && attribute->name && attribute->children) { + //printf("attr name : %s\n", attribute->name); + if (!xmlStrcmp(attribute->name, (const xmlChar *)"site")) { + value = xmlNodeListGetString(cur_node->doc, attribute->children, 1); + new_arrow->site = strtol((char *)value, NULL, 0); + xmlFree(value); + check |= READ_SITE; + } + if (!xmlStrcmp(attribute->name, (const xmlChar *)"weight")) { + value = xmlNodeListGetString(cur_node->doc, attribute->children, 1); + new_arrow->load = strtol((char *)value, NULL, 0); + xmlFree(value); + check |= READ_WEIGHT; + } + if (!xmlStrcmp(attribute->name, (const xmlChar *)"x")) { + value = xmlNodeListGetString(cur_node->doc, attribute->children, 1); + new_arrow->x = strtol((char *)value, NULL, 0); + xmlFree(value); + check |= READ_X; + } + if (!xmlStrcmp(attribute->name, (const xmlChar *)"y")) { + value = xmlNodeListGetString(cur_node->doc, attribute->children, 1); + new_arrow->y = strtol((char *)value, NULL, 0); + xmlFree(value); + check |= READ_Y; + } + if (!xmlStrcmp(attribute->name, (const xmlChar *)"z")) { + value = xmlNodeListGetString(cur_node->doc, attribute->children, 1); + new_arrow->z = strtol((char *)value, NULL, 0); + xmlFree(value); + check |= READ_Z; + } + attribute = attribute->next; + } + + switch(dimension) { + case 3: + return (bool)(check & SUCCESSFUL_READ_ARROW_XYZ); + case 2: + return (bool)(check & SUCCESSFUL_READ_ARROW_XY); + case 1: + return (bool)(check & SUCCESSFUL_READ_ARROW_X); + } + } + cur_node = NULL; + return false; +} diff --git a/parsing.h.todo b/parsing.h.todo new file mode 100644 index 0000000..2c9c484 --- /dev/null +++ b/parsing.h.todo @@ -0,0 +1,39 @@ +/* + * Gem-graph OpenGL experiments + * + * Desc: Model parsing header + * + * Copyright (C) 2023 Arthur Menges + * Copyright (C) 2023 Adrien Bourmault + * + * This file is part of Gem-graph. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#pragma once +#include + +#include "base.h" + +bool model_init(const char *content, size_t length, const char *basename); +bool model_shutdown(void); + +char model_get_dim(void); +long model_get_dim_value(const char *axis); +char model_get_multiplicity(void); +bool model_get_next_state(char *new_state_id); +bool model_get_next_arrow(struct arrow_t *new_arrow, + const char *state_id, + char dimension); diff --git a/texts.d b/texts.d deleted file mode 100644 index 18de62c..0000000 --- a/texts.d +++ /dev/null @@ -1 +0,0 @@ -texts.o: texts.c diff --git a/texts.o b/texts.o deleted file mode 100644 index 8ea2834e94976a0c3b9c75e58c668c7508093acd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5944 zcmds4eQX>@6`%9Pj$_9kNq{5`$deFy=jOb2n$iX*7^jXKoZ3$0+9))QoW0w*^On8c z%YHacMAWE+l7MKc7Db|pXc0w<5sg}@Z7QUS(&H;qr4Ti(5JC{35|n?S2&sSY2mIdd z%z3@OD5wP?G1BeK`_22BH*em|Jv2OePeUrjR7PAvF)oC#)IK-kga2D*~>Jp z7PXG9Qz07BjI|653~$b=H`9ZIu7sPZ$FA3hm%Z?%V#MJm9ZaC(wuzgKaK*b z2x0I*!oH~R{4wsK5BUtIH?Z+>h2hkcZ6TXH9~6ti@cA5n)U@&tk5i zm#g!x-d%GHtMp*OaY;I|mOYUBeD414T#YAk{G;|P22Rm z1z!-Yf{)$fS;O>v-7bLD5vJ9PRk^yIqt&7Bb@C4ipU;}E9|)_PW3Ah6wpM7;D{w)C zN@*)YB_4+&qCC?N!ZjhF8PoQ$bRe;z-XG_aX58p6^|I4TE|2KbcdRG6J`FqpD^`Fe&rH94HRObydEK-(J(5WD24OcI5 zlw@wWPK5`y;PNCal&jhis5i)Fin@s^O2-Xl(89sW@QM?-+_XKMec}GQiok7A)pBeb z^*U66$`)#Lxf5_V=R%8x~X$%?stEZ%n=BS2(w+!a20Hy4$+ zqT`maJ`^Gyw~OvOn4?ROXYFoPN)5W0RrNyQi|mA}r5)14C~<*{t>6dMc|j#D+`Hor zrekFn+cN9wrcdFVg(Z2H>w)i-QKS)=&@`&11p=Dtu4vKn;zadn7=tppiOBS#lFv;8 z%fb~2wb2g2PqS=VlrJ7a`~eE=@PX=?p(!e{Q{(hlsaIe}GjuT_R7Ea4A2%gk2!U@} zrlPi`j)hQQ9k+zY(>%QZ^Z=Q{gsH8z1 zJA`(|G3VlbBDIB!7ly54t++t77S8=f31a_`vEZxCcTSwL~wrn#71Fh+HazXjix5S?}boi5J zsrDv=|McX?7+cxQ#twq5ku|g1NHmrDM|&G}qy#??v2@YRR4 z$!q71yw$bhp%-R1KYG@jnJNC}PsjfJd&gdXA=0U%w=qQ$f6(Cft*QRy34OS9!mnM3{+H^5ik01s1p z$y}OsEWt?g>X`p34j-2|#fX~1nJ?yiPb;vJ@Ta4HZTP!1EpVxW6a}*w&bR^Yrs?Di z^r(HJYLF(yvZ=q1gva-{Sz& zjqgfth(@^5LC|)ID?KW1_a*qxOZq?pSAOUTJ(8@go&2G*pqjFy>?(Yd91uUnLB%JR zzz<7$YXYB<^bXl4^>c|+%;IrVb`-AsW14rY?CW{-z8m#3YUJXNu||2tG(-1wrsX}4 zX?VPVAoi`=_Qm8@kR)S>d{CM;?VbP@lFg$&CF?l?41%;PyvN(bqK zrt&$WqWY%B)NjC#&e0%#@wQ)r!6TF{LKK#%xT~ z^Z&HGLgM*DDwVwQ|0}?fK9Q}CR{AnF9d)&DlJ{ZE)U*Gxw0~GiQvB!^Oxk|}80qX& z6BtvgNc&GlWbLcilpo*1Og;HdGKO}4)YZO8`HPqd( zctXm@F&Za%e+G>5Dw*derM%idlBK5nk0{1|ivj6O%0DON2Nk32lk&d;UT^=_$qPZ* zr~RW?D0!7X^=y-=ze@XDE|}_Iz5Ju{kgPo<-zm@Er-_KQWc=toQcwP~(*Jj2vNTM} F{|j!$J~IFS diff --git a/tree.d b/tree.d deleted file mode 100644 index dccd5fb..0000000 --- a/tree.d +++ /dev/null @@ -1 +0,0 @@ -tree.o: tree.c contain.h texts.h callback.h diff --git a/tree.o b/tree.o deleted file mode 100644 index 91bb7397d01ae706fddb19ae5a7fca43a52728c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47616 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 M6S4So+)X+%Sp9=T#Qhw;fz9IKEwHV;`FY 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 Z8W^6xeq7mqoj)A<|J@n$=YM?u{||$dhhYE!