From 3231349bac6aae1f236416a8a51f41caccc38961 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sun, 28 Jan 2024 21:07:24 +0100
Subject: Update the current scan backend warm-up.

---
 src/analysis/scan/patterns/backend-int.h    |  2 +-
 src/analysis/scan/patterns/backend.c        | 11 ++++++---
 src/analysis/scan/patterns/backend.h        |  2 +-
 src/analysis/scan/patterns/backends/acism.c | 35 +++++++++++++++++++----------
 src/analysis/scan/scanner.c                 | 13 ++++++-----
 5 files changed, 40 insertions(+), 23 deletions(-)

diff --git a/src/analysis/scan/patterns/backend-int.h b/src/analysis/scan/patterns/backend-int.h
index 90daec9..aeabe1b 100644
--- a/src/analysis/scan/patterns/backend-int.h
+++ b/src/analysis/scan/patterns/backend-int.h
@@ -36,7 +36,7 @@ typedef size_t (* get_backend_atom_max_size_fc) (const GEngineBackend *);
 typedef patid_t (* enroll_plain_into_backend_fc) (GEngineBackend *, const uint8_t *, size_t, uint32_t [2]);
 
 /* Met en ordre les derniers détails avant un premier scan. */
-typedef void (* warm_up_backend_fc) (GEngineBackend *);
+typedef bool (* warm_up_backend_fc) (GEngineBackend *);
 
 /* Récupère les identifiants finaux pour un motif recherché. */
 typedef patid_t (* build_backend_plain_pattern_id_fc) (const GEngineBackend *, const uint32_t [2]);
diff --git a/src/analysis/scan/patterns/backend.c b/src/analysis/scan/patterns/backend.c
index 50cc889..a887600 100644
--- a/src/analysis/scan/patterns/backend.c
+++ b/src/analysis/scan/patterns/backend.c
@@ -187,20 +187,25 @@ bool g_engine_backend_enroll_plain_pattern(GEngineBackend *backend, const uint8_
 *                                                                             *
 *  Description : Met en ordre les derniers détails avant un premier scan.     *
 *                                                                             *
-*  Retour      : -                                                            *
+*  Retour      : Bilan de l'opération.                                        *
 *                                                                             *
 *  Remarques   : -                                                            *
 *                                                                             *
 ******************************************************************************/
 
-void g_engine_backend_warm_up(GEngineBackend *backend)
+bool g_engine_backend_warm_up(GEngineBackend *backend)
 {
+    bool result;                            /* Bilan à retourner           */
     GEngineBackendClass *class;             /* Classe à activer            */
 
     class = G_ENGINE_BACKEND_GET_CLASS(backend);
 
     if (class->warm_up != NULL)
-        class->warm_up(backend);
+        result = class->warm_up(backend);
+    else
+        result = true;
+
+    return result;
 
 }
 
diff --git a/src/analysis/scan/patterns/backend.h b/src/analysis/scan/patterns/backend.h
index 71c97d1..3f9be03 100644
--- a/src/analysis/scan/patterns/backend.h
+++ b/src/analysis/scan/patterns/backend.h
@@ -60,7 +60,7 @@ size_t g_engine_backend_get_atom_max_size(const GEngineBackend *);
 bool g_engine_backend_enroll_plain_pattern(GEngineBackend *, const uint8_t *, size_t, uint32_t [2]);
 
 /* Met en ordre les derniers détails avant un premier scan. */
-void g_engine_backend_warm_up(GEngineBackend *);
+bool g_engine_backend_warm_up(GEngineBackend *);
 
 /* Récupère les identifiants finaux pour un motif recherché. */
 patid_t g_engine_backend_build_plain_pattern_id(const GEngineBackend *, const uint32_t [2]);
diff --git a/src/analysis/scan/patterns/backends/acism.c b/src/analysis/scan/patterns/backends/acism.c
index a36e4b7..d517168 100644
--- a/src/analysis/scan/patterns/backends/acism.c
+++ b/src/analysis/scan/patterns/backends/acism.c
@@ -37,10 +37,10 @@
 /* ---------------------- IMPLANTATION D'UNE NOUVELLE APPROCHE ---------------------- */
 
 
-/* Initialise la classe des méthodes basée sur Bitmap. */
+/* Initialise la classe des méthodes basée sur ACISM. */
 static void g_acism_backend_class_init(GAcismBackendClass *);
 
-/* Initialise une instance de méthodes basée sur Bitmap. */
+/* Initialise une instance de méthodes basée sur ACISM. */
 static void g_acism_backend_init(GAcismBackend *);
 
 /* Supprime toutes les références externes. */
@@ -92,15 +92,15 @@ static void g_acism_backend_prepare_interleave_array(GAcismBackend *);
 /* Compresse l'arborescence dans un tableau de position. */
 static void g_acism_backend_build_interleave_array(GAcismBackend *);
 
-/* Détermine le nombre d'identifiants constitués. */
-static size_t g_acism_backend_count_plain_pattern_ids(const GAcismBackend *);
-
 /* Met en ordre les derniers détails avant un premier scan. */
-static void g_acism_backend_warm_up(GAcismBackend *);
+static bool g_acism_backend_warm_up(GAcismBackend *);
 
 /* Récupère les identifiants finaux pour un motif recherché. */
 static patid_t g_acism_backend_build_plain_pattern_id(const GAcismBackend *, const uint32_t [2]);
 
+/* Détermine le nombre d'identifiants constitués. */
+static size_t g_acism_backend_count_plain_pattern_ids(const GAcismBackend *);
+
 /* Parcours un contenu binaire à la recherche de motifs. */
 static void g_acism_backend_run_scan(const GAcismBackend *, GScanContext *);
 
@@ -125,7 +125,7 @@ G_DEFINE_TYPE(GAcismBackend, g_acism_backend, G_TYPE_ENGINE_BACKEND);
 *                                                                             *
 *  Paramètres  : klass = classe à initialiser.                                *
 *                                                                             *
-*  Description : Initialise la classe des méthodes basée sur Bitmap.          *
+*  Description : Initialise la classe des méthodes basée sur ACISM.           *
 *                                                                             *
 *  Retour      : -                                                            *
 *                                                                             *
@@ -160,7 +160,7 @@ static void g_acism_backend_class_init(GAcismBackendClass *klass)
 *                                                                             *
 *  Paramètres  : backend = instance à initialiser.                            *
 *                                                                             *
-*  Description : Initialise une instance de méthodes basée sur Bitmap.        *
+*  Description : Initialise une instance de méthodes basée sur ACISM.         *
 *                                                                             *
 *  Retour      : -                                                            *
 *                                                                             *
@@ -1121,14 +1121,18 @@ static void g_acism_backend_build_interleave_array(GAcismBackend *backend)
 *                                                                             *
 *  Description : Met en ordre les derniers détails avant un premier scan.     *
 *                                                                             *
-*  Retour      : -                                                            *
+*  Retour      : Bilan de l'opération.                                        *
 *                                                                             *
 *  Remarques   : -                                                            *
 *                                                                             *
 ******************************************************************************/
 
-static void g_acism_backend_warm_up(GAcismBackend *backend)
+static bool g_acism_backend_warm_up(GAcismBackend *backend)
 {
+    bool result;                            /* Bilan à retourner           */
+
+    result = true;
+
 #ifdef __USE_BYTE_FREQ
 
     /**
@@ -1163,6 +1167,8 @@ static void g_acism_backend_warm_up(GAcismBackend *backend)
 
     g_acism_backend_build_interleave_array(backend);
 
+    return result;
+
 }
 
 
@@ -1184,6 +1190,8 @@ static patid_t g_acism_backend_build_plain_pattern_id(const GAcismBackend *backe
     patid_t result;                         /* Identifiant à retourner     */
     acism_source_t *source;                 /* Motif d'origine concerné    */
 
+    assert(tmp_id[0] < backend->sources_count);
+
     source = backend->sources + tmp_id[0];
 
     result = source->coverage[SOURCE_COVERAGE_START] + tmp_id[1];
@@ -1211,7 +1219,10 @@ static size_t g_acism_backend_count_plain_pattern_ids(const GAcismBackend *backe
 {
     size_t result;                          /* Quantité à retourner        */
 
-    result = backend->sources[backend->sources_count -1].coverage[SOURCE_COVERAGE_END];
+    if (backend->sources_count == 0)
+        result = 0;
+    else
+        result = backend->sources[backend->sources_count - 1].coverage[SOURCE_COVERAGE_END];
 
     return result;
 
@@ -1248,8 +1259,8 @@ static void g_acism_backend_run_scan(const GAcismBackend *backend, GScanContext
     acism_code_t code;                      /* Code du caractère courant   */
     unsigned int next;                      /* Prochaine tête à valider    */
     acism_state_t next_state;               /* Prochaine tête à valider    */
-    uint32_t final_k;                       /* Dernier indice à traiter    */
     uint32_t k;                             /* Boucle de parcours #2       */
+    uint32_t final_k;                       /* Dernier indice à traiter    */
     unsigned int iter;                      /* Boucle de parcours #3       */
     acism_state_t test_state;               /* Test de validité alternative*/
     acism_state_t sub_state;                /* Test de validité alternative*/
diff --git a/src/analysis/scan/scanner.c b/src/analysis/scan/scanner.c
index 507fa6f..f320f93 100644
--- a/src/analysis/scan/scanner.c
+++ b/src/analysis/scan/scanner.c
@@ -493,7 +493,7 @@ GScanContext *g_content_scanner_analyze(GContentScanner *scanner, GScanOptions *
     GScanRule *rule;                        /* Règle à consulter           */
     const char *name;                       /* Désignation de la règle     */
 
-#if 0
+#if 0   // FIXME
 
     int policy;
     struct sched_param sp;
@@ -539,17 +539,18 @@ GScanContext *g_content_scanner_analyze(GContentScanner *scanner, GScanOptions *
         for (i = 0; i < scanner->rule_count && status; i++)
             status = g_scan_rule_setup_backend(scanner->rules[i], scanner->data_backend, result);
 
+        if (status)
+            status = g_engine_backend_warm_up(scanner->data_backend);
+
+        for (i = 0; i < scanner->rule_count && status; i++)
+            status = g_scan_rule_define_pattern_ids(scanner->rules[i], scanner->data_backend);
+
         if (!status)
         {
             g_clear_object(&result);
             goto exit;
         }
 
-        g_engine_backend_warm_up(scanner->data_backend);
-
-        for (i = 0; i < scanner->rule_count && status; i++)
-            status = g_scan_rule_define_pattern_ids(scanner->rules[i], scanner->data_backend);
-
         /* Affichage éventuel de statistiques */
 
         if (g_scan_options_get_print_stats(options))
-- 
cgit v0.11.2-87-g4458