summaryrefslogtreecommitdiff
path: root/src/analysis/scan/patterns/backends/acism-int.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/patterns/backends/acism-int.h')
-rw-r--r--src/analysis/scan/patterns/backends/acism-int.h90
1 files changed, 68 insertions, 22 deletions
diff --git a/src/analysis/scan/patterns/backends/acism-int.h b/src/analysis/scan/patterns/backends/acism-int.h
index 57c3c73..c4a72ca 100644
--- a/src/analysis/scan/patterns/backends/acism-int.h
+++ b/src/analysis/scan/patterns/backends/acism-int.h
@@ -47,13 +47,35 @@
/* Définition d'une portion de cible */
typedef struct _acism_source_t
{
+ /**
+ * Champs renseignés dans g_acism_backend_setup_for().
+ */
+
const uint8_t *atoms; /* Motif remarquable */
size_t len; /* Nombre d'octets considérés */
- patid_t pid; /* Identifiant de suivi */
+ /**
+ * Champs renseignés dans g_acism_backend_build_trie().
+ */
+
+ bool is_first; /* Première instance rencontrée*/
+
+ union
+ {
+ uint32_t coverage[2]; /* Départ et quantité de suivis*/
+ struct
+ {
+ size_t first_source; /* Indice de première source */
+ uint32_t index; /* Position dans la liste */
+ };
+ };
} acism_source_t;
+#define SOURCE_COVERAGE_START 0
+#define SOURCE_COVERAGE_COUNT 1
+#define SOURCE_COVERAGE_END 1
+
/* Etude de la fréquence des octets pour attribution des codes */
typedef struct _acism_freq_rank_t
{
@@ -68,6 +90,8 @@ typedef uint16_t acism_code_t;
#define MIN_ACISM_CODE 0
#define MAX_ACISM_CODE 0xffff
+#define ROOT_STATE_INDEX 0
+
/* Noeud de l'arborescence brute */
typedef struct _acism_trie_node_t
{
@@ -79,8 +103,6 @@ typedef struct _acism_trie_node_t
bin_t data; /* Donnée brute représentée */
acism_code_t code; /* Identifiant du noeud */
- patid_t pid; /* Identifiant de suivi */
-
acism_code_t min_child_code; /* Plus petit code suivant */
acism_code_t max_child_code; /* Plus grand code suivant */
size_t children_count; /* Nombre de codes suivants */
@@ -91,35 +113,59 @@ typedef struct _acism_trie_node_t
} acism_trie_node_t;
+#if __LONG_WIDTH__ < 64
+
/* Cellule du tableau compressé final */
-typedef union _acism_state_t
+typedef struct _acism_state_t
{
- uint32_t raw; /* Valeur brute */
-
- struct
+ union
{
- union
+ /* Indice 0 */
+ struct
{
- /* Indice 0 */
- struct
- {
- unsigned int match : 1; /* Correspondance ici */
- unsigned int suffix : 1; /* Correspondance ailleurs */
- unsigned int unused : 4; /* Espace encore disponible */
- unsigned int atom_size : 3; /* Taille d'atome représenté */
- };
-
- /* Indice 1 et + */
- unsigned int code : 9; /* Position depuis la base */
-
+ unsigned int match : 1; /* Correspondance ici */
+ unsigned int unused : 4; /* Espace encore disponible */
+ unsigned int atom_size : 3; /* Taille d'atome représenté */
+ unsigned int suffix : 1; /* Correspondance ailleurs */
};
- unsigned int index : 23; /* Indice de saut */
+ /* Indice 1 et + */
+ unsigned int code : 9; /* Position depuis la base */
};
+ unsigned int index : 23; /* Indice de saut */
+
} acism_state_t;
+#else
+
+/* Cellule du tableau compressé final */
+typedef union _acism_state_t
+{
+ /* Indice 0 */
+ struct
+ {
+ uint8_t match : 1; /* Correspondance ici */
+ uint8_t single_source : 1; /* Unique source à notifier */
+ uint8_t atom_size; /* Indice de saut */
+ uint8_t suffix : 1; /* Correspondance ailleurs */
+ };
+
+ /* Indice 1 et + */
+ uint32_t code; /* Position depuis la base */
+
+ /* Tous */
+ struct
+ {
+ uint32_t any; /* Saut de bits */
+ uint32_t index; /* Indice de saut */
+ };
+
+} acism_state_t;
+
+#endif
+
/* Méthode de recherche basée sur l'algorithme Acism (instance) */
struct _GAcismBackend
{
@@ -144,7 +190,7 @@ struct _GAcismBackend
bitfield_t *bitmap_usage; /* Localisation des usages */
acism_state_t *states; /* Tableau de transitions */
- patid_t *pids; /* Identifiants de motifs */
+ uint32_t *coverages; /* Bornes de suivi de positions*/
};