summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2024-08-24 22:13:27 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2024-08-24 22:13:27 (GMT)
commit70f5f1c083158ea01513bc07955d62b3b3f43795 (patch)
tree858e3d6f17849a90f2d20c56e1b84c3a623b38ea
parentac65557bee2573c1cf6ae9ac107839f95e99741b (diff)
Restore basic command line argument support.
-rw-r--r--src/app.c147
1 files changed, 145 insertions, 2 deletions
diff --git a/src/app.c b/src/app.c
index a3a2080..15fe255 100644
--- a/src/app.c
+++ b/src/app.c
@@ -24,6 +24,9 @@
#include <assert.h>
#include <fcntl.h>
+#include <getopt.h>
+#include <libgen.h>
+#include <string.h>
#include <gio/gdesktopappinfo.h>
#include <gio/gio.h>
#include <sys/auxv.h>
@@ -83,6 +86,12 @@ static void gtk_chrysalide_framework_activate(GApplication *);
/* ---------------------- POINT D'ENTREE PRINCIPAL D'EXECUTION ---------------------- */
+/* Affiche des indications quant à l'utilisation du programme. */
+static void show_chrysalide_help(const char *);
+
+/* Affiche des indications sur la version courante du programme. */
+static void show_chrysalide_version(void);
+
/* Installe au besoin une définition locale pour le système. */
static void ensure_wm_icon_and_name(void);
@@ -252,6 +261,72 @@ static void gtk_chrysalide_framework_activate(GApplication *app)
/******************************************************************************
* *
+* Paramètres : name = nom du programme en question. *
+* *
+* Description : Affiche des indications quant à l'utilisation du programme. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void show_chrysalide_help(const char *name)
+{
+ char *tmp; /* Conservation modifiable */
+ char *base; /* Version courte du nom */
+
+ tmp = strdup(name);
+
+ base = basename(tmp);
+
+ printf("\n");
+
+ printf("Usage: %s [--help] [--version]\n", base);
+ printf(" %s [args] <filename(s)...>\n", base);
+
+ free(tmp);
+
+ printf("\n");
+
+ printf("\t-h --help\t\tShow this help message.\n");
+ printf("\t-v --version\t\tDisplay the program version.\n");
+
+ printf("\n");
+
+ printf("\t-V --verbosity=level\tSet the log level (0 for all messages, %u for none).\n", LMT_COUNT);
+
+ printf("\n");
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Affiche des indications sur la version courante du programme.*
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void show_chrysalide_version(void)
+{
+ printf("\n");
+
+ printf("-o- Chrysalide r%u -o-\n", REVISION);
+ printf(_("Compiled on %s at %s\n"), __DATE__, __TIME__);
+
+ printf("\n");
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : - *
* *
* Description : Installe au besoin une définition locale pour le système. *
@@ -362,21 +437,89 @@ static void ensure_wm_icon_and_name(void)
int main(int argc, char **argv)
{
int result; /* Bilan de l'exécution */
+ bool show_help; /* Affichage de l'aide ? */
+ bool show_version; /* Affichage de la version ? */
+ LogMessageType verbosity; /* Niveau de filtre de message */
+ int index; /* Indice d'argument */
+ int ret; /* Bilan d'un appel */
GtkChrysalideFramework *app; /* Gestion d'application GTK */
+ static struct option long_options[] = {
+ { "help", no_argument, NULL, 'h' },
+ { "version", no_argument, NULL, 'v' },
+ { "verbosity", required_argument, NULL, 'V' },
+ { NULL, 0, NULL, 0 }
+ };
+
+ result = EXIT_FAILURE;
+
+ /* Décodage des options */
+
+ show_help = false;
+ show_version = false;
+
+ verbosity = LMT_COUNT;
+
+ while (true)
+ {
+ ret = getopt_long(argc, argv, "hvV:", long_options, &index);
+ if (ret == -1) break;
+
+ switch (ret)
+ {
+ case 'h':
+ show_help = true;
+ break;
+
+ case 'v':
+ show_version = true;
+ break;
+
+ case 'V':
+ verbosity = strtoul(optarg, NULL, 10);
+ break;
+
+ }
+
+ }
+
+ /* Actions de base */
+
+ if (show_help)
+ {
+ show_chrysalide_help(argv[0]);
+ result = EXIT_SUCCESS;
+ goto exit;
+ }
+
+ if (show_version)
+ {
+ show_chrysalide_version();
+ result = EXIT_SUCCESS;
+ goto exit;
+ }
+
+ /* Lancement des choses sérieuses */
+
+ set_log_verbosity(verbosity);
+
if (!load_gui_components(AGC_BUFFER_FEATURES | AGC_PANELS))
- return EXIT_FAILURE;
+ goto exit;
ensure_wm_icon_and_name();
+ g_set_prgname("Chrysalide");
+
app = gtk_chrysalide_framework_new();
- result = g_application_run(G_APPLICATION(app), argc, argv);
+ result = g_application_run(G_APPLICATION(app), 0, NULL);
g_object_unref(G_OBJECT(app));
unload_gui_components(AGC_BUFFER_FEATURES | AGC_PANELS);
+ exit:
+
return result;
}