summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2023-11-12 22:19:44 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2023-11-12 22:19:44 (GMT)
commite279139b7dcae080723412ea475787123c2389d4 (patch)
treec3549c7028fd7e6979a9ee87d8dbdc4a39952060 /src/analysis
parent1e34d59e3fb62bc699d4e561c89e68adbf594f4e (diff)
Dump some ROST keywords on request.
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/scan/core.c29
-rw-r--r--src/analysis/scan/core.h3
-rw-r--r--src/analysis/scan/space.c99
-rw-r--r--src/analysis/scan/space.h5
4 files changed, 134 insertions, 2 deletions
diff --git a/src/analysis/scan/core.c b/src/analysis/scan/core.c
index 7e1e462..2b4fd92 100644
--- a/src/analysis/scan/core.c
+++ b/src/analysis/scan/core.c
@@ -159,6 +159,35 @@ bool load_all_known_scan_token_modifiers(void)
/******************************************************************************
* *
+* Paramètres : count = nombre de motificateurs exportés. [OUT] *
+* *
+* Description : Fournit la désignation de l'ensemble des modificateurs. *
+* *
+* Retour : Liste de modificateurs enregistrés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char **list_all_scan_token_modifiers(size_t *count)
+{
+ char **result; /* Liste à retourner */
+ size_t i; /* Boucle de parcours */
+
+ result = malloc(__modifiers_count * sizeof(char *));
+
+ *count = __modifiers_count;
+
+ for (i = 0; i < __modifiers_count; i++)
+ result[i] = strndup(__modifiers[i].name.data, __modifiers[i].name.len);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : - *
* *
* Description : Décharge tous les modificateurs inscrits. *
diff --git a/src/analysis/scan/core.h b/src/analysis/scan/core.h
index 8a18a75..a56ce16 100644
--- a/src/analysis/scan/core.h
+++ b/src/analysis/scan/core.h
@@ -36,6 +36,9 @@ bool register_scan_token_modifier(GScanTokenModifier *);
/* Charge tous les modificateurs de base. */
bool load_all_known_scan_token_modifiers(void);
+/* Fournit la désignation de l'ensemble des modificateurs. */
+char **list_all_scan_token_modifiers(size_t *);
+
/* Décharge tous les modificateurs inscrits. */
void unload_all_scan_token_modifiers(void);
diff --git a/src/analysis/scan/space.c b/src/analysis/scan/space.c
index 1aaf8b8..38556a3 100644
--- a/src/analysis/scan/space.c
+++ b/src/analysis/scan/space.c
@@ -24,10 +24,12 @@
#include "space.h"
+#include <stdio.h>
#include <string.h>
#include "space-int.h"
+#include "../../core/logs.h"
@@ -236,7 +238,7 @@ bool g_scan_namespace_create(GScanNamespace *space, const char *name)
* Paramètres : space = espace de noms à compléter. *
* child = élément d'évaluation à intégrer. *
* *
-* Description : Intègre un nouvel élément dans l'esapce de noms. *
+* Description : Intègre un nouvel élément dans l'espace de noms. *
* *
* Retour : Bilan de l'opération. *
* *
@@ -283,6 +285,101 @@ bool g_scan_namespace_register_item(GScanNamespace *space, GScanRegisteredItem *
}
+/******************************************************************************
+* *
+* Paramètres : space = espace de noms à compléter. *
+* count = nombre d'éléments exportés. [OUT] *
+* *
+* Description : Réalise l'inventaire d'un espace de noms. *
+* *
+* Retour : Liste d'éléments enregistrés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char **g_scan_namespace_explore(const GScanNamespace *space, size_t *count)
+{
+ char **result; /* Liste à retourner */
+ size_t i; /* Boucle de parcours #1 */
+ GScanRegisteredItem *child; /* Elément à considérer */
+ char **sub_result; /* Sous-éléments obtenus */
+ size_t sub_count; /* Quantité de ces éléments */
+ size_t k; /* Boucle de parcours #2 */
+ int ret; /* Bilan d'une construction */
+
+ result = NULL;
+ *count = 0;
+
+ for (i = 0; i < space->count; i++)
+ {
+ child = space->children[i];
+
+ if (G_IS_SCAN_NAMESPACE(child))
+ {
+ sub_result = g_scan_namespace_explore(G_SCAN_NAMESPACE(child), &sub_count);
+
+ result = realloc(result, (*count + sub_count) * sizeof(char *));
+
+ for (k = 0; k < sub_count; k++)
+ {
+ if (space->name == NULL)
+ result[(*count)++] = sub_result[k];
+
+ else
+ {
+ ret = asprintf(&result[*count], "%s.%s", space->name, sub_result[k]);
+
+ if (ret == -1)
+ {
+ LOG_ERROR_N("asprintf");
+ result[*count] = sub_result[k];
+ }
+
+ else
+ free(sub_result[k]);
+
+ (*count)++;
+
+ }
+
+ }
+
+ if (sub_result != NULL)
+ free(sub_result);
+
+ }
+
+ else
+ {
+ result = realloc(result, (*count + 1) * sizeof(char *));
+
+ if (space->name == NULL)
+ result[(*count)++] = strdup(space->names[i]);
+
+ else
+ {
+ ret = asprintf(&result[*count], "%s.%s", space->name, space->names[i]);
+
+ if (ret == -1)
+ {
+ LOG_ERROR_N("asprintf");
+ result[*count] = strdup(space->names[i]);
+ }
+
+ (*count)++;
+
+ }
+
+ }
+
+ }
+
+ return result;
+
+}
+
+
/* ---------------------------------------------------------------------------------- */
/* IMPLEMENTATION DES FONCTIONS DE CLASSE */
diff --git a/src/analysis/scan/space.h b/src/analysis/scan/space.h
index 619b960..1b998d8 100644
--- a/src/analysis/scan/space.h
+++ b/src/analysis/scan/space.h
@@ -54,9 +54,12 @@ GType g_scan_namespace_get_type(void);
/* Construit un nouvel espace de noms pour scan. */
GScanNamespace *g_scan_namespace_new(const char *);
-/* Intègre un nouvel élément dans l'esapce de noms. */
+/* Intègre un nouvel élément dans l'espace de noms. */
bool g_scan_namespace_register_item(GScanNamespace *, GScanRegisteredItem *);
+/* Réalise l'inventaire d'un espace de noms. */
+char **g_scan_namespace_explore(const GScanNamespace *, size_t *);
+
#endif /* _ANALYSIS_SCAN_SPACE_H */