summaryrefslogtreecommitdiff
path: root/src/analysis/scan/patterns/tokens/nodes/sequence.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/patterns/tokens/nodes/sequence.c')
-rw-r--r--src/analysis/scan/patterns/tokens/nodes/sequence.c86
1 files changed, 82 insertions, 4 deletions
diff --git a/src/analysis/scan/patterns/tokens/nodes/sequence.c b/src/analysis/scan/patterns/tokens/nodes/sequence.c
index ad332fc..91307bf 100644
--- a/src/analysis/scan/patterns/tokens/nodes/sequence.c
+++ b/src/analysis/scan/patterns/tokens/nodes/sequence.c
@@ -24,6 +24,7 @@
#include "sequence.h"
+#include "any.h"
#include "sequence-int.h"
@@ -224,7 +225,7 @@ bool g_scan_token_node_sequence_create(GScanTokenNodeSequence *sequence, GScanTo
/******************************************************************************
* *
* Paramètres : sequence = ensemble de noeuds à compléter. *
-* child = nouveau noeud à intégrer. *
+* child = nouveau noeud à intégrer. *
* *
* Description : Ajoute un noeud à aux décompositions séquentielles de motif. *
* *
@@ -236,10 +237,87 @@ bool g_scan_token_node_sequence_create(GScanTokenNodeSequence *sequence, GScanTo
void g_scan_token_node_sequence_add(GScanTokenNodeSequence *sequence, GScanTokenNode *child)
{
- sequence->children = realloc(sequence->children, ++sequence->count * sizeof(GScanTokenNode *));
+ bool processed; /* Intégration traitée ? */
+ GScanTokenNode *last; /* Dernier noeud inscrit */
- sequence->children[sequence->count - 1] = child;
- g_object_ref(G_OBJECT(child));
+ processed = false;
+
+ if (sequence->count > 0)
+ {
+ last = sequence->children[sequence->count - 1];
+
+ if (G_IS_SCAN_TOKEN_NODE_ANY(last) && G_IS_SCAN_TOKEN_NODE_ANY(child))
+ {
+ g_scan_token_node_any_merge(G_SCAN_TOKEN_NODE_ANY(last), G_SCAN_TOKEN_NODE_ANY(child));
+ processed = true;
+ }
+
+ }
+
+ if (!processed)
+ {
+ sequence->children = realloc(sequence->children, ++sequence->count * sizeof(GScanTokenNode *));
+
+ sequence->children[sequence->count - 1] = child;
+ g_object_ref(G_OBJECT(child));
+
+ }
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : sequence = ensemble de noeuds à consulter. *
+* *
+* Description : Indique le nombre de noeuds intégrés dans la séquence. *
+* *
+* Retour : Nombre de noeuds représentés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+size_t g_scan_token_node_sequence_count(const GScanTokenNodeSequence *sequence)
+{
+ size_t result; /* Quantité à retourner */
+
+ result = sequence->count;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : sequence = ensemble de noeuds à consulter. *
+* index = indice du noeud à retourner. *
+* *
+* Description : Fournit un noeud donné d'une décomposition séquentielle. *
+* *
+* Retour : Noeud inclus dans l'ensemble ou NULL si mauvais indice. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GScanTokenNode *g_scan_token_node_sequence_get(const GScanTokenNodeSequence *sequence, size_t index)
+{
+ GScanTokenNode *result; /* Instance à retourner */
+
+ assert(index < sequence->count);
+
+ if (index < sequence->count)
+ {
+ result = sequence->children[index];
+ g_object_ref(G_OBJECT(result));
+ }
+
+ else
+ result = NULL;
+
+ return result;
}