summaryrefslogtreecommitdiff
path: root/src/analysis/scan/context.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/context.c')
-rw-r--r--src/analysis/scan/context.c79
1 files changed, 71 insertions, 8 deletions
diff --git a/src/analysis/scan/context.c b/src/analysis/scan/context.c
index 8a9b600..94ea519 100644
--- a/src/analysis/scan/context.c
+++ b/src/analysis/scan/context.c
@@ -50,6 +50,9 @@ static void delete_full_match_tracker(full_match_tracker_t *);
/* Etablit la comparaison entre deux structures de suivi. */
static int compare_full_match_trackers(const full_match_tracker_t **, const full_match_tracker_t **);
+/* Prépare l'intégration d'une série de correspondances. */
+static void prepare_full_match_tracker(full_match_tracker_t *, size_t);
+
/* Note l'existence d'une nouvelle correspondance pour un motif. */
static void add_match_to_full_match_tracker(full_match_tracker_t *, GScanMatch *);
@@ -161,6 +164,30 @@ static int compare_full_match_trackers(const full_match_tracker_t **a, const ful
/******************************************************************************
* *
+* Paramètres : tracker = structure de gestion à manipuler. *
+* expected = quantité totale de correspondances attendue. *
+* *
+* Description : Prépare l'intégration d'une série de correspondances. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void prepare_full_match_tracker(full_match_tracker_t *tracker, size_t expected)
+{
+ if ((tracker->used + expected) > tracker->allocated)
+ {
+ tracker->allocated += expected;
+ tracker->matches = realloc(tracker->matches, tracker->allocated * sizeof(GScanMatch *));
+ }
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : tracker = structure de gestion à manipuler. *
* match = correspondance complète établie. *
* *
@@ -245,6 +272,7 @@ static void g_scan_context_init(GScanContext *context)
context->full_trackers = NULL;
context->full_count = 0;
+ context->current_tracker = NULL;
context->global = true;
@@ -567,10 +595,11 @@ const phys_t *g_scan_context_get_atom_matches(const GScanContext *context, patid
/******************************************************************************
* *
-* Paramètres : context = instance à mettre à jour. *
-* match = représentation d'une plein ecorrespondance. *
+* Paramètres : context = instance à mettre à jour. *
+* match = représentation d'une plein ecorrespondance. *
+* expected = quantité totale de correspondances attendue. *
* *
-* Description : Enregistre une correspondance complète avec un contenu. *
+* Description : Prépare les enregistrements de correspondances complètes. *
* *
* Retour : - *
* *
@@ -578,15 +607,12 @@ const phys_t *g_scan_context_get_atom_matches(const GScanContext *context, patid
* *
******************************************************************************/
-void g_scan_context_register_full_match(GScanContext *context, GScanMatch *match)
+void g_scan_context_prepare_full_match_registration(GScanContext *context, GSearchPattern *pattern, size_t expected)
{
- GSearchPattern *pattern; /* Clef d'un suivi */
full_match_tracker_t key; /* Modèle d'identification */
full_match_tracker_t **found; /* Structure à actualiser */
full_match_tracker_t *tracker; /* Nouveau suivi à intégrer */
- pattern = g_scan_match_get_source(match);
-
key.pattern = pattern;
found = bsearch((full_match_tracker_t *[]) { &key }, context->full_trackers, context->full_count,
@@ -604,10 +630,47 @@ void g_scan_context_register_full_match(GScanContext *context, GScanMatch *match
else
tracker = *found;
- add_match_to_full_match_tracker(tracker, match);
+ prepare_full_match_tracker(tracker, expected);
+
+ context->current_tracker = tracker;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : context = instance à mettre à jour. *
+* match = représentation d'une plein ecorrespondance. *
+* *
+* Description : Enregistre une correspondance complète avec un contenu. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_scan_context_register_full_match(GScanContext *context, GScanMatch *match)
+{
+#ifndef NDEBUG
+ GSearchPattern *pattern; /* Clef d'un suivi */
+#endif
+
+ assert(context->current_tracker != NULL);
+
+#ifndef NDEBUG
+
+ pattern = g_scan_match_get_source(match);
+
+ assert(context->current_tracker->pattern == pattern);
g_object_unref(G_OBJECT(pattern));
+
+#endif
+
+ add_match_to_full_match_tracker(context->current_tracker, match);
+
}