summaryrefslogtreecommitdiff
path: root/src/analysis/scan/exprs/setcounter.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/exprs/setcounter.c')
-rw-r--r--src/analysis/scan/exprs/setcounter.c122
1 files changed, 111 insertions, 11 deletions
diff --git a/src/analysis/scan/exprs/setcounter.c b/src/analysis/scan/exprs/setcounter.c
index da37746..bed315e 100644
--- a/src/analysis/scan/exprs/setcounter.c
+++ b/src/analysis/scan/exprs/setcounter.c
@@ -24,6 +24,10 @@
#include "setcounter.h"
+#include <assert.h>
+#include <string.h>
+
+
#include "setcounter-int.h"
#include "literal.h"
@@ -109,6 +113,7 @@ static void g_scan_set_match_counter_init(GScanSetMatchCounter *counter)
{
counter->patterns = NULL;
counter->count = 0;
+ counter->shared = true;
counter->type = SSCT_NONE;
counter->number = 0;
@@ -132,8 +137,9 @@ static void g_scan_set_match_counter_dispose(GScanSetMatchCounter *counter)
{
size_t i; /* Boucle de parcours */
- for (i = 0; i < counter->count; i++)
- g_clear_object(&counter->patterns[i]);
+ if (!counter->shared)
+ for (i = 0; i < counter->count; i++)
+ g_clear_object(&counter->ref_patterns[i]);
G_OBJECT_CLASS(g_scan_set_match_counter_parent_class)->dispose(G_OBJECT(counter));
@@ -175,13 +181,75 @@ static void g_scan_set_match_counter_finalize(GScanSetMatchCounter *counter)
* *
******************************************************************************/
+GScanExpression *g_scan_set_match_counter_new_shared(const GSearchPattern ** const patterns, size_t count)
+{
+ GScanExpression *result; /* Structure à retourner */
+
+ result = g_object_new(G_TYPE_SCAN_SET_MATCH_COUNTER, NULL);
+
+ if (!g_scan_set_match_counter_create_shared(G_SCAN_SET_MATCH_COUNTER(result), patterns, count))
+ g_clear_object(&result);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : counter = instance à initialiser pleinement. *
+* patterns = motifs à impliquer. *
+* count = quantité de ces motifs. *
+* *
+* Description : Met en place un décompte de motifs avec correspondances. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_scan_set_match_counter_create_shared(GScanSetMatchCounter *counter, const GSearchPattern ** const patterns, size_t count)
+{
+ bool result; /* Bilan à retourner */
+
+ result = g_scan_expression_create(G_SCAN_EXPRESSION(counter), SRS_WAIT_FOR_SCAN);
+ if (!result) goto exit;
+
+ counter->patterns = malloc(count * sizeof(GSearchPattern *));
+ counter->count = count;
+
+ memcpy(counter->patterns, patterns, count * sizeof(GSearchPattern *));
+
+ counter->shared = true;
+
+ exit:
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : patterns = motifs à impliquer. *
+* count = quantité de ces motifs. *
+* *
+* Description : Constitue un décompte de motifs avec correspondances. *
+* *
+* Retour : Expression mise en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
GScanExpression *g_scan_set_match_counter_new(GSearchPattern ** const patterns, size_t count)
{
GScanExpression *result; /* Structure à retourner */
result = g_object_new(G_TYPE_SCAN_SET_MATCH_COUNTER, NULL);
- if (!g_scan_set_match_counter_create(G_SCAN_SET_MATCH_COUNTER(result), patterns, count))
+ if (!g_scan_set_match_counter_create_and_ref(G_SCAN_SET_MATCH_COUNTER(result), patterns, count))
g_clear_object(&result);
return result;
@@ -203,7 +271,7 @@ GScanExpression *g_scan_set_match_counter_new(GSearchPattern ** const patterns,
* *
******************************************************************************/
-bool g_scan_set_match_counter_create(GScanSetMatchCounter *counter, GSearchPattern ** const patterns, size_t count)
+bool g_scan_set_match_counter_create_and_ref(GScanSetMatchCounter *counter, GSearchPattern ** const patterns, size_t count)
{
bool result; /* Bilan à retourner */
size_t i; /* Boucle de parcours */
@@ -214,11 +282,12 @@ bool g_scan_set_match_counter_create(GScanSetMatchCounter *counter, GSearchPatte
counter->patterns = malloc(count * sizeof(GSearchPattern *));
counter->count = count;
+ memcpy(counter->patterns, patterns, count * sizeof(GSearchPattern *));
+
for (i = 0; i < count; i++)
- {
- counter->patterns[i] = patterns[i];
g_object_ref(G_OBJECT(patterns[i]));
- }
+
+ counter->shared = false;
exit:
@@ -241,21 +310,52 @@ bool g_scan_set_match_counter_create(GScanSetMatchCounter *counter, GSearchPatte
* *
******************************************************************************/
-void g_scan_set_match_counter_add_extra_patterns(GScanSetMatchCounter *counter, GSearchPattern ** const patterns, size_t count)
+void g_scan_set_match_counter_add_extra_shared_patterns(GScanSetMatchCounter *counter, const GSearchPattern ** const patterns, size_t count)
+{
+ size_t first; /* Premier emplacement libre */
+
+ assert(counter->shared);
+
+ first = counter->count;
+
+ counter->count += count;
+ counter->patterns = realloc(counter->patterns, counter->count * sizeof(GSearchPattern *));
+
+ memcpy(counter->patterns + first, patterns, count * sizeof(GSearchPattern *));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : counter = décompte à compléter. *
+* patterns = motifs à impliquer. *
+* count = quantité de ces motifs. *
+* *
+* Description : Ajoute de nouveaux motifs à un ensemble à décompter. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_scan_set_match_counter_add_and_ref_extra_patterns(GScanSetMatchCounter *counter, GSearchPattern ** const patterns, size_t count)
{
size_t first; /* Premier emplacement libre */
size_t i; /* Boucle de parcours */
+ assert(!counter->shared);
+
first = counter->count;
counter->count += count;
counter->patterns = realloc(counter->patterns, counter->count * sizeof(GSearchPattern *));
+ memcpy(counter->patterns + first, patterns, count * sizeof(GSearchPattern *));
+
for (i = 0; i < count; i++)
- {
- counter->patterns[first + i] = patterns[i];
g_object_ref(G_OBJECT(patterns[i]));
- }
}