diff --git a/docs/showcase/2024-11-21 main() graph by Doxygen.png b/docs/showcase/2024-11-21 main() graph by Doxygen.png new file mode 100644 index 0000000..c432309 Binary files /dev/null and b/docs/showcase/2024-11-21 main() graph by Doxygen.png differ diff --git a/include/base.h b/include/base.h index 365d60f..8afa248 100644 --- a/include/base.h +++ b/include/base.h @@ -1,25 +1,27 @@ -/* - * Gem-graph OpenGL experiments +/** + * @file + * base header * - * Desc: Base header + * This file is part of Gem-graph. * - * Copyright (C) 2023 Arthur Menges - * Copyright (C) 2023 Adrien Bourmault + * @cond LICENSE + * Copyright © 2021 Libre en Communs + * Copyright © 2021-2024 Adrien Bourmault + * Copyright © 2021-2024 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 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. * - * 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 . + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * @endcond */ #pragma once @@ -35,33 +37,39 @@ #include #include #include + //#define G_APPLICATION_DEFAULT_FLAGS 0 -enum { X_AXIS, Y_AXIS, Z_AXIS, N_AXIS }; // < used by : graph_area.h -enum { HOME_MODE, RUN_MODE, EDIT_MODE, PRESENTATION_MODE, N_MODE }; // Gem-graph modes -struct arrow_t { uint load; uint site; uint x; uint y; uint z; }; // describes an arrow -static inline char *read_file(char *filename); // < used by : init.c +struct arrow_t { uint load; uint site; uint x; uint y; uint z; }; +static inline char *read_file(char *filename); -/* I'm standing on Earth (or any spinning spheroid) and looking towards its North pole, then : - X - X = EAST - WEST = rouge - cyan - Y - Y = ZENITH - NADIR = vert - magenta (fuschia) - Z - Z = NORTH - SOUTH = bleu - jaune */ - -#define EAST 0 // + x rouge -#define WEST 1 // - x cyan -#define ZENITH 2 // + y vert -#define NADIR 3 // - y magenta -#define SOUTH 4 // + z bleu -#define NORTH 5 // - z jaune - - -/* - * char *read_file(char *filename) reads a file from filename into a provided buffer +/** + * I'm standing on Earth (or any spinning spheroid) + * and looking towards its North pole, * - * @param filename, file name - * contents, target ptr + * then : * - * @return void + * X - X = EAST - WEST = red - cyan + * Y - Y = ZENITH - NADIR = green - magenta (fuschia) + * Z - Z = SOUTH - NORTH = blue - yellow + */ +enum axis { X_AXIS, Y_AXIS, Z_AXIS, N_AXIS }; + + +#define EAST 0 /**< +x red */ +#define WEST 1 /**< -x cyan */ +#define ZENITH 2 /**< +y green */ +#define NADIR 3 /**< -y magenta or fuschia */ +#define SOUTH 4 /**< +z blue */ +#define NORTH 5 /**< -z yellow */ + + +/** + * char *read_file(char *filename) + * + * reads a file from filename into a provided buffer + * + * @param *filename */ static inline char *read_file(char *filename) { diff --git a/include/fsm.h b/include/fsm.h index 4264187..2276eae 100644 --- a/include/fsm.h +++ b/include/fsm.h @@ -219,8 +219,8 @@ void fsm_clear_log (struct fsm_log_t *); void fsm_clear_log_unit (struct fsm_log_unit_t *); void fsm_add_log_event (struct fsm_log_t *gg_logs, - char *file_source, - char *function_source, + const char *file_source, + const char *function_source, char *string_value); int fsm_get_log_length(struct fsm_log_t *); @@ -236,12 +236,12 @@ long fsm_remove_log (struct fsm_log_t *gg_logs, void fsm_add_log (int severity, int source, - char *file_source, - char *function_source, + const char *file_source, + const char *function_source, char *string_value); void fsm_relay_init_log(); void fsm_relay_close_log(); -void fsm_init (char *initial_message_from_main); -void fsm_close (char *final_message_from_main); +void fsm_init(); +void fsm_close(); diff --git a/include/util.h b/include/util.h new file mode 100644 index 0000000..96181a8 --- /dev/null +++ b/include/util.h @@ -0,0 +1,37 @@ +/** + * @file + * utilities header + * + * This file is part of Gem-graph. + * + * @cond LICENSE + * Copyright © 2021 Libre en Communs + * Copyright © 2021-2024 Adrien Bourmault + * Copyright © 2021-2024 Jean Sirmai + * + * 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 . + * @endcond + */ + + +#pragma once +#include +#include +#include + +#include "../include/fsm.h" + +char *util_read_file (char *filename); +char *util_concat (const char *str, ...); + diff --git a/src/fsm/control.c b/src/fsm/control.c index ce7d1ec..204e055 100644 --- a/src/fsm/control.c +++ b/src/fsm/control.c @@ -140,16 +140,16 @@ static void fsm_structures_close() * * @param *initial_info_from_main */ -void fsm_init (char *initial_info_from_main) +void fsm_init() { fsm_relay_init_log(); - fsm_add_log (INFO, MAIN, "main", initial_info_from_main, + fsm_add_log (INFO, MAIN, "fsm/control", __func__, "👋️ (☕️) Hi everybody ! Here is Gem-Graph."); - fsm_add_log (INFO, FSM, "fsm/control", "fsm initialisation", "has began ✍️"); + fsm_add_log (INFO, FSM, "fsm/control", __func__, "has began ✍️"); fsm_structures_init(); - fsm_add_log (INFO, FSM, "fsm/control", "fsm initialisation", "has ended 😇️"); + fsm_add_log (INFO, FSM, "fsm/control", __func__, "has ended 😇️"); } /** @@ -181,16 +181,17 @@ void fsm_init (char *initial_info_from_main) * * @param *closing_info_from_main */ -void fsm_close (char *closing_info_from_main) +void fsm_close() { - fsm_add_log (INFO, FSM, "fsm/control", "fsm closing", "has began"); + fsm_add_log (INFO, FSM, "fsm/control", __func__, "has began"); fsm_structures_close(); - fsm_add_log (INFO, FSM, "fsm/control", "fsm closing", "has ended"); + fsm_add_log (INFO, FSM, "fsm/control", __func__, "has ended"); - fsm_add_log (INFO, MAIN, "main", closing_info_from_main, + fsm_add_log (INFO, MAIN, "fsm/control", __func__, "👋️😄️ That'all folks !"); fsm_relay_close_log(); /**< fsm_clear_log(() can't be called from here * because static fsm_log_struct gg_logs * is in src/fsm/log/manager.c */ } + diff --git a/src/fsm/log/manager.c b/src/fsm/log/manager.c index b2a8469..658b86c 100644 --- a/src/fsm/log/manager.c +++ b/src/fsm/log/manager.c @@ -94,8 +94,8 @@ static struct fsm_log_t gg_logs = { 0 }; */ void fsm_add_log (int severity, int source, - char *file_source, - char *function_source, + const char *file_source, + const char *function_source, char *string_value) { if diff --git a/src/fsm/log/oper.c b/src/fsm/log/oper.c index da7f3a9..b0c672a 100644 --- a/src/fsm/log/oper.c +++ b/src/fsm/log/oper.c @@ -116,8 +116,8 @@ void fsm_clear_log_unit (struct fsm_log_unit_t *unit) * @param *string_value */ void fsm_add_log_event (struct fsm_log_t *gg_logs, - char *file_source, - char *function_source, + const char *file_source, + const char *function_source, char *string_value) { struct timeval tv; diff --git a/src/main.c b/src/main.c index acd1754..910d806 100644 --- a/src/main.c +++ b/src/main.c @@ -63,15 +63,15 @@ int main (int argc, char **argv) GtkApplication *app; int status; - fsm_init ("first instruction / first log"); + fsm_init(); - fsm_add_log (INFO, MAIN, "main", + fsm_add_log (INFO, MAIN, __func__, "*app = gtk_application_new()", "| 👉️ trigger app initialization"); app = gtk_application_new ("org.gem-graph", G_APPLICATION_DEFAULT_FLAGS); - fsm_add_log (INFO, MAIN, "main", + fsm_add_log (INFO, MAIN, __func__, "g signal connect (activate)", "| 👉️ windows creation requested"); @@ -80,9 +80,9 @@ int main (int argc, char **argv) status = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app); - fsm_add_log (INFO, MAIN, "main", "g_object unref (app)", "| 👌️ bye bye app !"); + fsm_add_log (INFO, MAIN, __func__, "g_object unref (app)", "| 👌️ bye bye app !"); - fsm_close("last instruction / last log"); + fsm_close(); return status; } diff --git a/src/util/io.c b/src/util/io.c new file mode 100644 index 0000000..f7a25f0 --- /dev/null +++ b/src/util/io.c @@ -0,0 +1,64 @@ +/** + * @file + * input output + * + * This file is part of Gem-graph. + * + * @cond LICENSE + * Copyright © 2021 Libre en Communs + * Copyright © 2021-2024 Adrien Bourmault + * Copyright © 2021-2024 Jean Sirmai + * + * 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 . + * @endcond + */ + + +#include "../../include/util.h" +#include "../../include/base.h" + + +/** + * reads a file from filename into a provided buffer + * + * @param *filename + * + * @returns char + */ +char *util_read_file(char *filename) +{ + int fd; + int filesize; + char *contents; + + fd = open(filename, O_RDONLY); + if (fd < 0) { + printf("Couldn't read file: %s\n",filename); + return NULL; + } + + filesize = lseek(fd, 0, SEEK_END) + 1 ; + contents = g_malloc(filesize * sizeof(char)); + assert (contents); + + lseek(fd, 0, SEEK_SET); + read(fd,contents,filesize); + + contents[filesize-1] = '\0'; + + close(fd); + + return contents; +} + diff --git a/src/util/strings.c b/src/util/strings.c new file mode 100644 index 0000000..6413915 --- /dev/null +++ b/src/util/strings.c @@ -0,0 +1,131 @@ +/** + * @file + * concat + * + * @cond LICENSE + * This file is part of Gem-graph. + * + * Copyright © 2021 Libre en Communs + * Copyright © 2021-2024 Adrien Bourmault + * Copyright © 2021-2024 Jean Sirmai + * + * 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 . + * @endcond + */ + + + + +#include +#include +#include + +/** + * Programmers using the strcat function can easily be recognized as lazy and + * reckless 🤨️ (quoted from: The GNU C Library (glibc) manual - 5.5 + * Concatenating Strings). + * + * Whenever a programmer feels the need to use strcat she or he should think twice + * and look through the program to see whether the code cannot be rewritten + * to take advantage of already calculated results. + * The related functions strlcat, strncat, wcscat and wcsncat are almost always unnecessary, too. + * Again: it is almost always unnecessary to use functions like strcat. 😄️ + * + * Before calling vprintf or the other functions listed in this section, + * you must call va_start (see Variadic Functions) to initialize a pointer to the variable arguments. + * Then you can call va_arg to fetch the arguments that you want to handle yourself. + * This advances the pointer past those arguments. + * + * Once your va_list pointer is pointing at the argument of your choice, you are ready to call vprintf. + * That argument and all subsequent arguments that were passed to your function + * are used by vprintf along with the template that you specified separately. + * + * --- + * + * A.2 Variadic Functions + * + * ISO C defines a syntax for declaring a function to take a variable number or type of arguments. + * (Such functions are referred to as varargs functions or variadic functions.) + * However, the language itself provides no mechanism for such functions to access + * their non-required arguments; instead, you use the variable arguments macros defined in stdarg.h. + * + * This section describes how to declare variadic functions, how to write them, + * and how to call them properly. + * + * https://sourceware.org/glibc/manual/latest/html_mono/libc.html#Variadic-Prototypes + * + * see (in glibc/manual) > ellipsis (‘…’) A.2.2.2 Receiving the Argument Values + * + * --- + * + * NB 'at ref' desactivated TODO + * + * @callergraph + * @see on_app_activation() + * + * @param *str + * @param ... + * + * @return * + */ +char * +util_concat (const char *str, ...) +{ + size_t allocated = 100; + char *result = malloc (allocated); + + if (result != NULL) + { + va_list ap; + size_t resultlen = 0; + char *newp; + + va_start (ap, str); + + for (const char *s = str; s != NULL; s = va_arg (ap, const char *)) + { + size_t len = strlen (s); + + /* Resize the allocated memory if necessary. */ + if (resultlen + len + 1 > allocated) + { + allocated += len; + newp = reallocarray (result, allocated, 2); + allocated *= 2; + if (newp == NULL) + { + free (result); + return NULL; + } + result = newp; + } + + memcpy (result + resultlen, s, len); + resultlen += len; + } + + /* Terminate the result string. */ + result[resultlen++] = '\0'; + + /* Resize memory to the optimal size. */ + newp = realloc (result, resultlen); + if (newp != NULL) + result = newp; + + va_end (ap); + } + + return result; +} + diff --git a/src/widget/main_window/design.c b/src/widget/main_window/design.c index 20bb98f..def7ed1 100644 --- a/src/widget/main_window/design.c +++ b/src/widget/main_window/design.c @@ -42,7 +42,7 @@ void widget_design_main_window (GtkWindow *main_window, GtkApplication *app) { fsm_add_log (INFO, TOPBAR, "widget/main_window/design", - "main window", "start of design"); + __func__, "start of design"); /* GtkWidget *topbar = GTK_WIDGET (gtk_header_bar_new ()); */ @@ -58,5 +58,5 @@ void widget_design_main_window (GtkWindow *main_window, GtkApplication *app) // g_object_unref (e_coli); fsm_add_log (INFO, TOPBAR, "widget/main_window/design", - "main window", "ready for presentation"); + __func__, "end of design -> present"); } diff --git a/src/widget/manager.c b/src/widget/manager.c index 95ae579..0a23489 100644 --- a/src/widget/manager.c +++ b/src/widget/manager.c @@ -32,6 +32,7 @@ #include "../../include/widget.h" #include "../../include/fsm.h" +#include "../../include/util.h" #include @@ -57,7 +58,7 @@ static GtkWindow *window; */ void on_app_activation (GtkApplication *app) { - fsm_add_log (INFO, WIDGETS, "widget/manager", "app activation()", "has began"); + fsm_add_log (INFO, WIDGETS, "widget/manager", __func__, "has began"); // on_windows_activation() is in: widget/manager NOT in: src/signal // g_application_activate (G_APPLICATION (app)); < how ? > in main is @@ -82,13 +83,9 @@ void on_app_activation (GtkApplication *app) g_signal_connect(window, "close-request", G_CALLBACK (on_window_close_request), (void *)(long long)window_int_id); - //printf ("gtk_application_window_id = %s = %d\n", window_char_id, window_int_id); - - fsm_add_log (INFO, WIDGETS, "widget/manager", "gtk_application_window_get_id", - window_char_id);//"sprintf(window_id,...) << fails. Why ?"); - - //printf ("gtk_application_window_get_id (main_window) = %d\n", - //gtk_application_window_get_id (GTK_APPLICATION_WINDOW (main_window))); + char *temp = util_concat ("window_get_id = ", window_char_id, NULL); + fsm_add_log (INFO, WIDGETS, "widget/manager", __func__, temp); + free(temp); widget_design_main_window (window, app); @@ -117,14 +114,14 @@ void on_app_activation (GtkApplication *app) g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (act_b)); g_signal_connect (act_b, "activate", G_CALLBACK (action_b), app2);*/ - fsm_add_log (INFO, WIDGETS, "widget/manager", "app activation()", + fsm_add_log (INFO, WIDGETS, "widget/manager", __func__, "has ended 🧐️ | 👉️ a new session starts"); } gboolean on_window_close_request (GtkWindow *window, gpointer user_data) { - fsm_add_log (INFO, WIDGETS, "widget/manager", "window close request()", + fsm_add_log (INFO, WIDGETS, "widget/manager", __func__, "freeing all ressources !"); // free the only child