diff options
Diffstat (limited to 'plugins/yaml/collection.c')
-rw-r--r-- | plugins/yaml/collection.c | 125 |
1 files changed, 46 insertions, 79 deletions
diff --git a/plugins/yaml/collection.c b/plugins/yaml/collection.c index 03c3992..03ab071 100644 --- a/plugins/yaml/collection.c +++ b/plugins/yaml/collection.c @@ -1,6 +1,6 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * collection.h - collection de noeuds Yaml de type "sequence" ou "mapping" + * collection.h - collection de noeuds YAML de type "sequence" ou "mapping" * * Copyright (C) 2019 Cyrille Bagard * @@ -27,34 +27,17 @@ #include <malloc.h> -#include "node-int.h" +#include "collection-int.h" -/* Collection de noeuds au format Yaml (instance) */ -struct _GYamlCollection -{ - GYamlNode parent; /* A laisser en premier */ - - bool is_seq; /* Nature de la collection */ - - GYamlNode **nodes; /* Sous-noeuds intégrés */ - size_t count; /* Nombre de ces enfants */ - -}; +/* -------------------- DEFINITIONS PROPRES POUR LE SUPPORT YAML -------------------- */ -/* Collection de noeuds au format Yaml (classe) */ -struct _GYamlCollectionClass -{ - GYamlNodeClass parent; /* A laisser en premier */ - -}; - -/* Initialise la classe des collections de noeuds Yaml. */ +/* Initialise la classe des collections de noeuds YAML. */ static void g_yaml_collection_class_init(GYamlCollectionClass *); -/* Initialise une instance de collection de noeuds Yaml. */ +/* Initialise une instance de collection de noeuds YAML. */ static void g_yaml_collection_init(GYamlCollection *); /* Supprime toutes les références externes. */ @@ -63,12 +46,22 @@ static void g_yaml_collection_dispose(GYamlCollection *); /* Procède à la libération totale de la mémoire. */ static void g_yaml_collection_finalize(GYamlCollection *); -/* Recherche les noeuds correspondant à un chemin. */ -static void g_yaml_collection_find_by_path(const GYamlCollection *, const char *, bool, GYamlNode ***, size_t *); +/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ + -/* Indique le type défini pour une collection de noeuds Yaml. */ +/* Recherche le premier noeud correspondant à un chemin. */ +static GYamlNode *g_yaml_collection_find_first_by_path(GYamlCollection *, const char *); + + + +/* ---------------------------------------------------------------------------------- */ +/* DEFINITIONS PROPRES POUR LE SUPPORT YAML */ +/* ---------------------------------------------------------------------------------- */ + + +/* Indique le type défini pour une collection de noeuds YAML. */ G_DEFINE_TYPE(GYamlCollection, g_yaml_collection, G_TYPE_YAML_NODE); @@ -76,7 +69,7 @@ G_DEFINE_TYPE(GYamlCollection, g_yaml_collection, G_TYPE_YAML_NODE); * * * Paramètres : klass = classe à initialiser. * * * -* Description : Initialise la classe des collections de noeuds Yaml. * +* Description : Initialise la classe des collections de noeuds YAML. * * * * Retour : - * * * @@ -96,7 +89,7 @@ static void g_yaml_collection_class_init(GYamlCollectionClass *klass) node = G_YAML_NODE_CLASS(klass); - node->find = (find_yaml_node_fc)g_yaml_collection_find_by_path; + node->find = (find_first_yaml_node_fc)g_yaml_collection_find_first_by_path; } @@ -105,7 +98,7 @@ static void g_yaml_collection_class_init(GYamlCollectionClass *klass) * * * Paramètres : collec = instance à initialiser. * * * -* Description : Initialise une instance de collection de noeuds Yaml. * +* Description : Initialise une instance de collection de noeuds YAML. * * * * Retour : - * * * @@ -173,7 +166,7 @@ static void g_yaml_collection_finalize(GYamlCollection *collec) * * * Paramètres : seq = indique la nature de la future collection. * * * -* Description : Construit une collection de noeuds Yaml. * +* Description : Construit une collection de noeuds YAML. * * * * Retour : Instance mise en place ou NULL en cas d'échec. * * * @@ -196,9 +189,9 @@ GYamlCollection *g_yaml_collection_new(bool seq) /****************************************************************************** * * -* Paramètres : collec = noeud d'arborescence Yaml à consulter. * +* Paramètres : collec = noeud d'arborescence YAML à consulter. * * * -* Description : Indique la nature d'une collection Yaml. * +* Description : Indique la nature d'une collection YAML. * * * * Retour : Nature de la collection. * * * @@ -219,10 +212,10 @@ bool g_yaml_collection_is_sequence(const GYamlCollection *collec) /****************************************************************************** * * -* Paramètres : collec = collection de noeuds Yaml à compléter. * +* Paramètres : collec = collection de noeuds YAML à compléter. * * node = noeud à rattacher. * * * -* Description : Ajoute un noeud à une collection de noeuds Yaml. * +* Description : Ajoute un noeud à une collection de noeuds YAML. * * * * Retour : - * * * @@ -242,12 +235,12 @@ void g_yaml_collection_add_node(GYamlCollection *collec, GYamlNode *node) /****************************************************************************** * * -* Paramètres : collec = noeud d'arborescence Yaml à consulter. * +* Paramètres : collec = noeud d'arborescence YAML à consulter. * * count = taille de la liste constituée. [OUT] * * * * Description : Fournit la liste des noeuds intégrés dans une collection. * * * -* Retour : Enfants d'un noeud issu d'une collection Yaml. * +* Retour : Enfants d'un noeud issu d'une collection YAML. * * * * Remarques : - * * * @@ -275,11 +268,11 @@ GYamlNode **g_yaml_collection_get_nodes(const GYamlCollection *collec, size_t *c /****************************************************************************** * * -* Paramètres : collec = noeud d'arborescence Yaml à consulter. * +* Paramètres : collec = noeud d'arborescence YAML à consulter. * * * * Description : Fournit le premier noeud intégré dans une collection. * * * -* Retour : Noeud issu d'une collection Yaml. * +* Retour : Noeud issu d'une collection YAML. * * * * Remarques : - * * * @@ -303,61 +296,35 @@ GYamlNode *g_yaml_collection_get_first_node(const GYamlCollection *collec) } + +/* ---------------------------------------------------------------------------------- */ +/* IMPLEMENTATION DES FONCTIONS DE CLASSE */ +/* ---------------------------------------------------------------------------------- */ + + /****************************************************************************** * * -* Paramètres : node = noeud d'arborescence Yaml à consulter. * -* path = chemin d'accès à parcourir. * -* prepare = indication sur une préparation d'un prochain appel.* -* nodes = liste de noeuds avec correspondance établie. [OUT] * -* count = quantité de ces noeuds. [OUT] * +* Paramètres : collec = noeud d'arborescence YAML à consulter. * +* path = chemin d'accès à parcourir. * * * -* Description : Recherche les noeuds correspondant à un chemin. * +* Description : Recherche le premier noeud correspondant à un chemin. * * * -* Retour : - * +* Retour : Noeud avec la correspondance établie ou NULL si non trouvé. * * * * Remarques : - * * * ******************************************************************************/ -static void g_yaml_collection_find_by_path(const GYamlCollection *collec, const char *path, bool prepare, GYamlNode ***nodes, size_t *count) +static GYamlNode *g_yaml_collection_find_first_by_path(GYamlCollection *collec, const char *path) { + GYamlNode *result; /* Trouvaille à retourner */ size_t i; /* Boucle de parcours */ - if (path[0] != '/') - goto wrong_path; - - if (path[1] == '\0') - { - if (prepare) - { - *nodes = realloc(*nodes, ++(*count) * sizeof(GYamlNode **)); - - g_object_ref(G_OBJECT(collec)); - (*nodes)[*count - 1] = G_YAML_NODE(collec); - - } - else - { - *nodes = realloc(*nodes, (*count + collec->count) * sizeof(GYamlNode **)); - - for (i = 0; i < collec->count; i++) - { - g_object_ref(G_OBJECT(collec->nodes[i])); - (*nodes)[*count + i] = collec->nodes[i]; - } + result = NULL; - *count += collec->count; + for (i = 0; i < collec->count && result == NULL; i++) + result = g_yaml_node_find_first_by_path(collec->nodes[i], path); - } - - } - - else - for (i = 0; i < collec->count; i++) - _g_yaml_node_find_by_path(collec->nodes[i], path, prepare, nodes, count); - - wrong_path: - - ; + return result; } |