summaryrefslogtreecommitdiff
path: root/src/analysis/scan/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/core.c')
-rw-r--r--src/analysis/scan/core.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/src/analysis/scan/core.c b/src/analysis/scan/core.c
index d940ab5..d102d58 100644
--- a/src/analysis/scan/core.c
+++ b/src/analysis/scan/core.c
@@ -25,6 +25,8 @@
#include <config.h>
+#include <malloc.h>
+#include <string.h>
#include "items/count.h"
@@ -38,8 +40,168 @@
#endif
#include "items/time/make.h"
#include "items/time/now.h"
+#include "patterns/modifiers/hex.h"
+#include "patterns/modifiers/plain.h"
+#include "patterns/modifiers/rev.h"
+/* Liste des modificateurs disponibles */
+
+typedef struct _available_modifier_t
+{
+ char *name; /* Désignation humaine */
+ GScanTokenModifier *instance; /* Mécanisme correspondant */
+
+} available_modifier_t;
+
+static available_modifier_t *__modifiers = NULL;
+static size_t __modifiers_count = 0;
+
+
+/******************************************************************************
+* *
+* Paramètres : modifier = modificateur à rendre disponible. *
+* *
+* Description : Inscrit un modificateur dans la liste des disponibles. *
+* *
+* Retour : Bilan des enregistrements effectués : true si nouveauté. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool register_scan_token_modifier(GScanTokenModifier *modifier)
+{
+ bool result; /* Bilan à retourner */
+ char *name; /* Nom donné au modificateur */
+ GScanTokenModifier *found; /* Alternative présente */
+ available_modifier_t *last; /* Emplacement disponible */
+
+ name = g_scan_token_modifier_get_name(modifier);
+
+ found = find_scan_token_modifiers_for_name(name);
+
+ result = (found == NULL);
+
+ if (!result)
+ free(name);
+
+ else
+ {
+ __modifiers_count++;
+ __modifiers = realloc(__modifiers, __modifiers_count * sizeof(available_modifier_t));
+
+ last = &__modifiers[__modifiers_count - 1];
+
+ last->name = name;
+ last->instance = modifier;
+
+ g_object_ref(G_OBJECT(modifier));
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Charge tous les modificateurs de base. *
+* *
+* Retour : Bilan des opérations d'enregistrement. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool load_all_known_scan_token_modifiers(void)
+{
+ bool result; /* Bilan à retourner */
+
+ result = true;
+
+#define REGISTER_SCAN_MODIFIER(m) \
+ ({ \
+ bool __status; \
+ __status = register_scan_token_modifier(m); \
+ g_object_unref(G_OBJECT(m)); \
+ __status; \
+ })
+
+ if (result) result = REGISTER_SCAN_MODIFIER(g_scan_hex_modifier_new());
+ if (result) result = REGISTER_SCAN_MODIFIER(g_scan_plain_modifier_new());
+ if (result) result = REGISTER_SCAN_MODIFIER(g_scan_reverse_modifier_new());
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Décharge tous les modificateurs inscrits. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void unload_all_scan_token_modifiers(void)
+{
+ size_t i; /* Boucle de parcours */
+
+ for (i = 0; i < __modifiers_count; i++)
+ g_object_unref(G_OBJECT(__modifiers[i].instance));
+
+ if (__modifiers != NULL)
+ free(__modifiers);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : name = désignation du modificateur recherché. *
+* *
+* Description : Fournit le modificateur correspondant à un nom. *
+* *
+* Retour : Instance du modificateur identifié ou NULL. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GScanTokenModifier *find_scan_token_modifiers_for_name(const char *name)
+{
+ GScanTokenModifier *result; /* Instance à renvoyer */
+ size_t i; /* Boucle de parcours */
+ available_modifier_t *registered; /* Infos d'enregistrement */
+
+ result = NULL;
+
+ for (i = 0; i < __modifiers_count; i++)
+ {
+ registered = __modifiers + i;
+
+ if (strcmp(registered->name, name) == 0)
+ {
+ result = registered->instance;
+ g_object_ref(G_OBJECT(result));
+ break;
+ }
+
+ }
+
+ return result;
+
+}
+
/******************************************************************************
* *