From 25bac01127581767639a5bd9024c41eb803388fa Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Thu, 27 Apr 2023 23:27:52 +0200 Subject: Replace the old YAML parser by another one relying on the external libyaml library. --- configure.ac | 15 ++ plugins/yaml/Makefile.am | 12 +- plugins/yaml/collection-int.h | 56 +++++ plugins/yaml/collection.c | 125 +++++------- plugins/yaml/collection.h | 16 +- plugins/yaml/core.c | 2 +- plugins/yaml/core.h | 2 +- plugins/yaml/line.c | 400 ------------------------------------ plugins/yaml/line.h | 75 ------- plugins/yaml/node-int.h | 20 +- plugins/yaml/node.c | 131 +++--------- plugins/yaml/node.h | 23 +-- plugins/yaml/pair-int.h | 63 ++++++ plugins/yaml/pair.c | 308 ++++++++++++++-------------- plugins/yaml/pair.h | 9 +- plugins/yaml/parser.c | 283 +++++++++++++++++++++++++ plugins/yaml/parser.h | 43 ++++ plugins/yaml/python/Makefile.am | 5 +- plugins/yaml/python/collection.c | 17 +- plugins/yaml/python/collection.h | 4 +- plugins/yaml/python/line.c | 431 --------------------------------------- plugins/yaml/python/line.h | 45 ---- plugins/yaml/python/module.c | 23 ++- plugins/yaml/python/node.c | 178 +++------------- plugins/yaml/python/node.h | 4 +- plugins/yaml/python/pair.c | 130 +++++++----- plugins/yaml/python/pair.h | 4 +- plugins/yaml/python/parser.c | 186 +++++++++++++++++ plugins/yaml/python/parser.h | 39 ++++ plugins/yaml/python/reader.c | 365 --------------------------------- plugins/yaml/python/reader.h | 45 ---- plugins/yaml/python/scalar.c | 304 --------------------------- plugins/yaml/python/scalar.h | 45 ---- plugins/yaml/python/tree.c | 427 -------------------------------------- plugins/yaml/python/tree.h | 45 ---- plugins/yaml/reader-int.h | 60 ------ plugins/yaml/reader.c | 373 --------------------------------- plugins/yaml/reader.h | 69 ------- plugins/yaml/scalar.c | 378 ---------------------------------- plugins/yaml/scalar.h | 72 ------- plugins/yaml/tree.c | 421 -------------------------------------- plugins/yaml/tree.h | 69 ------- tests/plugins/yaml.py | 148 ++++++++++++++ tests/plugins/yamlrdr.py | 261 ------------------------ 44 files changed, 1213 insertions(+), 4518 deletions(-) create mode 100644 plugins/yaml/collection-int.h delete mode 100644 plugins/yaml/line.c delete mode 100644 plugins/yaml/line.h create mode 100644 plugins/yaml/pair-int.h create mode 100644 plugins/yaml/parser.c create mode 100644 plugins/yaml/parser.h delete mode 100644 plugins/yaml/python/line.c delete mode 100644 plugins/yaml/python/line.h create mode 100644 plugins/yaml/python/parser.c create mode 100644 plugins/yaml/python/parser.h delete mode 100644 plugins/yaml/python/reader.c delete mode 100644 plugins/yaml/python/reader.h delete mode 100644 plugins/yaml/python/scalar.c delete mode 100644 plugins/yaml/python/scalar.h delete mode 100644 plugins/yaml/python/tree.c delete mode 100644 plugins/yaml/python/tree.h delete mode 100644 plugins/yaml/reader-int.h delete mode 100644 plugins/yaml/reader.c delete mode 100644 plugins/yaml/reader.h delete mode 100644 plugins/yaml/scalar.c delete mode 100644 plugins/yaml/scalar.h delete mode 100644 plugins/yaml/tree.c delete mode 100644 plugins/yaml/tree.h create mode 100644 tests/plugins/yaml.py delete mode 100644 tests/plugins/yamlrdr.py diff --git a/configure.ac b/configure.ac index 9e4375c..f4fe90b 100644 --- a/configure.ac +++ b/configure.ac @@ -489,6 +489,20 @@ if test "x$enable_curl_support" = "xyes"; then fi +#--- Checks for libyaml + +PKG_CHECK_MODULES(LIBYAML,yaml-0.1 >= 0.2.5,[libyaml_found=yes],[libyaml_found=no]) + +if test "$libyaml_found" = "yes"; then + libyaml_version=`pkg-config yaml-0.1 --modversion` +else + libyaml_version='-' +fi + +AC_SUBST(LIBYAML_CFLAGS) +AC_SUBST(LIBYAML_LIBS) + + #--- Checks for Python if test "x$enable_debug" = "xyes"; then @@ -740,6 +754,7 @@ echo The flexible interface for archives I/O...... : $libarchive_version echo The small, fast and reliable database engine. : $libsqlite_version echo The cryptography and SSL/TLS toolkit......... : $libssl_version echo The client URL library....................... : $libcurl_version +echo The YAML support library..................... : $libyaml_version echo echo Available Python programming language........ : $python3_version diff --git a/plugins/yaml/Makefile.am b/plugins/yaml/Makefile.am index 868fcf1..1165d7a 100644 --- a/plugins/yaml/Makefile.am +++ b/plugins/yaml/Makefile.am @@ -36,26 +36,24 @@ endif libyaml_la_SOURCES = \ + collection-int.h \ collection.h collection.c \ core.h core.c \ - line.h line.c \ node-int.h \ node.h node.c \ + pair-int.h \ pair.h pair.c \ - reader-int.h \ - reader.h reader.c \ - scalar.h scalar.c \ - tree.h tree.c + parser.h parser.c libyaml_la_LIBADD = \ $(PYTHON3_LIBADD) -libyaml_la_CFLAGS = $(TOOLKIT_CFLAGS) $(LIBXML_CFLAGS) -I$(top_srcdir)/src +libyaml_la_CFLAGS = $(TOOLKIT_CFLAGS) $(LIBXML_CFLAGS) $(LIBYAML_CFLAGS) -I$(top_srcdir)/src libyaml_la_LDFLAGS = \ -avoid-version \ -L$(top_srcdir)/src/.libs -lchrysacore \ - $(RUN_PATH) $(PYTHON3_LDFLAGS) + $(RUN_PATH) $(LIBYAML_LIBS) $(PYTHON3_LDFLAGS) devdir = $(includedir)/chrysalide/$(subdir) diff --git a/plugins/yaml/collection-int.h b/plugins/yaml/collection-int.h new file mode 100644 index 0000000..ae9607a --- /dev/null +++ b/plugins/yaml/collection-int.h @@ -0,0 +1,56 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * collection-int.h - prototypes internes pour la définition d'un noeud YAML + * + * Copyright (C) 2019-2023 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Chrysalide. If not, see . + */ + + +#ifndef PLUGINS_YAML_COLLECTION_INT_H +#define PLUGINS_YAML_COLLECTION_INT_H + + +#include "collection.h" + + +#include "node-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 */ + +}; + +/* Collection de noeuds au format YAML (classe) */ +struct _GYamlCollectionClass +{ + GYamlNodeClass parent; /* A laisser en premier */ + +}; + + + +#endif /* PLUGINS_YAML_COLLECTION_INT_H */ 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 -#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; } diff --git a/plugins/yaml/collection.h b/plugins/yaml/collection.h index 4bf0f2d..8a026ae 100644 --- a/plugins/yaml/collection.h +++ b/plugins/yaml/collection.h @@ -1,8 +1,8 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * collection.h - prototypes pour une collection de noeuds Yaml de type "sequence" ou "mapping" + * collection.h - prototypes pour une collection de noeuds YAML de type "sequence" ou "mapping" * - * Copyright (C) 2019 Cyrille Bagard + * Copyright (C) 2019-2023 Cyrille Bagard * * This file is part of Chrysalide. * @@ -41,23 +41,23 @@ #define G_YAML_COLLEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_YAML_COLLEC, GYamlCollectionClass)) -/* Collection de noeuds au format Yaml (instance) */ +/* Collection de noeuds au format YAML (instance) */ typedef struct _GYamlCollection GYamlCollection; -/* Collection de noeuds au format Yaml (classe) */ +/* Collection de noeuds au format YAML (classe) */ typedef struct _GYamlCollectionClass GYamlCollectionClass; -/* Indique le type défini pour une collection de noeuds Yaml. */ +/* Indique le type défini pour une collection de noeuds YAML. */ GType g_yaml_collection_get_type(void); -/* Construit une collection de noeuds Yaml. */ +/* Construit une collection de noeuds YAML. */ GYamlCollection *g_yaml_collection_new(bool); -/* Indique la nature d'une collection Yaml. */ +/* Indique la nature d'une collection YAML. */ bool g_yaml_collection_is_sequence(const GYamlCollection *); -/* Ajoute un noeud à une collection de noeuds Yaml. */ +/* Ajoute un noeud à une collection de noeuds YAML. */ void g_yaml_collection_add_node(GYamlCollection *, GYamlNode *); /* Fournit la liste des noeuds intégrés dans une collection. */ diff --git a/plugins/yaml/core.c b/plugins/yaml/core.c index ffc7edd..7ac49e3 100644 --- a/plugins/yaml/core.c +++ b/plugins/yaml/core.c @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * core.c - lecture de contenus au format Yaml * - * Copyright (C) 2019 Cyrille Bagard + * Copyright (C) 2019-2023 Cyrille Bagard * * This file is part of Chrysalide. * diff --git a/plugins/yaml/core.h b/plugins/yaml/core.h index a46dbe7..b846e24 100644 --- a/plugins/yaml/core.h +++ b/plugins/yaml/core.h @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * core.h - prototypes pour la lecture de contenus au format Yaml * - * Copyright (C) 2019 Cyrille Bagard + * Copyright (C) 2019-2023 Cyrille Bagard * * This file is part of Chrysalide. * diff --git a/plugins/yaml/line.c b/plugins/yaml/line.c deleted file mode 100644 index 3466bb8..0000000 --- a/plugins/yaml/line.c +++ /dev/null @@ -1,400 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * line.c - ligne de contenu Yaml - * - * Copyright (C) 2019 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Chrysalide. If not, see . - */ - - -#include "line.h" - - -#include -#include - - -#include - - - -/* Ligne de données au format Yaml (instance) */ -struct _GYamlLine -{ - GObject parent; /* A laisser en premier */ - - char *raw; /* Contenu brut de la ligne */ - size_t number; /* Indice associé */ - - size_t indent; /* Niveau d'indentation */ - bool is_list_item; /* Elément de liste ? */ - - const char *payload; /* Charge utile du contenu */ - - char *key; /* Clef de la ligne Yaml */ - char *value; /* Valeyr de la ligne Yaml */ - -}; - -/* Ligne de données au format Yaml (classe) */ -struct _GYamlLineClass -{ - GObjectClass parent; /* A laisser en premier */ - -}; - - -/* Initialise la classe des lignes de contenu Yaml. */ -static void g_yaml_line_class_init(GYamlLineClass *); - -/* Initialise une instance de ligne de contenu Yaml. */ -static void g_yaml_line_init(GYamlLine *); - -/* Supprime toutes les références externes. */ -static void g_yaml_line_dispose(GYamlLine *); - -/* Procède à la libération totale de la mémoire. */ -static void g_yaml_line_finalize(GYamlLine *); - - - -/* Indique le type défini pour une ligne de données au format Yaml. */ -G_DEFINE_TYPE(GYamlLine, g_yaml_line, G_TYPE_OBJECT); - - -/****************************************************************************** -* * -* Paramètres : klass = classe à initialiser. * -* * -* Description : Initialise la classe des lignes de contenu Yaml. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_line_class_init(GYamlLineClass *klass) -{ - GObjectClass *object; /* Autre version de la classe */ - - object = G_OBJECT_CLASS(klass); - - object->dispose = (GObjectFinalizeFunc/* ! */)g_yaml_line_dispose; - object->finalize = (GObjectFinalizeFunc)g_yaml_line_finalize; - -} - - -/****************************************************************************** -* * -* Paramètres : line = instance à initialiser. * -* * -* Description : Initialise une instance de ligne de contenu Yaml. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_line_init(GYamlLine *line) -{ - line->raw = NULL; - line->number = -1; - - line->indent = 0; - line->is_list_item = false; - - line->payload = NULL; - line->key = NULL; - line->value = NULL; - -} - - -/****************************************************************************** -* * -* Paramètres : line = instance d'objet GLib à traiter. * -* * -* Description : Supprime toutes les références externes. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_line_dispose(GYamlLine *line) -{ - G_OBJECT_CLASS(g_yaml_line_parent_class)->dispose(G_OBJECT(line)); - -} - - -/****************************************************************************** -* * -* Paramètres : line = instance d'objet GLib à traiter. * -* * -* Description : Procède à la libération totale de la mémoire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_line_finalize(GYamlLine *line) -{ - if (line->raw != NULL) - free(line->raw); - - if (line->key != NULL) - free(line->key); - - if (line->value != NULL) - free(line->value); - - G_OBJECT_CLASS(g_yaml_line_parent_class)->finalize(G_OBJECT(line)); - -} - - -/****************************************************************************** -* * -* Paramètres : raw = contenu brut d'une ligne au format Yaml. * -* rlen = taille de ce contenu brut. * -* number = indice associé à la ligne. * -* * -* Description : Met en place un gestionnaire pour ligne au format Yaml. * -* * -* Retour : Instance mise en place ou NULL en cas d'échec. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlLine *g_yaml_line_new(const char *raw, size_t rlen, size_t number) -{ - GYamlLine *result; /* Structure à retourner */ - char *iter; /* Boucle de parcours */ - bool string_content[2]; /* Ouvertures de chaînes */ - bool escape; /* Echappement de marquant */ - - result = g_object_new(G_TYPE_YAML_LINE, NULL); - - result->raw = strndup(raw, rlen); - result->number = number; - - /* Indentation */ - - for (iter = result->raw; *iter != '\0'; iter++) - { - if (*iter != ' ') - break; - - result->indent++; - - } - - if (*iter == '-') - { - result->is_list_item = true; - - for (iter++; *iter != '\0'; iter++) - if (*iter != ' ') - break; - - } - - result->payload = iter; - - /* Eventuel couple clef/valeur */ - - string_content[0] = false; - string_content[1] = false; - - for (; *iter != '\0'; iter++) - { - if (*iter == '\'' && !string_content[1]) - { - if (iter == result->payload) - escape = false; - - else - escape = *(iter - 1) == '\''; - - if (!escape) - string_content[0] = !string_content[0]; - - } - - else if (*iter == '"' && !string_content[0]) - { - if (iter == result->payload) - escape = false; - - else - escape = *(iter - 1) == '\\'; - - if (!escape) - string_content[1] = !string_content[1]; - - } - - else if (!string_content[0] && !string_content[1]) - { - - if (*iter == ':') - break; - - - } - - } - - if (*iter != '\0') - { - result->key = strndup(result->payload, iter - result->payload); - - for (iter++; *iter != '\0'; iter++) - if (*iter != ' ') - break; - - if (*iter != '\0') - result->value = strdup(iter); - - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : line = ligne au format Yaml à consulter. * -* * -* Description : Fournit la taille de l'indentation d'une ligne Yaml. * -* * -* Retour : Taille de l'indentation rencontrée. * -* * -* Remarques : - * -* * -******************************************************************************/ - -size_t g_yaml_line_count_indent(const GYamlLine *line) -{ - size_t result; /* Quantité à retourner */ - - result = line->indent; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : line = ligne au format Yaml à consulter. * -* * -* Description : Indique si la ligne représente un élément de liste. * -* * -* Retour : Statut de l'état lié à une liste d'éléments. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool g_yaml_line_is_list_item(const GYamlLine *line) -{ - bool result; /* Statut à retourner */ - - result = line->is_list_item; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : line = ligne au format Yaml à consulter. * -* * -* Description : Fournit la charge utile associée à une ligne Yaml. * -* * -* Retour : Contenu sous forme de chaîne de caractères. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const char *g_yaml_line_get_payload(const GYamlLine *line) -{ - const char *result; /* Valeur à retourner */ - - result = line->payload; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : line = ligne au format Yaml à consulter. * -* * -* Description : Fournit la clef associée à une ligne Yaml si elle existe. * -* * -* Retour : Clef sous forme de chaîne de caractères ou NULL. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const char *g_yaml_line_get_key(const GYamlLine *line) -{ - char *result; /* Valeur à retourner */ - - result = line->key; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : line = ligne au format Yaml à consulter. * -* * -* Description : Fournit la valeur associée à une ligne Yaml si elle existe. * -* * -* Retour : Valeur sous forme de chaîne de caractères ou NULL. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const char *g_yaml_line_get_value(const GYamlLine *line) -{ - char *result; /* Valeur à retourner */ - - result = line->value; - - return result; - -} diff --git a/plugins/yaml/line.h b/plugins/yaml/line.h deleted file mode 100644 index 5a3f942..0000000 --- a/plugins/yaml/line.h +++ /dev/null @@ -1,75 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * line.h - prototypes pour une ligne de contenu Yaml - * - * Copyright (C) 2019 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Chrysalide. If not, see . - */ - - -#ifndef PLUGINS_YAML_LINE_H -#define PLUGINS_YAML_LINE_H - - -#include -#include - - - -#define G_TYPE_YAML_LINE g_yaml_line_get_type() -#define G_YAML_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_YAML_LINE, GYamlLine)) -#define G_IS_YAML_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_YAML_LINE)) -#define G_YAML_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_YAML_LINE, GYamlLineClass)) -#define G_IS_YAML_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_YAML_LINE)) -#define G_YAML_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_YAML_LINE, GYamlLineClass)) - - -/* Ligne de données au format Yaml (instance) */ -typedef struct _GYamlLine GYamlLine; - -/* Ligne de données au format Yaml (classe) */ -typedef struct _GYamlLineClass GYamlLineClass; - - -/* Indique le type défini pour une ligne de données au format Yaml. */ -GType g_yaml_line_get_type(void); - -/* Met en place un gestionnaire pour ligne au format Yaml. */ -GYamlLine *g_yaml_line_new(const char *, size_t, size_t); - -/* Fournit la taille de l'indentation d'une ligne Yaml. */ -size_t g_yaml_line_count_indent(const GYamlLine *); - -/* Indique si la ligne représente un élément de liste. */ -bool g_yaml_line_is_list_item(const GYamlLine *); - -/* Fournit la charge utile associée à une ligne Yaml. */ -const char *g_yaml_line_get_payload(const GYamlLine *); - -/* Fournit la clef associée à une ligne Yaml si elle existe. */ -const char *g_yaml_line_get_key(const GYamlLine *); - -/* Fournit la valeur associée à une ligne Yaml si elle existe. */ -const char *g_yaml_line_get_value(const GYamlLine *); - - - -#define g_yaml_line_get_number(l) 0 - - - -#endif /* PLUGINS_YAML_LINE_H */ diff --git a/plugins/yaml/node-int.h b/plugins/yaml/node-int.h index a389f61..cd87950 100644 --- a/plugins/yaml/node-int.h +++ b/plugins/yaml/node-int.h @@ -1,8 +1,8 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * node-int.h - prototypes internes pour la définition d'un noeud Yaml + * node-int.h - prototypes internes pour la définition d'un noeud YAML * - * Copyright (C) 2019-2020 Cyrille Bagard + * Copyright (C) 2019-2023 Cyrille Bagard * * This file is part of Chrysalide. * @@ -29,32 +29,26 @@ -/* Recherche les noeuds correspondant à un chemin. */ -typedef void (* find_yaml_node_fc) (const GYamlNode *, const char *, bool, GYamlNode ***, size_t *); +/* Recherche le premier noeud correspondant à un chemin. */ +typedef GYamlNode * (* find_first_yaml_node_fc) (GYamlNode *, const char *); -/* Noeud d'une arborescence au format Yaml (instance) */ +/* Noeud d'une arborescence au format YAML (instance) */ struct _GYamlNode { GObject parent; /* A laisser en premier */ - GYamlLine *line; /* Line Yaml d'origine */ - }; -/* Noeud d'une arborescence au format Yaml (classe) */ +/* Noeud d'une arborescence au format YAML (classe) */ struct _GYamlNodeClass { GObjectClass parent; /* A laisser en premier */ - find_yaml_node_fc find; /* Recherche par chemin */ + find_first_yaml_node_fc find; /* Recherche par chemin */ }; -/* Recherche les noeuds correspondant à un chemin. */ -void _g_yaml_node_find_by_path(const GYamlNode *, const char *, bool, GYamlNode ***, size_t *); - - #endif /* PLUGINS_YAML_NODE_INT_H */ diff --git a/plugins/yaml/node.c b/plugins/yaml/node.c index 7b3413d..97f845e 100644 --- a/plugins/yaml/node.c +++ b/plugins/yaml/node.c @@ -1,8 +1,8 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * node.c - définition de noeud Yaml + * node.c - définition de noeud YAML * - * Copyright (C) 2019-2020 Cyrille Bagard + * Copyright (C) 2019-2023 Cyrille Bagard * * This file is part of Chrysalide. * @@ -24,17 +24,14 @@ #include "node.h" -#include - - #include "node-int.h" -/* Initialise la classe des noeuds d'arborescence Yaml. */ +/* Initialise la classe des noeuds d'arborescence YAML. */ static void g_yaml_node_class_init(GYamlNodeClass *); -/* Initialise une instance de noeud d'arborescence Yaml. */ +/* Initialise une instance de noeud d'arborescence YAML. */ static void g_yaml_node_init(GYamlNode *); /* Supprime toutes les références externes. */ @@ -45,7 +42,7 @@ static void g_yaml_node_finalize(GYamlNode *); -/* Indique le type défini pour un noeud d'arborescence Yaml. */ +/* Indique le type défini pour un noeud d'arborescence YAML. */ G_DEFINE_TYPE(GYamlNode, g_yaml_node, G_TYPE_OBJECT); @@ -53,7 +50,7 @@ G_DEFINE_TYPE(GYamlNode, g_yaml_node, G_TYPE_OBJECT); * * * Paramètres : klass = classe à initialiser. * * * -* Description : Initialise la classe des noeuds d'arborescence Yaml. * +* Description : Initialise la classe des noeuds d'arborescence YAML. * * * * Retour : - * * * @@ -77,7 +74,7 @@ static void g_yaml_node_class_init(GYamlNodeClass *klass) * * * Paramètres : node = instance à initialiser. * * * -* Description : Initialise une instance de noeud d'arborescence Yaml. * +* Description : Initialise une instance de noeud d'arborescence YAML. * * * * Retour : - * * * @@ -87,7 +84,7 @@ static void g_yaml_node_class_init(GYamlNodeClass *klass) static void g_yaml_node_init(GYamlNode *node) { - node->line = NULL; + //node->line = NULL; } @@ -106,7 +103,7 @@ static void g_yaml_node_init(GYamlNode *node) static void g_yaml_node_dispose(GYamlNode *node) { - g_clear_object(&node->line); + //g_clear_object(&node->line); G_OBJECT_CLASS(g_yaml_node_parent_class)->dispose(G_OBJECT(node)); @@ -134,119 +131,37 @@ static void g_yaml_node_finalize(GYamlNode *node) /****************************************************************************** * * -* Paramètres : node = noeud d'arborescence Yaml à consulter. * -* * -* Description : Fournit la ligne d'origine associée à un noeud. * -* * -* Retour : Ligne Yaml à l'origine du noeud. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlLine *g_yaml_node_get_yaml_line(const GYamlNode *node) -{ - GYamlLine *result; /* Ligne d'origine à renvoyer */ - - result = node->line; - - if (result != NULL) - g_object_ref(G_OBJECT(result)); - - return result; - -} - - -/****************************************************************************** -* * -* 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 : node = 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 : - * * * ******************************************************************************/ -void _g_yaml_node_find_by_path(const GYamlNode *node, const char *path, bool prepare, GYamlNode ***nodes, size_t *count) +GYamlNode *g_yaml_node_find_first_by_path(GYamlNode *node, const char *path) { + GYamlNode *result; /* Trouvaille à retourner */ GYamlNodeClass *class; /* Classe de l'instance */ - class = G_YAML_NODE_GET_CLASS(node); - - class->find(node, path, prepare, nodes, count); - -} - - -/****************************************************************************** -* * -* 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] * -* * -* Description : Recherche les noeuds correspondant à un chemin. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_yaml_node_find_by_path(const GYamlNode *node, const char *path, bool prepare, GYamlNode ***nodes, size_t *count) -{ - *nodes = NULL; - *count = 0; - - _g_yaml_node_find_by_path(node, path, prepare, nodes, count); - -} - + while (path[0] == '/') + path++; -/****************************************************************************** -* * -* Paramètres : node = noeud d'arborescence Yaml à consulter. * -* path = chemin d'accès à parcourir. * -* prepare = indication sur une préparation d'un prochain appel.* -* * -* Description : Recherche l'unique noeud correspondant à un chemin. * -* * -* Retour : Noeud avec correspondance établie ou NULL. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlNode *g_yaml_node_find_one_by_path(const GYamlNode *node, const char *path, bool prepare) -{ - GYamlNode *result; /* Trouvaille unique à renvoyer*/ - GYamlNode **nodes; /* Liste de noeuds trouvés */ - size_t count; /* Taille de cette liste */ - size_t i; /* Boucle de parcours */ - - g_yaml_node_find_by_path(node, path, prepare, &nodes, &count); - - if (count == 1) + if (path[0] == '\0') { - result = nodes[0]; + result = node; g_object_ref(G_OBJECT(result)); } else - result = NULL; + { + class = G_YAML_NODE_GET_CLASS(node); - for (i = 0; i < count; i++) - g_object_unref(G_OBJECT(nodes[i])); + result = class->find(node, path); - if (nodes != NULL) - free(nodes); + } return result; diff --git a/plugins/yaml/node.h b/plugins/yaml/node.h index 8197ef5..36c8e7b 100644 --- a/plugins/yaml/node.h +++ b/plugins/yaml/node.h @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * node.h - prototypes pour une définition de noeud Yaml * - * Copyright (C) 2019-2020 Cyrille Bagard + * Copyright (C) 2019-2023 Cyrille Bagard * * This file is part of Chrysalide. * @@ -26,15 +26,8 @@ #include -#include -#include "line.h" - - -/* Depuis collection.h : collection de noeuds au format Yaml (instance) */ -typedef struct _GYamlCollection GYamlCollection; - #define G_TYPE_YAML_NODE g_yaml_node_get_type() #define G_YAML_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_YAML_NODE, GYamlNode)) @@ -44,24 +37,18 @@ typedef struct _GYamlCollection GYamlCollection; #define G_YAML_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_YAML_NODE, GYamlNodeClass)) -/* Noeud d'une arborescence au format Yaml (instance) */ +/* Noeud d'une arborescence au format YAML (instance) */ typedef struct _GYamlNode GYamlNode; -/* Noeud d'une arborescence au format Yaml (classe) */ +/* Noeud d'une arborescence au format YAML (classe) */ typedef struct _GYamlNodeClass GYamlNodeClass; /* Indique le type défini pour un noeud d'arborescence Yaml. */ GType g_yaml_node_get_type(void); -/* Fournit la ligne d'origine associée à un noeud. */ -GYamlLine *g_yaml_node_get_yaml_line(const GYamlNode *); - -/* Recherche les noeuds correspondant à un chemin. */ -void g_yaml_node_find_by_path(const GYamlNode *, const char *, bool, GYamlNode ***, size_t *); - -/* Recherche l'unique noeud correspondant à un chemin. */ -GYamlNode *g_yaml_node_find_one_by_path(const GYamlNode *, const char *, bool); +/* Recherche le premier noeud correspondant à un chemin. */ +GYamlNode *g_yaml_node_find_first_by_path(GYamlNode *, const char *); diff --git a/plugins/yaml/pair-int.h b/plugins/yaml/pair-int.h new file mode 100644 index 0000000..735a357 --- /dev/null +++ b/plugins/yaml/pair-int.h @@ -0,0 +1,63 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * pair-int.h - prototypes internes pour la définition d'un noeud YAML + * + * Copyright (C) 2020-2023 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Chrysalide. If not, see . + */ + + +#ifndef PLUGINS_YAML_PAIR_INT_H +#define PLUGINS_YAML_PAIR_INT_H + + +#include "pair.h" + + +#include + + +#include "node-int.h" + + + +/* Noeud d'une arborescence au format YAML (instance) */ +struct _GYamlPair +{ + GYamlNode parent; /* A laisser en premier */ + + char *key; /* Clef présente dans le noeud */ + char *value; /* Valeur associée */ + + GYamlCollection *children; /* Collection de noeuds */ + +}; + +/* Noeud d'une arborescence au format YAML (classe) */ +struct _GYamlPairClass +{ + GYamlNodeClass parent; /* A laisser en premier */ + +}; + + +/* Met en place une pair clef/valeur YAML. */ +bool g_yaml_pair_create(GYamlPair *, const char *, const char *); + + + +#endif /* PLUGINS_YAML_PAIR_INT_H */ diff --git a/plugins/yaml/pair.c b/plugins/yaml/pair.c index df29f6f..1057a68 100644 --- a/plugins/yaml/pair.c +++ b/plugins/yaml/pair.c @@ -1,8 +1,8 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * pair.c - noeud Yaml de paire clef/valeur + * pair.c - noeud YAML de paire clef/valeur * - * Copyright (C) 2020 Cyrille Bagard + * Copyright (C) 2020-2023 Cyrille Bagard * * This file is part of Chrysalide. * @@ -24,38 +24,22 @@ #include "pair.h" +#include #include #include -#include "node-int.h" +#include "pair-int.h" -/* Noeud d'une arborescence au format Yaml (instance) */ -struct _GYamlPair -{ - GYamlNode parent; /* A laisser en premier */ - - char *key; /* Clef présente dans le noeud */ - char *value; /* Valeur associée */ - - GYamlCollection *collection; /* Collection de noeuds */ - -}; - -/* Noeud d'une arborescence au format Yaml (classe) */ -struct _GYamlPairClass -{ - GYamlNodeClass parent; /* A laisser en premier */ - -}; +/* -------------------- DEFINITIONS PROPRES POUR LE SUPPORT YAML -------------------- */ -/* Initialise la classe des noeuds d'arborescence Yaml. */ +/* Initialise la classe des noeuds d'arborescence YAML. */ static void g_yaml_pair_class_init(GYamlPairClass *); -/* Initialise une instance de noeud d'arborescence Yaml. */ +/* Initialise une instance de noeud d'arborescence YAML. */ static void g_yaml_pair_init(GYamlPair *); /* Supprime toutes les références externes. */ @@ -64,12 +48,22 @@ static void g_yaml_pair_dispose(GYamlPair *); /* Procède à la libération totale de la mémoire. */ static void g_yaml_pair_finalize(GYamlPair *); -/* Recherche les noeuds correspondant à un chemin. */ -static void g_yaml_pair_find_by_path(const GYamlPair *, const char *, bool, GYamlNode ***, size_t *); +/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ -/* Indique le type défini pour un noeud d'arborescence Yaml. */ + +/* Recherche le premier noeud correspondant à un chemin. */ +static GYamlNode *g_yaml_pair_find_first_by_path(GYamlPair *, const char *); + + + +/* ---------------------------------------------------------------------------------- */ +/* DEFINITIONS PROPRES POUR LE SUPPORT YAML */ +/* ---------------------------------------------------------------------------------- */ + + +/* Indique le type défini pour un noeud d'arborescence YAML. */ G_DEFINE_TYPE(GYamlPair, g_yaml_pair, G_TYPE_YAML_NODE); @@ -77,7 +71,7 @@ G_DEFINE_TYPE(GYamlPair, g_yaml_pair, G_TYPE_YAML_NODE); * * * Paramètres : klass = classe à initialiser. * * * -* Description : Initialise la classe des noeuds d'arborescence Yaml. * +* Description : Initialise la classe des noeuds d'arborescence YAML. * * * * Retour : - * * * @@ -97,16 +91,16 @@ static void g_yaml_pair_class_init(GYamlPairClass *klass) node = G_YAML_NODE_CLASS(klass); - node->find = (find_yaml_node_fc)g_yaml_pair_find_by_path; + node->find = (find_first_yaml_node_fc)g_yaml_pair_find_first_by_path; } /****************************************************************************** * * -* Paramètres : node = instance à initialiser. * +* Paramètres : pair = instance à initialiser. * * * -* Description : Initialise une instance de noeud d'arborescence Yaml. * +* Description : Initialise une instance de noeud d'arborescence YAML. * * * * Retour : - * * * @@ -114,19 +108,19 @@ static void g_yaml_pair_class_init(GYamlPairClass *klass) * * ******************************************************************************/ -static void g_yaml_pair_init(GYamlPair *node) +static void g_yaml_pair_init(GYamlPair *pair) { - node->key = NULL; - node->value = NULL; + pair->key = NULL; + pair->value = NULL; - node->collection = NULL; + pair->children = NULL; } /****************************************************************************** * * -* Paramètres : node = instance d'objet GLib à traiter. * +* Paramètres : pair = instance d'objet GLib à traiter. * * * * Description : Supprime toutes les références externes. * * * @@ -136,18 +130,18 @@ static void g_yaml_pair_init(GYamlPair *node) * * ******************************************************************************/ -static void g_yaml_pair_dispose(GYamlPair *node) +static void g_yaml_pair_dispose(GYamlPair *pair) { - g_clear_object(&node->collection); + g_clear_object(&pair->children); - G_OBJECT_CLASS(g_yaml_pair_parent_class)->dispose(G_OBJECT(node)); + G_OBJECT_CLASS(g_yaml_pair_parent_class)->dispose(G_OBJECT(pair)); } /****************************************************************************** * * -* Paramètres : node = instance d'objet GLib à traiter. * +* Paramètres : pair = instance d'objet GLib à traiter. * * * * Description : Procède à la libération totale de la mémoire. * * * @@ -157,24 +151,25 @@ static void g_yaml_pair_dispose(GYamlPair *node) * * ******************************************************************************/ -static void g_yaml_pair_finalize(GYamlPair *node) +static void g_yaml_pair_finalize(GYamlPair *pair) { - if (node->key != NULL) - free(node->key); + if (pair->key != NULL) + free(pair->key); - if (node->value != NULL) - free(node->value); + if (pair->value != NULL) + free(pair->value); - G_OBJECT_CLASS(g_yaml_pair_parent_class)->finalize(G_OBJECT(node)); + G_OBJECT_CLASS(g_yaml_pair_parent_class)->finalize(G_OBJECT(pair)); } /****************************************************************************** * * -* Paramètres : line = ligne Yaml à l'origine du futur noeud. * +* Paramètres : key = désignation pour le noeud YAML. * +* value = éventuelle valeur directe portée par le noeud. * * * -* Description : Construit un noeud d'arborescence Yaml. * +* Description : Construit un noeud d'arborescence YAML. * * * * Retour : Instance mise en place ou NULL en cas d'échec. * * * @@ -182,36 +177,14 @@ static void g_yaml_pair_finalize(GYamlPair *node) * * ******************************************************************************/ -GYamlPair *g_yaml_pair_new(GYamlLine *line) +GYamlPair *g_yaml_pair_new(const char *key, const char *value) { GYamlPair *result; /* Structure à retourner */ - const char *key; /* Clef associée au noeud */ - const char *value; /* Eventuelle valeur associée */ - key = g_yaml_line_get_key(line); - value = g_yaml_line_get_value(line); + result = g_object_new(G_TYPE_YAML_PAIR, NULL); - if (key == NULL) - key = g_yaml_line_get_payload(line); - - if (key == NULL) - result = NULL; - - else - { - result = g_object_new(G_TYPE_YAML_PAIR, NULL); - - G_YAML_NODE(result)->line = line; - g_object_ref(G_OBJECT(line)); - - result->key = strdup(key); - - if (value == NULL) - result->value = NULL; - else - result->value = strdup(value); - - } + if (!g_yaml_pair_create(result, key, value)) + g_clear_object(&result); return result; @@ -220,93 +193,39 @@ GYamlPair *g_yaml_pair_new(GYamlLine *line) /****************************************************************************** * * -* 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 : pair = paire YAML à initialiser pleinement. * +* key = désignation pour le noeud YAML. * +* value = éventuelle valeur directe portée par le noeud. * * * -* Description : Recherche les noeuds correspondant à un chemin. * +* Description : Met en place une pair clef/valeur YAML. * * * -* Retour : - * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -static void g_yaml_pair_find_by_path(const GYamlPair *node, const char *path, bool prepare, GYamlNode ***nodes, size_t *count) +bool g_yaml_pair_create(GYamlPair *pair, const char *key, const char *value) { - char *next; /* Prochaine partie du chemin */ - size_t cmplen; /* Etendue de la comparaison */ - int ret; /* Bilan d'une comparaison */ - - if (path[0] == '\0') - goto exit; - - /* Correspondance au niveau du noeud ? */ - - if (path[0] == '/') - { - path++; - - if (path[0] == '\0') - goto matched; - - } - - next = strchr(path, '/'); - - if (next == NULL) - ret = strcmp(path, node->key); - - else - { - cmplen = next - path; - - if (cmplen == 0) - goto cont; - - ret = strncmp(path, node->key, cmplen); - - } - - if (ret != 0) - goto done; - - else if (next != NULL) - { - path += cmplen; - goto cont; - } - - matched: + bool result; /* Bilan à retourner */ - *nodes = realloc(*nodes, ++(*count) * sizeof(GYamlNode **)); + result = true; - g_object_ref(G_OBJECT(node)); - (*nodes)[*count - 1] = G_YAML_NODE(node); + pair->key = strdup(key); - goto done; + if (value != NULL) + pair->value = strdup(value); - cont: - - if (node->collection != NULL) - _g_yaml_node_find_by_path(G_YAML_NODE(node->collection), path, prepare, nodes, count); - - done: - - exit: - - ; + return result; } /****************************************************************************** * * -* Paramètres : node = noeud d'arborescence Yaml à consulter. * +* Paramètres : pair = noeud d'arborescence YAML à consulter. * * * -* Description : Fournit la clef représentée dans une paire en Yaml. * +* Description : Fournit la clef représentée dans une paire en YAML. * * * * Retour : Clef sous forme de chaîne de caractères. * * * @@ -314,11 +233,11 @@ static void g_yaml_pair_find_by_path(const GYamlPair *node, const char *path, bo * * ******************************************************************************/ -const char *g_yaml_pair_get_key(const GYamlPair *node) +const char *g_yaml_pair_get_key(const GYamlPair *pair) { char *result; /* Valeur à retourner */ - result = node->key; + result = pair->key; return result; @@ -327,9 +246,9 @@ const char *g_yaml_pair_get_key(const GYamlPair *node) /****************************************************************************** * * -* Paramètres : node = noeud d'arborescence Yaml à consulter. * +* Paramètres : pair = noeud d'arborescence YAML à consulter. * * * -* Description : Fournit l'éventuelle valeur d'une paire en Yaml. * +* Description : Fournit l'éventuelle valeur d'une paire en YAML. * * * * Retour : Valeur sous forme de chaîne de caractères ou NULL. * * * @@ -337,11 +256,11 @@ const char *g_yaml_pair_get_key(const GYamlPair *node) * * ******************************************************************************/ -const char *g_yaml_pair_get_value(const GYamlPair *node) +const char *g_yaml_pair_get_value(const GYamlPair *pair) { char *result; /* Valeur à retourner */ - result = node->value; + result = pair->value; return result; @@ -350,10 +269,10 @@ const char *g_yaml_pair_get_value(const GYamlPair *node) /****************************************************************************** * * -* Paramètres : node = noeud d'arborescence Yaml à compléter. * -* collec = collection de noeuds Yaml. * +* Paramètres : pair = noeud d'arborescence YAML à compléter. * +* children = collection de noeuds YAML. * * * -* Description : Attache une collection de noeuds Yaml à un noeud. * +* Description : Attache une collection de noeuds YAML à un noeud. * * * * Retour : - * * * @@ -361,33 +280,33 @@ const char *g_yaml_pair_get_value(const GYamlPair *node) * * ******************************************************************************/ -void g_yaml_pair_set_collection(GYamlPair *node, GYamlCollection *collec) +void g_yaml_pair_set_children(GYamlPair *pair, GYamlCollection *children) { - g_clear_object(&node->collection); + g_clear_object(&pair->children); - g_object_ref_sink(G_OBJECT(collec)); - node->collection = collec; + g_object_ref_sink(G_OBJECT(children)); + pair->children = children; } /****************************************************************************** * * -* Paramètres : node = noeud d'arborescence Yaml à consulter. * +* Paramètres : pair = noeud d'arborescence YAML à consulter. * * * * Description : Fournit une éventuelle collection rattachée à un noeud. * * * -* Retour : Collection de noeuds Yaml ou NULL. * +* Retour : Collection de noeuds YAML ou NULL. * * * * Remarques : - * * * ******************************************************************************/ -GYamlCollection *g_yaml_pair_get_collection(const GYamlPair *node) +GYamlCollection *g_yaml_pair_get_children(const GYamlPair *pair) { GYamlCollection *result; /* Collection à renvoyer */ - result = node->collection; + result = pair->children; if (result != NULL) g_object_ref(G_OBJECT(result)); @@ -395,3 +314,76 @@ GYamlCollection *g_yaml_pair_get_collection(const GYamlPair *node) return result; } + + + +/* ---------------------------------------------------------------------------------- */ +/* IMPLEMENTATION DES FONCTIONS DE CLASSE */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : pair = noeud d'arborescence YAML à consulter. * +* path = chemin d'accès à parcourir. * +* * +* Description : Recherche le premier noeud correspondant à un chemin. * +* * +* Retour : Noeud avec la correspondance établie ou NULL si non trouvé. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GYamlNode *g_yaml_pair_find_first_by_path(GYamlPair *pair, const char *path) +{ + GYamlNode *result; /* Trouvaille à retourner */ + char *next; /* Prochaine partie du chemin */ + size_t cmplen; /* Etendue de la comparaison */ + int ret; /* Bilan d'une comparaison */ + + assert(path[0] != '/' && path[0] != '\0'); + + /* Correspondance au niveau du noeud ? */ + + next = strchr(path, '/'); + + if (next == NULL) + ret = strcmp(path, pair->key); + + else + { + cmplen = next - path; + assert(cmplen > 0); + + ret = strncmp(path, pair->key, cmplen); + + } + + /* Si correspondance il y a... */ + + if (ret == 0) + { + /* ... et que la recherche se trouve en bout de parcours */ + if (next == NULL) + { + result = G_YAML_NODE(pair); + g_object_ref(G_OBJECT(result)); + } + + /* Recherche supplémentaire dans les sous-noeuds ? */ + + else if (pair->children != NULL) + result = g_yaml_node_find_first_by_path(G_YAML_NODE(pair->children), path + cmplen); + + else + result = NULL; + + } + + else + result = NULL; + + return result; + +} diff --git a/plugins/yaml/pair.h b/plugins/yaml/pair.h index 986fef7..cc470ed 100644 --- a/plugins/yaml/pair.h +++ b/plugins/yaml/pair.h @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * pair.h - prototypes pour un noeud Yaml de paire clef/valeur * - * Copyright (C) 2020 Cyrille Bagard + * Copyright (C) 2020-2023 Cyrille Bagard * * This file is part of Chrysalide. * @@ -30,7 +30,6 @@ #include "collection.h" -#include "line.h" #include "node.h" @@ -53,7 +52,7 @@ typedef struct _GYamlPairClass GYamlPairClass; GType g_yaml_pair_get_type(void); /* Construit un noeud d'arborescence Yaml. */ -GYamlPair *g_yaml_pair_new(GYamlLine *); +GYamlPair *g_yaml_pair_new(const char *, const char *); /* Fournit la clef représentée dans une paire en Yaml. */ const char *g_yaml_pair_get_key(const GYamlPair *); @@ -62,10 +61,10 @@ const char *g_yaml_pair_get_key(const GYamlPair *); const char *g_yaml_pair_get_value(const GYamlPair *); /* Attache une collection de noeuds Yaml à un noeud. */ -void g_yaml_pair_set_collection(GYamlPair *, GYamlCollection *); +void g_yaml_pair_set_children(GYamlPair *, GYamlCollection *); /* Fournit une éventuelle collection rattachée à un noeud. */ -GYamlCollection *g_yaml_pair_get_collection(const GYamlPair *); +GYamlCollection *g_yaml_pair_get_children(const GYamlPair *); diff --git a/plugins/yaml/parser.c b/plugins/yaml/parser.c new file mode 100644 index 0000000..92e78be --- /dev/null +++ b/plugins/yaml/parser.c @@ -0,0 +1,283 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * parser.c - lecteur de contenu Yaml + * + * Copyright (C) 2019-2023 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Chrysalide. If not, see . + */ + + +#include "parser.h" + + +#include +#include +#include +#include + + +#include + + +#include "collection.h" +#include "pair.h" + + + +/* Construit la version GLib d'un noeud YAML brut. */ +static GYamlPair *build_pair_from_yaml(yaml_document_t *, int, int); + +/* Transforme un noeud YAML brut en sa version Glib. */ +static GYamlCollection *translate_yaml_node(yaml_document_t *, yaml_node_t *); + + + +/****************************************************************************** +* * +* Paramètres : document = gestionnaire de l'ensemble des noeuds bruts. * +* key = indice de la clef du noeud à convertir. * +* value = indice de la valeur du noeud à convertir. * +* * +* Description : Construit la version GLib d'un noeud YAML brut. * +* * +* Retour : Noeud GLib obtenu ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GYamlPair *build_pair_from_yaml(yaml_document_t *document, int key, int value) +{ + GYamlPair *result; /* Racine à retourner */ + yaml_node_t *key_node; /* Noeud brut de la clef */ + yaml_node_t *value_node; /* Noeud brut de la valeur */ + GYamlCollection *children; /* Collection de noeuds YAML */ + + result = NULL; + + key_node = yaml_document_get_node(document, key); + assert(key_node != NULL); + + if (key_node->type != YAML_SCALAR_NODE) + goto exit; + + value_node = yaml_document_get_node(document, value); + assert(value_node != NULL); + + if (value_node->type == YAML_SCALAR_NODE) + result = g_yaml_pair_new((char *)key_node->data.scalar.value, (char *)value_node->data.scalar.value); + + else + { + children = translate_yaml_node(document, value_node); + + if (children != NULL) + { + result = g_yaml_pair_new((char *)key_node->data.scalar.value, NULL); + + g_yaml_pair_set_children(result, children); + + } + + } + + exit: + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : document = gestionnaire de l'ensemble des noeuds bruts. * +* node = point de départ des transformations. * +* * +* Description : Transforme un noeud YAML brut en sa version Glib. * +* * +* Retour : Noeud GLib obtenu ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GYamlCollection *translate_yaml_node(yaml_document_t *document, yaml_node_t *node) +{ + GYamlCollection *result; /* Racine à retourner */ + yaml_node_item_t *index; /* Elément d'une série */ + yaml_node_t *item; /* Elément d'une série */ + GYamlCollection *collec; /* Version GLib de l'élément */ + yaml_node_pair_t *pair; /* Combinaison clef/valeur */ + GYamlPair *sub; /* Sous-noeud à intégrer */ + + switch (node->type) + { + case YAML_SEQUENCE_NODE: + + result = g_yaml_collection_new(true); + + for (index = node->data.sequence.items.start; index < node->data.sequence.items.top; index++) + { + item = yaml_document_get_node(document, *index); + assert(item != NULL); + + collec = translate_yaml_node(document, item); + + if (collec == NULL) + { + g_clear_object(&result); + break; + } + + g_yaml_collection_add_node(result, G_YAML_NODE(collec)); + + } + + break; + + case YAML_MAPPING_NODE: + + result = g_yaml_collection_new(false); + + for (pair = node->data.mapping.pairs.start; pair < node->data.mapping.pairs.top; pair++) + { + sub = build_pair_from_yaml(document, pair->key, pair->value); + + if (sub == NULL) + { + g_clear_object(&result); + break; + } + + g_yaml_collection_add_node(result, G_YAML_NODE(sub)); + + } + + break; + + default: + assert(false); + result = NULL; + break; + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : text = définitions textuelles d'un contenu brut. * +* len = taille de ces définitions. * +* * +* Description : Crée une arborescence YAML pour contenu au format adapté. * +* * +* Retour : Arborescence YAML mise en place ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GYamlNode *parse_yaml_from_text(const char *text, size_t len) +{ + GYamlNode *result; /* Racine à retourner */ + yaml_parser_t parser; /* Lecteur du contenu fourni */ + yaml_document_t document; /* Document YAML constitué */ + int ret; /* Bilan de la constitution */ + yaml_node_t *root; /* Elément racine brut */ + GYamlCollection *collec; /* Version Glib de la racine */ + + result = NULL; + + yaml_parser_initialize(&parser); + + yaml_parser_set_input_string(&parser, (const unsigned char *)text, len); + + ret = yaml_parser_load(&parser, &document); + if (ret != 1) goto bad_loading; + + root = yaml_document_get_root_node(&document); + + if (root != NULL) + { + collec = translate_yaml_node(&document, root); + + if (collec != NULL) + result = G_YAML_NODE(collec); + + } + + yaml_document_delete(&document); + + bad_loading: + + yaml_parser_delete(&parser); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : filename = chemin vers des définitions de règles. * +* * +* Description : Crée une arborescence YAML pour fichier au format adapté. * +* * +* Retour : Arborescence YAML mise en place ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GYamlNode *parse_yaml_from_file(const char *filename) +{ + GYamlNode *result; /* Racine à retourner */ + GBinContent *content; /* Fichier à parcourir */ + phys_t size; /* Taille du contenu associé */ + vmpa2t start; /* Tête de lecture */ + const bin_t *data; /* Données à consulter */ + char *dumped; /* Contenu manipulable */ + + result = NULL; + + content = g_file_content_new(filename); + if (content == NULL) goto no_content; + + size = g_binary_content_compute_size(content); + + g_binary_content_compute_start_pos(content, &start); + data = g_binary_content_get_raw_access(content, &start, size); + + dumped = malloc((size + 1) * sizeof(char)); + + memcpy(dumped, data, size); + dumped[size] = '\0'; + + result = parse_yaml_from_text(dumped, size); + + free(dumped); + + g_object_unref(G_OBJECT(content)); + + no_content: + + return result; + +} diff --git a/plugins/yaml/parser.h b/plugins/yaml/parser.h new file mode 100644 index 0000000..761e12b --- /dev/null +++ b/plugins/yaml/parser.h @@ -0,0 +1,43 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * parser.h - prototypes pour le lecteur de contenu Yaml + * + * Copyright (C) 2019-2023 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Chrysalide. If not, see . + */ + + +#ifndef PLUGINS_YAML_PARSER_H +#define PLUGINS_YAML_PARSER_H + + +#include + + +#include "node.h" + + + +/* Crée une arborescence YAML pour contenu au format adapté. */ +GYamlNode *parse_yaml_from_text(const char *, size_t); + +/* Crée une arborescence YAML pour fichier au format adapté. */ +GYamlNode *parse_yaml_from_file(const char *); + + + +#endif /* PLUGINS_YAML_PARSER_H */ diff --git a/plugins/yaml/python/Makefile.am b/plugins/yaml/python/Makefile.am index 7faffb2..89b319c 100644 --- a/plugins/yaml/python/Makefile.am +++ b/plugins/yaml/python/Makefile.am @@ -3,13 +3,10 @@ noinst_LTLIBRARIES = libyamlpython.la libyamlpython_la_SOURCES = \ collection.h collection.c \ - line.h line.c \ module.h module.c \ node.h node.c \ pair.h pair.c \ - reader.h reader.c \ - scalar.h scalar.c \ - tree.h tree.c + parser.h parser.c libyamlpython_la_CFLAGS = $(TOOLKIT_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS) $(LIBPYGOBJECT_CFLAGS) \ -I$(top_srcdir)/src -DNO_IMPORT_PYGOBJECT diff --git a/plugins/yaml/python/collection.c b/plugins/yaml/python/collection.c index e21bb9e..f8e29b3 100644 --- a/plugins/yaml/python/collection.c +++ b/plugins/yaml/python/collection.c @@ -39,7 +39,7 @@ /* Crée un nouvel objet Python de type 'YamlCollection'. */ static PyObject *py_yaml_collection_new(PyTypeObject *, PyObject *, PyObject *); -/* Indique la nature d'une collection Yaml. */ +/* Indique la nature d'une collection YAML. */ static PyObject *py_yaml_collection_is_sequence(PyObject *, void *); /* Fournit la liste des noeuds intégrés dans une collection. */ @@ -69,13 +69,14 @@ static PyObject *py_yaml_collection_new(PyTypeObject *type, PyObject *args, PyOb GYamlCollection *collec; /* Création GLib à transmettre */ #define YAML_COLLECTION_DOC \ - "YamlCollection handles a collection of Yaml nodes.\n" \ + "YamlCollection handles a collection of YAML nodes.\n" \ "\n" \ "Instances can be created using the following constructor:\n" \ "\n" \ " YamlCollection(seq=False)\n" \ "\n" \ - "Where seq defines if the collection will be a sequence or a mapping of nodes." + "Where *seq* is a boolean value which defines if the collection will be a" \ + " sequence or a mapping of nodes." ret = PyArg_ParseTuple(args, "p", &seq); if (!ret) return NULL; @@ -98,7 +99,7 @@ static PyObject *py_yaml_collection_new(PyTypeObject *type, PyObject *args, PyOb * * * 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 : - * * * @@ -152,7 +153,7 @@ static PyObject *py_yaml_collection_get_nodes(PyObject *self, void *closure) * Paramètres : self = objet Python concerné par l'appel. * * closure = non utilisé ici. * * * -* Description : Indique la nature d'une collection Yaml. * +* Description : Indique la nature d'une collection YAML. * * * * Retour : Nature de la collection. * * * @@ -169,7 +170,7 @@ static PyObject *py_yaml_collection_is_sequence(PyObject *self, void *closure) #define YAML_COLLECTION_IS_SEQUENCE_ATTRIB PYTHON_IS_DEF_FULL \ ( \ sequence, py_yaml_collection, \ - "Nature of the collection: True is the collection is a sequence," \ + "Nature of the collection: True if the collection is a sequence," \ " False if it is a mapping of \"key: value\" nodes." \ ) @@ -265,7 +266,7 @@ bool register_python_yaml_collection(PyObject *module) * Paramètres : arg = argument quelconque à tenter de convertir. * * dst = destination des valeurs récupérées en cas de succès. * * * -* Description : Tente de convertir en collection de noeuds de format Yaml. * +* Description : Tente de convertir en collection de noeuds de format YAML. * * * * Retour : Bilan de l'opération, voire indications supplémentaires. * * * @@ -287,7 +288,7 @@ int convert_to_yaml_collection(PyObject *arg, void *dst) break; case 0: - PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to Yaml collection"); + PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to YAML collection"); break; case 1: diff --git a/plugins/yaml/python/collection.h b/plugins/yaml/python/collection.h index ab2caba..f06984f 100644 --- a/plugins/yaml/python/collection.h +++ b/plugins/yaml/python/collection.h @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * collection.h - prototypes pour l'équivalent Python du fichier "plugins/yaml/collection.h" * - * Copyright (C) 2019 Cyrille Bagard + * Copyright (C) 2019-2023 Cyrille Bagard * * This file is part of Chrysalide. * @@ -37,7 +37,7 @@ PyTypeObject *get_python_yaml_collection_type(void); /* Prend en charge l'objet 'pychrysalide.plugins.yaml.YamlCollection'. */ bool register_python_yaml_collection(PyObject *); -/* Tente de convertir en collection de noeuds de format Yaml. */ +/* Tente de convertir en collection de noeuds de format YAML. */ int convert_to_yaml_collection(PyObject *, void *); diff --git a/plugins/yaml/python/line.c b/plugins/yaml/python/line.c deleted file mode 100644 index f098273..0000000 --- a/plugins/yaml/python/line.c +++ /dev/null @@ -1,431 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * line.c - équivalent Python du fichier "plugins/yaml/line.c" - * - * Copyright (C) 2019 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "line.h" - - -#include -#include - - -#include - - -#include "../line.h" - - - -/* Crée un nouvel objet Python de type 'YamlLine'. */ -static PyObject *py_yaml_line_new(PyTypeObject *, PyObject *, PyObject *); - -/* Fournit la taille de l'indentation d'une ligne Yaml. */ -static PyObject *py_yaml_line_get_indent(PyObject *, void *); - -/* Indique si la ligne représente un élément de liste. */ -static PyObject *py_yaml_line_is_list_item(PyObject *, void *); - -/* Fournit la charge utile associée à une ligne Yaml. */ -static PyObject *py_yaml_line_get_payload(PyObject *, void *); - -/* Fournit la clef associée à une ligne Yaml si elle existe. */ -static PyObject *py_yaml_line_get_key(PyObject *, void *); - -/* Fournit la valeur associée à une ligne Yaml si elle existe. */ -static PyObject *py_yaml_line_get_value(PyObject *, void *); - - - -/****************************************************************************** -* * -* Paramètres : type = type de l'objet à instancier. * -* args = arguments fournis à l'appel. * -* kwds = arguments de type key=val fournis. * -* * -* Description : Crée un nouvel objet Python de type 'YamlLine'. * -* * -* Retour : Instance Python mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_line_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject *result; /* Instance à retourner */ - const char *raw; /* Données Yaml brutes */ - Py_ssize_t index; /* Indice de ligne associée */ - int ret; /* Bilan de lecture des args. */ - GYamlLine *line; /* Création GLib à transmettre */ - -#define YAML_LINE_DOC \ - "YamlLine handles a line of Yaml data.\n" \ - "\n" \ - "The data may be a couple of key/value, a comment, aso.\n" \ - "\n" \ - "Instances can be created using the following constructor:\n" \ - "\n" \ - " YamlTree(raw, number)" \ - "\n" \ - "Where raw is a string providing raw data and number the index" \ - " of the line in the overall stream." - - ret = PyArg_ParseTuple(args, "sn", &raw, &index); - if (!ret) return NULL; - - line = g_yaml_line_new(raw, strlen(raw), index); - - if (line == NULL) - { - result = Py_None; - Py_INCREF(result); - } - - else - { - g_object_ref_sink(G_OBJECT(line)); - result = pygobject_new(G_OBJECT(line)); - g_object_unref(line); - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * -* * -* Description : Fournit la taille de l'indentation d'une ligne Yaml. * -* * -* Retour : Taille de l'indentation rencontrée. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_line_get_indent(PyObject *self, void *closure) -{ - PyObject *result; /* Résultat à retourner */ - GYamlLine *line; /* Version GLib du type */ - size_t indent; /* Taille de l'indentation */ - -#define YAML_LINE_INDENT_ATTRIB PYTHON_GET_DEF_FULL \ -( \ - indent, py_yaml_line, \ - "Quantity of characters used for the indentation." \ -) - - line = G_YAML_LINE(pygobject_get(self)); - - indent = g_yaml_line_count_indent(line); - - result = PyLong_FromSize_t(indent); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * -* * -* Description : Indique si la ligne représente un élément de liste. * -* * -* Retour : Statut de l'état lié à une liste d'éléments. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_line_is_list_item(PyObject *self, void *closure) -{ - PyObject *result; /* Résultat à retourner */ - GYamlLine *line; /* Version GLib du type */ - bool status; /* Statut de la ligne */ - -#define YAML_LINE_IS_LIST_ITEM_ATTRIB PYTHON_IS_DEF_FULL \ -( \ - list_item, py_yaml_line, \ - "Tell if the line starts a new list item." \ -) - - line = G_YAML_LINE(pygobject_get(self)); - - status = g_yaml_line_is_list_item(line); - - result = status ? Py_True : Py_False; - Py_INCREF(result); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * -* * -* Description : Fournit la charge utile associée à une ligne Yaml. * -* * -* Retour : Contenu sous forme de chaîne de caractères. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_line_get_payload(PyObject *self, void *closure) -{ - PyObject *result; /* Résultat à retourner */ - GYamlLine *line; /* Version GLib du type */ - const char *payload; /* Chaîne à transmettre */ - -#define YAML_LINE_PAYLOAD_ATTRIB PYTHON_GET_DEF_FULL \ -( \ - payload, py_yaml_line, \ - "Payload of the Yaml line." \ -) - - line = G_YAML_LINE(pygobject_get(self)); - - payload = g_yaml_line_get_payload(line); - - result = PyUnicode_FromString(payload); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * -* * -* Description : Fournit la clef associée à une ligne Yaml si elle existe. * -* * -* Retour : Clef sous forme de chaîne de caractères ou None. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_line_get_key(PyObject *self, void *closure) -{ - PyObject *result; /* Résultat à retourner */ - GYamlLine *line; /* Version GLib du type */ - const char *key; /* Chaîne à transmettre */ - -#define YAML_LINE_KEY_ATTRIB PYTHON_GET_DEF_FULL \ -( \ - key, py_yaml_line, \ - "Key linked to the Yaml line or None." \ -) - - line = G_YAML_LINE(pygobject_get(self)); - - key = g_yaml_line_get_key(line); - - if (key == NULL) - { - result = Py_None; - Py_INCREF(result); - } - - else - result = PyUnicode_FromString(key); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * -* * -* Description : Fournit la valeur associée à une ligne Yaml si elle existe. * -* * -* Retour : Valeur sous forme de chaîne de caractères ou None. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_line_get_value(PyObject *self, void *closure) -{ - PyObject *result; /* Résultat à retourner */ - GYamlLine *line; /* Version GLib du type */ - const char *value; /* Chaîne à transmettre */ - -#define YAML_LINE_VALUE_ATTRIB PYTHON_GET_DEF_FULL \ -( \ - value, py_yaml_line, \ - "Value linked to the Yaml line or None." \ -) - - line = G_YAML_LINE(pygobject_get(self)); - - value = g_yaml_line_get_value(line); - - if (value == NULL) - { - result = Py_None; - Py_INCREF(result); - } - - else - result = PyUnicode_FromString(value); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Fournit un accès à une définition de type à diffuser. * -* * -* Retour : Définition d'objet pour Python. * -* * -* Remarques : - * -* * -******************************************************************************/ - -PyTypeObject *get_python_yaml_line_type(void) -{ - static PyMethodDef py_yaml_line_methods[] = { - { NULL } - }; - - static PyGetSetDef py_yaml_line_getseters[] = { - YAML_LINE_INDENT_ATTRIB, - YAML_LINE_IS_LIST_ITEM_ATTRIB, - YAML_LINE_PAYLOAD_ATTRIB, - YAML_LINE_KEY_ATTRIB, - YAML_LINE_VALUE_ATTRIB, - { NULL } - }; - - static PyTypeObject py_yaml_line_type = { - - PyVarObject_HEAD_INIT(NULL, 0) - - .tp_name = "pychrysalide.plugins.yaml.YamlLine", - .tp_basicsize = sizeof(PyGObject), - - .tp_flags = Py_TPFLAGS_DEFAULT, - - .tp_doc = YAML_LINE_DOC, - - .tp_methods = py_yaml_line_methods, - .tp_getset = py_yaml_line_getseters, - .tp_new = py_yaml_line_new - - }; - - return &py_yaml_line_type; - -} - - -/****************************************************************************** -* * -* Paramètres : module = module dont la définition est à compléter. * -* * -* Description : Prend en charge l'objet 'pychrysalide.plugins.....YamlLine. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool register_python_yaml_line(PyObject *module) -{ - PyTypeObject *type; /* Type Python 'YamlLine' */ - PyObject *dict; /* Dictionnaire du module */ - - type = get_python_yaml_line_type(); - - dict = PyModule_GetDict(module); - - if (!register_class_for_pygobject(dict, G_TYPE_YAML_LINE, type, &PyGObject_Type)) - return false; - - return true; - -} - - -/****************************************************************************** -* * -* Paramètres : arg = argument quelconque à tenter de convertir. * -* dst = destination des valeurs récupérées en cas de succès. * -* * -* Description : Tente de convertir en ligne de données au format Yaml. * -* * -* Retour : Bilan de l'opération, voire indications supplémentaires. * -* * -* Remarques : - * -* * -******************************************************************************/ - -int convert_to_yaml_line(PyObject *arg, void *dst) -{ - int result; /* Bilan à retourner */ - - result = PyObject_IsInstance(arg, (PyObject *)get_python_yaml_line_type()); - - switch (result) - { - case -1: - /* L'exception est déjà fixée par Python */ - result = 0; - break; - - case 0: - PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to Yaml line"); - break; - - case 1: - *((GYamlLine **)dst) = G_YAML_LINE(pygobject_get(arg)); - break; - - default: - assert(false); - break; - - } - - return result; - -} diff --git a/plugins/yaml/python/line.h b/plugins/yaml/python/line.h deleted file mode 100644 index 00dcbd9..0000000 --- a/plugins/yaml/python/line.h +++ /dev/null @@ -1,45 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * line.h - prototypes pour l'équivalent Python du fichier "plugins/yaml/line.h" - * - * Copyright (C) 2019 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#ifndef _PLUGINS_YAML_PYTHON_LINE_H -#define _PLUGINS_YAML_PYTHON_LINE_H - - -#include -#include - - - -/* Fournit un accès à une définition de type à diffuser. */ -PyTypeObject *get_python_yaml_line_type(void); - -/* Prend en charge l'objet 'pychrysalide.plugins.yaml.YamlLine'. */ -bool register_python_yaml_line(PyObject *); - -/* Tente de convertir en ligne de données au format Yaml. */ -int convert_to_yaml_line(PyObject *, void *); - - - -#endif /* _PLUGINS_YAML_PYTHON_LINE_H */ diff --git a/plugins/yaml/python/module.c b/plugins/yaml/python/module.c index 90823e8..756b068 100644 --- a/plugins/yaml/python/module.c +++ b/plugins/yaml/python/module.c @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * module.c - intégration du répertoire yaml en tant que module * - * Copyright (C) 2019-2020 Cyrille Bagard + * Copyright (C) 2019-2023 Cyrille Bagard * * This file is part of Chrysalide. * @@ -34,12 +34,9 @@ #include "collection.h" -#include "line.h" #include "node.h" #include "pair.h" -#include "reader.h" -#include "scalar.h" -#include "tree.h" +#include "parser.h" @@ -62,7 +59,12 @@ bool add_yaml_module_to_python_module(void) PyObject *module; /* Sous-module mis en place */ #define PYCHRYSALIDE_PLUGINS_YAML_DOC \ - "yaml is a module providing access to Yaml content." + "yaml is a module providing access to YAML content.\n" \ + "\n" \ + "The parsing is provided by an external library: " \ + " https://github.com/yaml/libyaml . The Python module only" \ + " creates some glue to access YAML content from GObject" \ + " code." static PyModuleDef py_chrysalide_yaml_module = { @@ -107,17 +109,16 @@ bool populate_yaml_module(void) bool result; /* Bilan à retourner */ PyObject *module; /* Module à recompléter */ - result = true; + result = populate_yaml_module_with_parsers(); + if (!result) goto exit; module = get_access_to_python_module("pychrysalide.plugins.yaml"); if (result) result = register_python_yaml_node(module); if (result) result = register_python_yaml_collection(module); - if (result) result = register_python_yaml_line(module); if (result) result = register_python_yaml_pair(module); - if (result) result = register_python_yaml_reader(module); - if (result) result = register_python_yaml_scalar(module); - if (result) result = register_python_yaml_tree(module); + + exit: assert(result); diff --git a/plugins/yaml/python/node.c b/plugins/yaml/python/node.c index 7db6e59..ad030ed 100644 --- a/plugins/yaml/python/node.c +++ b/plugins/yaml/python/node.c @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * node.c - équivalent Python du fichier "plugins/yaml/node.c" * - * Copyright (C) 2019-2020 Cyrille Bagard + * Copyright (C) 2019-2023 Cyrille Bagard * * This file is part of Chrysalide. * @@ -31,29 +31,21 @@ #include -#include "collection.h" -#include "line.h" #include "../node.h" #define YAML_NODE_DOC \ - "YamlNode handles a node in a Yaml tree.\n" \ + "YamlNode handles a node in a YAML tree.\n" \ "\n" \ - "There are three kinds of node contents defined in the Yaml specifications:\n" \ - "* scalar, implemented by the pychrysalide.plugins.yaml.YamlScalar object.\n" \ + "There are two kinds of node contents defined in the YAML specifications:\n" \ + "* pair, implemented by the pychrysalide.plugins.yaml.YamlPair object;\n" \ "* sequence and mapping, implemented by the pychrysalide.plugins.yaml.YamlCollection object." -/* Recherche les noeuds correspondant à un chemin. */ -static PyObject *py_yaml_node_find_by_path(PyObject *, PyObject *); - -/* Recherche l'unique noeud correspondant à un chemin. */ -static PyObject *py_yaml_node_find_one_by_path(PyObject *, PyObject *); - -/* Fournit la ligne d'origine associée à un noeud. */ -static PyObject *py_yaml_node_get_yaml_line(PyObject *, void *); +/* Recherche le premier noeud correspondant à un chemin. */ +static PyObject *py_yaml_node_find_first_by_path(PyObject *, PyObject *); @@ -62,173 +54,55 @@ static PyObject *py_yaml_node_get_yaml_line(PyObject *, void *); * Paramètres : self = variable non utilisée ici. * * args = arguments fournis à l'appel. * * * -* Description : Recherche les noeuds correspondant à un chemin. * +* Description : Recherche le premier noeud correspondant à un chemin. * * * -* Retour : Liste de noeuds trouvés, éventuellement vide. * +* Retour : Noeud avec la correspondance établie ou None si non trouvé. * * * * Remarques : - * * * ******************************************************************************/ -static PyObject *py_yaml_node_find_by_path(PyObject *self, PyObject *args) +static PyObject *py_yaml_node_find_first_by_path(PyObject *self, PyObject *args) { PyObject *result; /* Instance à retourner */ - int prepare; /* Orientation des résultats */ const char *path; /* Chemin d'accès à traiter */ int ret; /* Bilan de lecture des args. */ GYamlNode *node; /* Version GLib du noeud */ - GYamlNode **found; /* Créations GLib à transmettre*/ - size_t count; /* Quantité de trouvailles */ - size_t i; /* Boucle de parcours */ + GYamlNode *found; /* Créations GLib à transmettre*/ -#define YAML_NODE_FIND_BY_PATH_METHOD PYTHON_METHOD_DEF \ +#define YAML_NODE_FIND_FIRST_BY_PATH_METHOD PYTHON_METHOD_DEF \ ( \ - find_by_path, "path, /, prepare=False", \ + find_first_by_path, "path", \ METH_VARARGS, py_yaml_node, \ - "Find nodes from a Yaml node using a path.\n" \ + "Find the first node related to a path among the node YAML children.\n" \ "\n" \ "Paths are node keys separated by '/', such as '/my/path/to/node'." \ + " In case where the path ends with a trailing '/', the operation" \ + " matches the first next met node.\n" \ "\n" \ - "In case where the path ends with a trailing '/', the operation can" \ - " be used to prepare a further look by returning a node which can be" \ - " searched by a new call to this function instead of returning all its" \ - " contained nodes." \ -) - - prepare = 0; - - ret = PyArg_ParseTuple(args, "s|p", &path, &prepare); - if (!ret) return NULL; - - node = G_YAML_NODE(pygobject_get(self)); - - g_yaml_node_find_by_path(node, path, prepare, &found, &count); - - result = PyTuple_New(count); - - for (i = 0; i < count; i++) - { -#ifndef NDEBUG - ret = PyTuple_SetItem(result, i, pygobject_new(G_OBJECT(found[i]))); - assert(ret == 0); -#else - PyTuple_SetItem(result, i, pygobject_new(G_OBJECT(found[i]))); -#endif - - g_object_unref(G_OBJECT(found[i])); - - } - - if (found != NULL) - free(found); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = variable non utilisée ici. * -* args = arguments fournis à l'appel. * -* * -* Description : Recherche l'unique noeud correspondant à un chemin. * -* * -* Retour : Noeud avec correspondance établie ou None. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_node_find_one_by_path(PyObject *self, PyObject *args) -{ - PyObject *result; /* Instance à retourner */ - int prepare; /* Orientation des résultats */ - const char *path; /* Chemin d'accès à traiter */ - int ret; /* Bilan de lecture des args. */ - GYamlNode *node; /* Version GLib du noeud */ - GYamlNode *found; /* Création GLib à transmettre */ - -#define YAML_NODE_FIND_ONE_BY_PATH_METHOD PYTHON_METHOD_DEF \ -( \ - find_one_by_path, "path, /, prepare=False", \ - METH_VARARGS, py_yaml_node, \ - "Find a given node from a Yaml node using a path.\n" \ - "\n" \ - "Paths are node keys separated by '/', such as '/my/path/to/node'." \ - "\n" \ - "Only one node has to match the path for the function success." \ + "The *path* argument is expected to be a string value.\n" \ "\n" \ - "In case where the path ends with a trailing '/', the operation can" \ - " be used to prepare a further look by returning a node which can be" \ - " searched by a new call to this function instead of returning all its" \ - " contained nodes." \ + "The function returns a pychrysalide.plugins.yaml.YamlNode instance," \ + " or *None* if none found." \ ) - prepare = 0; - - ret = PyArg_ParseTuple(args, "s|p", &path, &prepare); + ret = PyArg_ParseTuple(args, "s", &path); if (!ret) return NULL; node = G_YAML_NODE(pygobject_get(self)); - found = g_yaml_node_find_one_by_path(node, path, prepare); + found = g_yaml_node_find_first_by_path(node, path); - if (found == NULL) - { - result = Py_None; - Py_INCREF(result); - } - else + if (found != NULL) { result = pygobject_new(G_OBJECT(found)); g_object_unref(G_OBJECT(found)); } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * -* * -* Description : Fournit la ligne principale associée à un noeud. * -* * -* Retour : Ligne Yaml à l'origine du noeud. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_node_get_yaml_line(PyObject *self, void *closure) -{ - PyObject *result; /* Résultat à retourner */ - GYamlNode *node; /* Version GLib du noeud */ - GYamlLine *line; /* Line Yaml associée */ - -#define YAML_NODE_YAML_LINE_ATTRIB PYTHON_GET_DEF_FULL \ -( \ - yaml_line, py_yaml_node, \ - "Orginal Yaml line linked to the node." \ -) - - node = G_YAML_NODE(pygobject_get(self)); - - line = g_yaml_node_get_yaml_line(node); - - if (line == NULL) + else { result = Py_None; Py_INCREF(result); } - else - { - result = pygobject_new(G_OBJECT(line)); - g_object_unref(G_OBJECT(line)); - } return result; @@ -250,13 +124,11 @@ static PyObject *py_yaml_node_get_yaml_line(PyObject *self, void *closure) PyTypeObject *get_python_yaml_node_type(void) { static PyMethodDef py_yaml_node_methods[] = { - YAML_NODE_FIND_BY_PATH_METHOD, - YAML_NODE_FIND_ONE_BY_PATH_METHOD, + YAML_NODE_FIND_FIRST_BY_PATH_METHOD, { NULL } }; static PyGetSetDef py_yaml_node_getseters[] = { - YAML_NODE_YAML_LINE_ATTRIB, { NULL } }; @@ -316,7 +188,7 @@ bool register_python_yaml_node(PyObject *module) * Paramètres : arg = argument quelconque à tenter de convertir. * * dst = destination des valeurs récupérées en cas de succès. * * * -* Description : Tente de convertir en noeud d'arborescence de format Yaml. * +* Description : Tente de convertir en noeud d'arborescence de format YAML. * * * * Retour : Bilan de l'opération, voire indications supplémentaires. * * * @@ -338,7 +210,7 @@ int convert_to_yaml_node(PyObject *arg, void *dst) break; case 0: - PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to Yaml node"); + PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to YAML node"); break; case 1: diff --git a/plugins/yaml/python/node.h b/plugins/yaml/python/node.h index dc3686b..4d1a50f 100644 --- a/plugins/yaml/python/node.h +++ b/plugins/yaml/python/node.h @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * node.h - prototypes pour l'équivalent Python du fichier "plugins/yaml/node.h" * - * Copyright (C) 2019 Cyrille Bagard + * Copyright (C) 2019-2023 Cyrille Bagard * * This file is part of Chrysalide. * @@ -37,7 +37,7 @@ PyTypeObject *get_python_yaml_node_type(void); /* Prend en charge l'objet 'pychrysalide.plugins.yaml.YamlNode'. */ bool register_python_yaml_node(PyObject *); -/* Tente de convertir en noeud d'arborescence de format Yaml. */ +/* Tente de convertir en noeud d'arborescence de format YAML. */ int convert_to_yaml_node(PyObject *, void *); diff --git a/plugins/yaml/python/pair.c b/plugins/yaml/python/pair.c index db5597d..adaf04d 100644 --- a/plugins/yaml/python/pair.c +++ b/plugins/yaml/python/pair.c @@ -29,73 +29,90 @@ #include +#include #include #include "collection.h" -#include "line.h" #include "node.h" -#include "../pair.h" +#include "../pair-int.h" -/* Crée un nouvel objet Python de type 'YamlPair'. */ -static PyObject *py_yaml_pair_new(PyTypeObject *, PyObject *, PyObject *); +CREATE_DYN_CONSTRUCTOR(yaml_pair, G_TYPE_YAML_PAIR); -/* Fournit la clef représentée dans une paire en Yaml. */ +/* Initialise une instance sur la base du dérivé de GObject. */ +static int py_yaml_pair_init(PyObject *, PyObject *, PyObject *); + +/* Fournit la clef représentée dans une paire en YAML. */ static PyObject *py_yaml_pair_get_key(PyObject *, void *); -/* Fournit l'éventuelle valeur d'une paire en Yaml. */ +/* Fournit l'éventuelle valeur d'une paire en YAML. */ static PyObject *py_yaml_pair_get_value(PyObject *, void *); -/* Attache une collection de noeuds Yaml à un noeud. */ -static int py_yaml_pair_set_collection(PyObject *, PyObject *, void *); +/* Attache une collection de noeuds YAML à un noeud. */ +static int py_yaml_pair_set_children(PyObject *, PyObject *, void *); /* Fournit une éventuelle collection rattachée à un noeud. */ -static PyObject *py_yaml_pair_get_collection(PyObject *, void *); +static PyObject *py_yaml_pair_get_children(PyObject *, void *); /****************************************************************************** * * -* Paramètres : type = type de l'objet à instancier. * +* Paramètres : self = objet à initialiser (théoriquement). * * args = arguments fournis à l'appel. * * kwds = arguments de type key=val fournis. * * * -* Description : Crée un nouvel objet Python de type 'YamlPair'. * +* Description : Initialise une instance sur la base du dérivé de GObject. * * * -* Retour : Instance Python mise en place. * +* Retour : 0. * * * * Remarques : - * * * ******************************************************************************/ -static PyObject *py_yaml_pair_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +static int py_yaml_pair_init(PyObject *self, PyObject *args, PyObject *kwds) { - PyObject *result; /* Instance à retourner */ - GYamlLine *key; /* Ligne principale du noeud */ + const char *value; /* Eventuelle valeur associée */ + const char *key; /* Clef associée au noeud */ int ret; /* Bilan de lecture des args. */ - GYamlPair *node; /* Création GLib à transmettre */ + GYamlPair *pair; /* Création GLib à transmettre */ #define YAML_PAIR_DOC \ - "YamlPair handles a key/value pair node in a Yaml tree.\n" \ + "YamlPair handles a key/value pair node in a YAML tree.\n" \ "\n" \ "Instances can be created using the following constructor:\n" \ "\n" \ - " YamlPair(line)\n" \ + " YamlPair(key, value=None)\n" \ "\n" \ - "Where key is the original Yaml line for the pair." + "Where *key* defines the name for the YAML node, and *value*" \ + " provides an optional direct value for the node." - ret = PyArg_ParseTuple(args, "O&", &convert_to_yaml_line, &key); - if (!ret) return NULL; + /* Récupération des paramètres */ - node = g_yaml_pair_new(key); + value = NULL; - g_object_ref_sink(G_OBJECT(node)); - result = pygobject_new(G_OBJECT(node)); - g_object_unref(node); + ret = PyArg_ParseTuple(args, "s|s", &key, &value); + if (!ret) return -1; - return result; + /* Initialisation d'un objet GLib */ + + ret = forward_pygobjet_init(self); + if (ret == -1) return -1; + + /* Eléments de base */ + + pair = G_YAML_PAIR(pygobject_get(self)); + + if (!g_yaml_pair_create(pair, key, value)) + { + PyErr_SetString(PyExc_ValueError, _("Unable to create YAML pair.")); + return -1; + + } + + return 0; } @@ -105,7 +122,7 @@ static PyObject *py_yaml_pair_new(PyTypeObject *type, PyObject *args, PyObject * * Paramètres : self = objet Python concerné par l'appel. * * closure = non utilisé ici. * * * -* Description : Fournit la clef représentée dans une paire en Yaml. * +* Description : Fournit la clef représentée dans une paire en YAML. * * * * Retour : Clef sous forme de chaîne de caractères. * * * @@ -122,7 +139,8 @@ static PyObject *py_yaml_pair_get_key(PyObject *self, void *closure) #define YAML_PAIR_KEY_ATTRIB PYTHON_GET_DEF_FULL \ ( \ key, py_yaml_pair, \ - "Key linked to the Yaml key/value pair node." \ + "Key linked to the YAML key/value pair node," \ + " as a string value." \ ) node = G_YAML_PAIR(pygobject_get(self)); @@ -142,7 +160,7 @@ static PyObject *py_yaml_pair_get_key(PyObject *self, void *closure) * Paramètres : self = objet Python concerné par l'appel. * * closure = non utilisé ici. * * * -* Description : Fournit l'éventuelle valeur d'une paire en Yaml. * +* Description : Fournit l'éventuelle valeur d'une paire en YAML. * * * * Retour : Valeur sous forme de chaîne de caractères ou None. * * * @@ -159,7 +177,8 @@ static PyObject *py_yaml_pair_get_value(PyObject *self, void *closure) #define YAML_PAIR_VALUE_ATTRIB PYTHON_GET_DEF_FULL \ ( \ value, py_yaml_pair, \ - "Value linked to the Yaml key/value pair node or None." \ + "Value linked to the YAML key/value pair node, as a" \ + " string value, or None if none defined." \ ) node = G_YAML_PAIR(pygobject_get(self)); @@ -183,10 +202,10 @@ static PyObject *py_yaml_pair_get_value(PyObject *self, void *closure) /****************************************************************************** * * * Paramètres : self = contenu binaire à manipuler. * -* value = collection de noeuds Yaml. * +* value = collection de noeuds YAML. * * closure = adresse non utilisée ici. * * * -* Description : Attache une collection de noeuds Yaml à un noeud. * +* Description : Attache une collection de noeuds YAML à un noeud. * * * * Retour : Jeu d'attributs liés au contenu courant. * * * @@ -194,28 +213,28 @@ static PyObject *py_yaml_pair_get_value(PyObject *self, void *closure) * * ******************************************************************************/ -static int py_yaml_pair_set_collection(PyObject *self, PyObject *value, void *closure) +static int py_yaml_pair_set_children(PyObject *self, PyObject *value, void *closure) { int result; /* Bilan à renvoyer */ GYamlPair *node; /* Version GLib du noeud */ - GYamlCollection *collec; /* Version GLib de la valeur */ + GYamlCollection *children; /* Version GLib de la valeur */ node = G_YAML_PAIR(pygobject_get(self)); if (value == Py_None) { - g_yaml_pair_set_collection(node, NULL); + g_yaml_pair_set_children(node, NULL); result = 0; } else { - if (!convert_to_yaml_collection(value, &collec)) + if (!convert_to_yaml_collection(value, &children)) result = -1; else { - g_yaml_pair_set_collection(node, collec); + g_yaml_pair_set_children(node, children); result = 0; } @@ -233,29 +252,31 @@ static int py_yaml_pair_set_collection(PyObject *self, PyObject *value, void *cl * * * Description : Fournit une éventuelle collection rattachée à un noeud. * * * -* Retour : Collection de noeuds Yaml ou None. * +* Retour : Collection de noeuds YAML ou None. * * * * Remarques : - * * * ******************************************************************************/ -static PyObject *py_yaml_pair_get_collection(PyObject *self, void *closure) +static PyObject *py_yaml_pair_get_children(PyObject *self, void *closure) { PyObject *result; /* Instance à retourner */ GYamlPair *node; /* Version GLib du noeud */ - GYamlCollection *collec; /* Collection à transmettre */ - -#define YAML_PAIR_COLLECTION_ATTRIB PYTHON_GETSET_DEF_FULL \ -( \ - collection, py_yaml_pair, \ - "Provide or define the collection of nodes attached to another Yaml node." \ + GYamlCollection *children; /* Collection à transmettre */ + +#define YAML_PAIR_CHILDREN_ATTRIB PYTHON_GETSET_DEF_FULL \ +( \ + children, py_yaml_pair, \ + "Provide or define the collection of nodes attached to another" \ + " YAML node. The collection, if defined, is handled as a" \ + " pychrysalide.plugins.yaml.YamlCollection instance." \ ) node = G_YAML_PAIR(pygobject_get(self)); - collec = g_yaml_pair_get_collection(node); + children = g_yaml_pair_get_children(node); - if (collec == NULL) + if (children == NULL) { result = Py_None; Py_INCREF(result); @@ -263,8 +284,8 @@ static PyObject *py_yaml_pair_get_collection(PyObject *self, void *closure) else { - result = pygobject_new(G_OBJECT(collec)); - g_object_unref(collec); + result = pygobject_new(G_OBJECT(children)); + g_object_unref(children); } return result; @@ -293,7 +314,7 @@ PyTypeObject *get_python_yaml_pair_type(void) static PyGetSetDef py_yaml_pair_getseters[] = { YAML_PAIR_KEY_ATTRIB, YAML_PAIR_VALUE_ATTRIB, - YAML_PAIR_COLLECTION_ATTRIB, + YAML_PAIR_CHILDREN_ATTRIB, { NULL } }; @@ -310,7 +331,10 @@ PyTypeObject *get_python_yaml_pair_type(void) .tp_methods = py_yaml_pair_methods, .tp_getset = py_yaml_pair_getseters, - .tp_new = py_yaml_pair_new + + .tp_init = py_yaml_pair_init, + .tp_new = py_yaml_pair_new, + }; @@ -353,7 +377,7 @@ bool register_python_yaml_pair(PyObject *module) * Paramètres : arg = argument quelconque à tenter de convertir. * * dst = destination des valeurs récupérées en cas de succès. * * * -* Description : Tente de convertir en noeud d'arborescence de format Yaml. * +* Description : Tente de convertir en noeud d'arborescence de format YAML. * * * * Retour : Bilan de l'opération, voire indications supplémentaires. * * * @@ -375,7 +399,7 @@ int convert_to_yaml_pair(PyObject *arg, void *dst) break; case 0: - PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to Yaml key/value pair"); + PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to YAML key/value pair"); break; case 1: diff --git a/plugins/yaml/python/pair.h b/plugins/yaml/python/pair.h index 2cafab8..0e7e04c 100644 --- a/plugins/yaml/python/pair.h +++ b/plugins/yaml/python/pair.h @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * pair.h - prototypes pour l'équivalent Python du fichier "plugins/yaml/pair.h" * - * Copyright (C) 2020 Cyrille Bagard + * Copyright (C) 2020-2023 Cyrille Bagard * * This file is part of Chrysalide. * @@ -37,7 +37,7 @@ PyTypeObject *get_python_yaml_pair_type(void); /* Prend en charge l'objet 'pychrysalide.plugins.yaml.YamlPair'. */ bool register_python_yaml_pair(PyObject *); -/* Tente de convertir en noeud d'arborescence de format Yaml. */ +/* Tente de convertir en noeud d'arborescence de format YAML. */ int convert_to_yaml_pair(PyObject *, void *); diff --git a/plugins/yaml/python/parser.c b/plugins/yaml/python/parser.c new file mode 100644 index 0000000..35a9090 --- /dev/null +++ b/plugins/yaml/python/parser.c @@ -0,0 +1,186 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * parser.c - équivalent Python du fichier "plugins/yaml/parser.c" + * + * Copyright (C) 2019-2023 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "parser.h" + + +#include +#include + + +#include +#include + + +#include "../parser.h" + + + +/* Crée une arborescence YAML pour contenu au format adapté. */ +static PyObject *py_yaml_parse_from_text(PyObject *, PyObject *); + +/* Crée une arborescence YAML pour fichier au format adapté. */ +static PyObject *py_yaml_parse_from_file(PyObject *, PyObject *); + + + +/****************************************************************************** +* * +* Paramètres : self = NULL car méthode statique. * +* args = arguments fournis lors de l'appel à la fonction. * +* * +* Description : Crée une arborescence YAML pour contenu au format adapté. * +* * +* Retour : Arborescence YAML mise en place ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_yaml_parse_from_text(PyObject *self, PyObject *args) +{ + PyObject *result; /* Instance à retourner */ + const char *text; /* Chaîne à traiter. */ + int ret; /* Bilan de lecture des args. */ + GYamlNode *root; /* Noeud racine obtenu */ + +#define YAML_PARSE_FROM_TEXT_METHOD PYTHON_METHOD_DEF \ +( \ + parse_from_text, "text, /", \ + METH_VARARGS, py_yaml, \ + "Parse a YAML content in order to build the relative YAML tree.\n" \ + "\n" \ + "The *text* argument is a string containg a markup content to" \ + " parse.\n" \ + "\n" \ + "The result is a pychrysalide.plugins.yaml.YamlNode instance" \ + " or None in case of error." \ +) + + ret = PyArg_ParseTuple(args, "s", &text); + if (!ret) return NULL; + + root = parse_yaml_from_text(text, strlen(text)); + + if (root != NULL) + { + result = pygobject_new(G_OBJECT(root)); + g_object_unref(G_OBJECT(root)); + } + else + { + result = Py_None; + Py_INCREF(result); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = NULL car méthode statique. * +* args = arguments fournis lors de l'appel à la fonction. * +* * +* Description : Crée une arborescence YAML pour fichier au format adapté. * +* * +* Retour : Arborescence YAML mise en place ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_yaml_parse_from_file(PyObject *self, PyObject *args) +{ + PyObject *result; /* Instance à retourner */ + const char *filename; /* Chemin vers des définitions */ + int ret; /* Bilan de lecture des args. */ + GYamlNode *root; /* Noeud racine obtenu */ + +#define YAML_PARSE_FROM_FILE_METHOD PYTHON_METHOD_DEF \ +( \ + parse_from_file, "filename, /", \ + METH_VARARGS, py_yaml, \ + "Parse a YAML content in order to build the relative YAML tree.\n" \ + "\n" \ + "The *filename* argument is a string for a path pointing to a YAML" \ + " content. This path can be either a real filename or a resource" \ + " URI.\n" \ + "\n" \ + "The result is a pychrysalide.plugins.yaml.YamlNode instance" \ + " or None in case of error." \ +) + + ret = PyArg_ParseTuple(args, "s", &filename); + if (!ret) return NULL; + + root = parse_yaml_from_file(filename); + + if (root != NULL) + { + result = pygobject_new(G_OBJECT(root)); + g_object_unref(G_OBJECT(root)); + } + else + { + result = Py_None; + Py_INCREF(result); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Définit une extension du module 'plugins.yaml' à compléter. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool populate_yaml_module_with_parsers(void) +{ + bool result; /* Bilan à retourner */ + PyObject *module; /* Module à recompléter */ + + static PyMethodDef py_yaml_methods[] = { + YAML_PARSE_FROM_TEXT_METHOD, + YAML_PARSE_FROM_FILE_METHOD, + { NULL } + }; + + module = get_access_to_python_module("pychrysalide.plugins.yaml"); + + result = register_python_module_methods(module, py_yaml_methods); + + return result; + +} diff --git a/plugins/yaml/python/parser.h b/plugins/yaml/python/parser.h new file mode 100644 index 0000000..18586ab --- /dev/null +++ b/plugins/yaml/python/parser.h @@ -0,0 +1,39 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * parser.h - prototypes pour l'équivalent Python du fichier "plugins/yaml/parser.h" + * + * Copyright (C) 2019-2023 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#ifndef _PLUGINS_YAML_PYTHON_PARSER_H +#define _PLUGINS_YAML_PYTHON_PARSER_H + + +#include +#include + + + +/* Définit une extension du module 'plugins.yaml' à compléter. */ +bool populate_yaml_module_with_parsers(void); + + + +#endif /* _PLUGINS_YAML_PYTHON_PARSER_H */ diff --git a/plugins/yaml/python/reader.c b/plugins/yaml/python/reader.c deleted file mode 100644 index 795b60c..0000000 --- a/plugins/yaml/python/reader.c +++ /dev/null @@ -1,365 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * reader.c - équivalent Python du fichier "plugins/yaml/reader.c" - * - * Copyright (C) 2019 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "reader.h" - - -#include - - -#include -#include -#include -#include - - -#include "../reader-int.h" - - - -CREATE_DYN_CONSTRUCTOR(yaml_reader, G_TYPE_YAML_READER); - -/* Initialise une instance sur la base du dérivé de GObject. */ -static int py_yaml_reader_init(PyObject *, PyObject *, PyObject *); - -/* Fournit la liste des lignes lues depuis un contenu Yaml. */ -static PyObject *py_yaml_reader_get_lines(PyObject *, void *); - -/* Fournit l'arborescence associée à la lecture de lignes Yaml. */ -static PyObject *py_yaml_reader_get_tree(PyObject *, void *); - - - -/****************************************************************************** -* * -* Paramètres : self = objet à initialiser (théoriquement). * -* args = arguments fournis à l'appel. * -* kwds = arguments de type key=val fournis. * -* * -* Description : Initialise une instance sur la base du dérivé de GObject. * -* * -* Retour : 0. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static int py_yaml_reader_init(PyObject *self, PyObject *args, PyObject *kwds) -{ - const char *text; /* Contenu de règles à traiter */ - const char *filename; /* Fichier de définitions */ - int ret; /* Bilan de lecture des args. */ - GYamlReader *reader; /* Création GLib à transmettre */ - - static char *kwlist[] = { "text", "filename", NULL }; - -#define YAML_READER_DOC \ - "YamlReader is the class which aims to provide a reader interface" \ - " to Yaml content.\n" \ - "\n" \ - "Instances can be created using one of the following" \ - " constructors:\n" \ - "\n" \ - " YamlReader(text=str)" \ - "\n" \ - " YamlReader(filename=str)" \ - "\n" \ - "Where *text* is a string containg a markup content to parse;" \ - " the *filename* argument is an alternative string for a path" \ - " pointing to the same kind of content. This path can be a real" \ - " filename or a resource URI." \ - "\n" \ - "When parsing is successful, the Yaml content can be retrieved" \ - " line by line or thanks to a tree." - - /* Récupération des paramètres */ - - text = NULL; - filename = NULL; - - ret = PyArg_ParseTupleAndKeywords(args, kwds, "|ss", kwlist, &text, &filename); - if (!ret) return -1; - - /* Initialisation d'un objet GLib */ - - ret = forward_pygobjet_init(self); - if (ret == -1) return -1; - - /* Eléments de base */ - - reader = G_YAML_READER(pygobject_get(self)); - - if (text != NULL) - { - if (!g_yaml_reader_create_from_text(reader, text)) - { - PyErr_SetString(PyExc_ValueError, _("Unable to create Yaml reader.")); - return -1; - } - - } - - else if (filename != NULL) - { - if (!g_yaml_reader_create_from_file(reader, filename)) - { - PyErr_SetString(PyExc_ValueError, _("Unable to create Yaml reader.")); - return -1; - } - - } - - else - { - PyErr_SetString(PyExc_ValueError, _("Unable to create empty Yaml reader.")); - return -1; - } - - return 0; - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * -* * -* Description : Fournit la liste des lignes lues depuis un contenu Yaml. * -* * -* Retour : Liste de lignes correspondant au contenu Yaml lu. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_reader_get_lines(PyObject *self, void *closure) -{ - PyObject *result; /* Résultat à retourner */ - GYamlReader *reader; /* Version GLib du type */ - size_t count; /* Quantité de lignes à traiter*/ - GYamlLine **lines; /* Liste de lignes lues */ - size_t i; /* Boucle de parcours */ -#ifndef NDEBUG - int ret; /* Bilan d'une insertion */ -#endif - -#define YAML_READER_LINES_ATTRIB PYTHON_GET_DEF_FULL \ -( \ - lines, py_yaml_reader, \ - "List of Yaml lines processed by the reader." \ -) - - reader = G_YAML_READER(pygobject_get(self)); - - lines = g_yaml_reader_get_lines(reader, &count); - - result = PyTuple_New(count); - - for (i = 0; i < count; i++) - { -#ifndef NDEBUG - ret = PyTuple_SetItem(result, i, pygobject_new(G_OBJECT(lines[i]))); - assert(ret == 0); -#else - PyTuple_SetItem(result, i, pygobject_new(G_OBJECT(lines[i]))); -#endif - - g_object_unref(G_OBJECT(lines[i])); - - } - - if (lines != NULL) - free(lines); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * -* * -* Description : Fournit l'arborescence associée à la lecture de lignes Yaml. * -* * -* Retour : Arborescence constituée par la lecture du contenu Yaml. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_reader_get_tree(PyObject *self, void *closure) -{ - PyObject *result; /* Résultat à retourner */ - GYamlReader *reader; /* Version GLib du type */ - GYamlTree *tree; /* Arborescence associée */ - -#define YAML_READER_TREE_ATTRIB PYTHON_GET_DEF_FULL \ -( \ - tree, py_yaml_reader, \ - "Tree of all nodes built from the Yaml content." \ -) - - reader = G_YAML_READER(pygobject_get(self)); - - tree = g_yaml_reader_get_tree(reader); - - if (tree == NULL) - { - result = Py_None; - Py_INCREF(result); - } - else - { - result = pygobject_new(G_OBJECT(tree)); - g_object_unref(G_OBJECT(tree)); - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Fournit un accès à une définition de type à diffuser. * -* * -* Retour : Définition d'objet pour Python. * -* * -* Remarques : - * -* * -******************************************************************************/ - -PyTypeObject *get_python_yaml_reader_type(void) -{ - static PyMethodDef py_yaml_reader_methods[] = { - { NULL } - }; - - static PyGetSetDef py_yaml_reader_getseters[] = { - YAML_READER_LINES_ATTRIB, - YAML_READER_TREE_ATTRIB, - { NULL } - }; - - static PyTypeObject py_yaml_reader_type = { - - PyVarObject_HEAD_INIT(NULL, 0) - - .tp_name = "pychrysalide.plugins.yaml.YamlReader", - .tp_basicsize = sizeof(PyGObject), - - .tp_flags = Py_TPFLAGS_DEFAULT, - - .tp_doc = YAML_READER_DOC, - - .tp_methods = py_yaml_reader_methods, - .tp_getset = py_yaml_reader_getseters, - - .tp_init = py_yaml_reader_init, - .tp_new = py_yaml_reader_new, - - }; - - return &py_yaml_reader_type; - -} - - -/****************************************************************************** -* * -* Paramètres : module = module dont la définition est à compléter. * -* * -* Description : Prend en charge l'objet 'pychrysalide.plugins.....YamlReader.* -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool register_python_yaml_reader(PyObject *module) -{ - PyTypeObject *type; /* Type Python 'YamlReader' */ - PyObject *dict; /* Dictionnaire du module */ - - type = get_python_yaml_reader_type(); - - dict = PyModule_GetDict(module); - - if (!register_class_for_pygobject(dict, G_TYPE_YAML_READER, type, &PyGObject_Type)) - return false; - - return true; - -} - - -/****************************************************************************** -* * -* Paramètres : arg = argument quelconque à tenter de convertir. * -* dst = destination des valeurs récupérées en cas de succès. * -* * -* Description : Tente de convertir en lecteur de données au format Yaml. * -* * -* Retour : Bilan de l'opération, voire indications supplémentaires. * -* * -* Remarques : - * -* * -******************************************************************************/ - -int convert_to_yaml_reader(PyObject *arg, void *dst) -{ - int result; /* Bilan à retourner */ - - result = PyObject_IsInstance(arg, (PyObject *)get_python_yaml_reader_type()); - - switch (result) - { - case -1: - /* L'exception est déjà fixée par Python */ - result = 0; - break; - - case 0: - PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to Yaml reader"); - break; - - case 1: - *((GYamlReader **)dst) = G_YAML_READER(pygobject_get(arg)); - break; - - default: - assert(false); - break; - - } - - return result; - -} diff --git a/plugins/yaml/python/reader.h b/plugins/yaml/python/reader.h deleted file mode 100644 index 19d238b..0000000 --- a/plugins/yaml/python/reader.h +++ /dev/null @@ -1,45 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * reader.h - prototypes pour l'équivalent Python du fichier "plugins/yaml/reader.h" - * - * Copyright (C) 2019 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#ifndef _PLUGINS_YAML_PYTHON_READER_H -#define _PLUGINS_YAML_PYTHON_READER_H - - -#include -#include - - - -/* Fournit un accès à une définition de type à diffuser. */ -PyTypeObject *get_python_yaml_reader_type(void); - -/* Prend en charge l'objet 'pychrysalide.plugins.yaml.YamlReader'. */ -bool register_python_yaml_reader(PyObject *); - -/* Tente de convertir en lecteur de données au format Yaml. */ -int convert_to_yaml_reader(PyObject *, void *); - - - -#endif /* _PLUGINS_YAML_PYTHON_READER_H */ diff --git a/plugins/yaml/python/scalar.c b/plugins/yaml/python/scalar.c deleted file mode 100644 index 5a33cd1..0000000 --- a/plugins/yaml/python/scalar.c +++ /dev/null @@ -1,304 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * scalar.c - équivalent Python du fichier "plugins/yaml/scalar.c" - * - * Copyright (C) 2019-2020 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "scalar.h" - - -#include - - -#include - - -#include "collection.h" -#include "line.h" -#include "node.h" -#include "../scalar.h" - - - -/* Crée un nouvel objet Python de type 'YamlScalar'. */ -static PyObject *py_yaml_scalar_new(PyTypeObject *, PyObject *, PyObject *); - -/* Attache une collection de noeuds Yaml à un noeud. */ -static int py_yaml_scalar_set_collection(PyObject *, PyObject *, void *); - -/* Fournit une éventuelle collection rattachée à un noeud. */ -static PyObject *py_yaml_scalar_get_collection(PyObject *, void *); - - - -/****************************************************************************** -* * -* Paramètres : type = type de l'objet à instancier. * -* args = arguments fournis à l'appel. * -* kwds = arguments de type key=val fournis. * -* * -* Description : Crée un nouvel objet Python de type 'YamlScalar'. * -* * -* Retour : Instance Python mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_scalar_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject *result; /* Instance à retourner */ - GYamlLine *key; /* Ligne principale du noeud */ - int ret; /* Bilan de lecture des args. */ - GYamlScalar *node; /* Création GLib à transmettre */ - -#define YAML_SCALAR_DOC \ - "YamlScalar handles a scalar node in a Yaml tree.\n" \ - "\n" \ - "Instances can be created using the following constructor:\n" \ - "\n" \ - " YamlScalar(key)\n" \ - "\n" \ - "Where key is the main Yaml line for the scalar." - - ret = PyArg_ParseTuple(args, "O&", &convert_to_yaml_line, &key); - if (!ret) return NULL; - - node = g_yaml_scalar_new(key); - - g_object_ref_sink(G_OBJECT(node)); - result = pygobject_new(G_OBJECT(node)); - g_object_unref(node); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = contenu binaire à manipuler. * -* value = collection de noeuds Yaml. * -* closure = adresse non utilisée ici. * -* * -* Description : Attache une collection de noeuds Yaml à un noeud. * -* * -* Retour : Jeu d'attributs liés au contenu courant. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static int py_yaml_scalar_set_collection(PyObject *self, PyObject *value, void *closure) -{ - int result; /* Bilan à renvoyer */ - GYamlScalar *node; /* Version GLib du noeud */ - GYamlCollection *collec; /* Version GLib de la valeur */ - - node = G_YAML_SCALAR(pygobject_get(self)); - - if (value == Py_None) - { - g_yaml_scalar_set_collection(node, NULL); - result = 0; - } - - else - { - if (!convert_to_yaml_collection(value, &collec)) - result = -1; - - else - { - g_yaml_scalar_set_collection(node, collec); - result = 0; - } - - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = contenu binaire à manipuler. * -* closure = adresse non utilisée ici. * -* * -* Description : Fournit une éventuelle collection rattachée à un noeud. * -* * -* Retour : Collection de noeuds Yaml ou None. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_scalar_get_collection(PyObject *self, void *closure) -{ - PyObject *result; /* Instance à retourner */ - GYamlScalar *node; /* Version GLib du noeud */ - GYamlCollection *collec; /* Collection à transmettre */ - -#define YAML_SCALAR_COLLECTION_ATTRIB PYTHON_GETSET_DEF_FULL \ -( \ - collection, py_yaml_scalar, \ - "Provide or define the collection of nodes attached to another Yaml node." \ -) - - node = G_YAML_SCALAR(pygobject_get(self)); - - collec = g_yaml_scalar_get_collection(node); - - if (collec == NULL) - { - result = Py_None; - Py_INCREF(result); - } - - else - { - result = pygobject_new(G_OBJECT(collec)); - g_object_unref(collec); - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Fournit un accès à une définition de type à diffuser. * -* * -* Retour : Définition d'objet pour Python. * -* * -* Remarques : - * -* * -******************************************************************************/ - -PyTypeObject *get_python_yaml_scalar_type(void) -{ - static PyMethodDef py_yaml_scalar_methods[] = { - { NULL } - }; - - static PyGetSetDef py_yaml_scalar_getseters[] = { - YAML_SCALAR_COLLECTION_ATTRIB, - { NULL } - }; - - static PyTypeObject py_yaml_scalar_type = { - - PyVarObject_HEAD_INIT(NULL, 0) - - .tp_name = "pychrysalide.plugins.yaml.YamlScalar", - .tp_basicsize = sizeof(PyGObject), - - .tp_flags = Py_TPFLAGS_DEFAULT, - - .tp_doc = YAML_SCALAR_DOC, - - .tp_methods = py_yaml_scalar_methods, - .tp_getset = py_yaml_scalar_getseters, - .tp_new = py_yaml_scalar_new - - }; - - return &py_yaml_scalar_type; - -} - - -/****************************************************************************** -* * -* Paramètres : module = module dont la définition est à compléter. * -* * -* Description : Prend en charge l'objet 'pychrysalide.plugins.....YamlScalar.* -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool register_python_yaml_scalar(PyObject *module) -{ - PyTypeObject *type; /* Type Python 'YamlScalar' */ - PyObject *dict; /* Dictionnaire du module */ - - type = get_python_yaml_scalar_type(); - - dict = PyModule_GetDict(module); - - if (!register_class_for_pygobject(dict, G_TYPE_YAML_SCALAR, type, get_python_yaml_node_type())) - return false; - - return true; - -} - - -/****************************************************************************** -* * -* Paramètres : arg = argument quelconque à tenter de convertir. * -* dst = destination des valeurs récupérées en cas de succès. * -* * -* Description : Tente de convertir en noeud d'arborescence de format Yaml. * -* * -* Retour : Bilan de l'opération, voire indications supplémentaires. * -* * -* Remarques : - * -* * -******************************************************************************/ - -int convert_to_yaml_scalar(PyObject *arg, void *dst) -{ - int result; /* Bilan à retourner */ - - result = PyObject_IsInstance(arg, (PyObject *)get_python_yaml_scalar_type()); - - switch (result) - { - case -1: - /* L'exception est déjà fixée par Python */ - result = 0; - break; - - case 0: - PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to Yaml scalar"); - break; - - case 1: - *((GYamlScalar **)dst) = G_YAML_SCALAR(pygobject_get(arg)); - break; - - default: - assert(false); - break; - - } - - return result; - -} diff --git a/plugins/yaml/python/scalar.h b/plugins/yaml/python/scalar.h deleted file mode 100644 index 3812bd7..0000000 --- a/plugins/yaml/python/scalar.h +++ /dev/null @@ -1,45 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * scalar.h - prototypes pour l'équivalent Python du fichier "plugins/yaml/scalar.h" - * - * Copyright (C) 2019 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#ifndef _PLUGINS_YAML_PYTHON_SCALAR_H -#define _PLUGINS_YAML_PYTHON_SCALAR_H - - -#include -#include - - - -/* Fournit un accès à une définition de type à diffuser. */ -PyTypeObject *get_python_yaml_scalar_type(void); - -/* Prend en charge l'objet 'pychrysalide.plugins.yaml.YamlScalar'. */ -bool register_python_yaml_scalar(PyObject *); - -/* Tente de convertir en noeud d'arborescence de format Yaml. */ -int convert_to_yaml_scalar(PyObject *, void *); - - - -#endif /* _PLUGINS_YAML_PYTHON_SCALAR_H */ diff --git a/plugins/yaml/python/tree.c b/plugins/yaml/python/tree.c deleted file mode 100644 index 7d28254..0000000 --- a/plugins/yaml/python/tree.c +++ /dev/null @@ -1,427 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * tree.c - équivalent Python du fichier "plugins/yaml/tree.c" - * - * Copyright (C) 2019-2020 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "tree.h" - - -#include - - -#include -#include - - -#include "line.h" -#include "../tree.h" - - - -/* Crée un nouvel objet Python de type 'YamlTree'. */ -static PyObject *py_yaml_tree_new(PyTypeObject *, PyObject *, PyObject *); - -/* Recherche les noeuds correspondant à un chemin. */ -static PyObject *py_yaml_tree_find_by_path(PyObject *, PyObject *); - -/* Fournit le noeud constituant la racine d'arborescence Yaml. */ -static PyObject *py_yaml_tree_get_root(PyObject *, void *); - - - -/****************************************************************************** -* * -* Paramètres : type = type de l'objet à instancier. * -* args = arguments fournis à l'appel. * -* kwds = arguments de type key=val fournis. * -* * -* Description : Crée un nouvel objet Python de type 'YamlTree'. * -* * -* Retour : Instance Python mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_tree_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject *result; /* Instance à retourner */ - PyObject *tuple; /* Liste de lignes Yaml */ - int ret; /* Bilan de lecture des args. */ - size_t count; /* Nombre d'éléments présents */ - GYamlLine **lines; /* Lignes au format Yaml */ - GYamlTree *tree; /* Création GLib à transmettre */ - size_t i; /* Boucle de parcours #1 */ - PyObject *item; /* Elément de la liste fournie */ - size_t k; /* Boucle de parcours #2 */ - -#define YAML_TREE_DOC \ - "YamlTree offers a hierarchical access to Yaml lines as a tree.\n" \ - "\n" \ - "Instances can be created using the following constructor:\n" \ - "\n" \ - " YamlTree(lines)" \ - "\n" \ - "Where lines are a tuple of Yaml lines used to built the tree." - - ret = PyArg_ParseTuple(args, "O!", &PyTuple_Type, &tuple); - if (!ret) return NULL; - - count = PyTuple_Size(tuple); - - lines = (GYamlLine **)malloc(count * sizeof(GYamlLine *)); - - tree = NULL; - - for (i = 0; i < count; i++) - { - item = PyTuple_GetItem(tuple, i); - - ret = convert_to_yaml_line(item, &lines[i]); - - if (ret == 0) - g_object_ref(G_OBJECT(lines[i])); - - else - goto arg_error; - - } - - tree = g_yaml_tree_new(lines, count); - - arg_error: - - for (k = 0; k < i; k++) - g_object_unref(G_OBJECT(lines[i])); - - free(lines); - - /* S'il y a eu une erreur... */ - if (i < count) return NULL; - - if (tree == NULL) - { - result = Py_None; - Py_INCREF(result); - } - - else - { - g_object_ref_sink(G_OBJECT(tree)); - result = pygobject_new(G_OBJECT(tree)); - g_object_unref(tree); - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = variable non utilisée ici. * -* args = arguments fournis à l'appel. * -* * -* Description : Recherche les noeuds correspondant à un chemin. * -* * -* Retour : Liste de noeuds trouvés, éventuellement vide. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_tree_find_by_path(PyObject *self, PyObject *args) -{ - PyObject *result; /* Instance à retourner */ - int prepare; /* Orientation des résultats */ - const char *path; /* Chemin d'accès à traiter */ - int ret; /* Bilan de lecture des args. */ - GYamlTree *tree; /* Version GLib du type */ - GYamlNode **found; /* Créations GLib à transmettre*/ - size_t count; /* Quantité de trouvailles */ - size_t i; /* Boucle de parcours */ - -#define YAML_TREE_FIND_BY_PATH_METHOD PYTHON_METHOD_DEF \ -( \ - find_by_path, "path, /, prepare=False", \ - METH_VARARGS, py_yaml_tree, \ - "Find nodes in a Yaml tree using a path.\n" \ - "\n" \ - "Paths are node keys separated by '/', such as '/my/path/to/node'." \ - "\n" \ - "In case where the path ends with a trailing '/', the operation can" \ - " be used to prepare a further look by returning a node which can be" \ - " searched by a new call to this function instead of returning all its" \ - " contained nodes." \ -) - - prepare = 0; - - ret = PyArg_ParseTuple(args, "s|p", &path, &prepare); - if (!ret) return NULL; - - tree = G_YAML_TREE(pygobject_get(self)); - - g_yaml_tree_find_by_path(tree, path, prepare, &found, &count); - - result = PyTuple_New(count); - - for (i = 0; i < count; i++) - { -#ifndef NDEBUG - ret = PyTuple_SetItem(result, i, pygobject_new(G_OBJECT(found[i]))); - assert(ret == 0); -#else - PyTuple_SetItem(result, i, pygobject_new(G_OBJECT(found[i]))); -#endif - - g_object_unref(G_OBJECT(found[i])); - - } - - if (found != NULL) - free(found); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = variable non utilisée ici. * -* args = arguments fournis à l'appel. * -* * -* Description : Recherche l'unique noeud correspondant à un chemin. * -* * -* Retour : Noeud avec correspondance établie ou None. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_tree_find_one_by_path(PyObject *self, PyObject *args) -{ - PyObject *result; /* Instance à retourner */ - int prepare; /* Orientation des résultats */ - const char *path; /* Chemin d'accès à traiter */ - int ret; /* Bilan de lecture des args. */ - GYamlTree *tree; /* Version GLib du type */ - GYamlNode *found; /* Création GLib à transmettre */ - -#define YAML_TREE_FIND_ONE_BY_PATH_METHOD PYTHON_METHOD_DEF \ -( \ - find_one_by_path, "path, /, prepare=False", \ - METH_VARARGS, py_yaml_tree, \ - "Find a given node from a Yaml node using a path.\n" \ - "\n" \ - "Paths are node keys separated by '/', such as '/my/path/to/node'." \ - "\n" \ - "Only one node has to match the path for the function success." \ - "\n" \ - "In case where the path ends with a trailing '/', the operation can" \ - " be used to prepare a further look by returning a node which can be" \ - " searched by a new call to this function instead of returning all its" \ - " contained nodes." \ -) - - prepare = 0; - - ret = PyArg_ParseTuple(args, "s|p", &path, &prepare); - if (!ret) return NULL; - - tree = G_YAML_TREE(pygobject_get(self)); - - found = g_yaml_tree_find_one_by_path(tree, path, prepare); - - if (found == NULL) - { - result = Py_None; - Py_INCREF(result); - } - else - { - result = pygobject_new(G_OBJECT(found)); - g_object_unref(G_OBJECT(found)); - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * -* * -* Description : Fournit le noeud constituant la racine d'arborescence Yaml. * -* * -* Retour : Noeud constituant la racine de l'arborescence. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_yaml_tree_get_root(PyObject *self, void *closure) -{ - PyObject *result; /* Résultat à retourner */ - GYamlTree *tree; /* Version GLib du type */ - GYamlNode *root; /* Noeud racine d'arborescence */ - -#define YAML_TREE_ROOT_ATTRIB PYTHON_GET_DEF_FULL \ -( \ - root, py_yaml_tree, \ - "Yaml node which is the root of the whole tree nodes." \ -) - - tree = G_YAML_TREE(pygobject_get(self)); - - root = g_yaml_tree_get_root(tree); - - result = pygobject_new(G_OBJECT(root)); - g_object_unref(G_OBJECT(root)); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Fournit un accès à une définition de type à diffuser. * -* * -* Retour : Définition d'objet pour Python. * -* * -* Remarques : - * -* * -******************************************************************************/ - -PyTypeObject *get_python_yaml_tree_type(void) -{ - static PyMethodDef py_yaml_tree_methods[] = { - YAML_TREE_FIND_BY_PATH_METHOD, - YAML_TREE_FIND_ONE_BY_PATH_METHOD, - { NULL } - }; - - static PyGetSetDef py_yaml_tree_getseters[] = { - YAML_TREE_ROOT_ATTRIB, - { NULL } - }; - - static PyTypeObject py_yaml_tree_type = { - - PyVarObject_HEAD_INIT(NULL, 0) - - .tp_name = "pychrysalide.plugins.yaml.YamlTree", - .tp_basicsize = sizeof(PyGObject), - - .tp_flags = Py_TPFLAGS_DEFAULT, - - .tp_doc = YAML_TREE_DOC, - - .tp_methods = py_yaml_tree_methods, - .tp_getset = py_yaml_tree_getseters, - .tp_new = py_yaml_tree_new - - }; - - return &py_yaml_tree_type; - -} - - -/****************************************************************************** -* * -* Paramètres : module = module dont la définition est à compléter. * -* * -* Description : Prend en charge l'objet 'pychrysalide.plugins.....YamlTree. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool register_python_yaml_tree(PyObject *module) -{ - PyTypeObject *type; /* Type Python 'YamlTree' */ - PyObject *dict; /* Dictionnaire du module */ - - type = get_python_yaml_tree_type(); - - dict = PyModule_GetDict(module); - - if (!register_class_for_pygobject(dict, G_TYPE_YAML_TREE, type, &PyGObject_Type)) - return false; - - return true; - -} - - -/****************************************************************************** -* * -* Paramètres : arg = argument quelconque à tenter de convertir. * -* dst = destination des valeurs récupérées en cas de succès. * -* * -* Description : Tente de convertir en arborescence de lignes au format Yaml. * -* * -* Retour : Bilan de l'opération, voire indications supplémentaires. * -* * -* Remarques : - * -* * -******************************************************************************/ - -int convert_to_yaml_tree(PyObject *arg, void *dst) -{ - int result; /* Bilan à retourner */ - - result = PyObject_IsInstance(arg, (PyObject *)get_python_yaml_tree_type()); - - switch (result) - { - case -1: - /* L'exception est déjà fixée par Python */ - result = 0; - break; - - case 0: - PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to Yaml tree"); - break; - - case 1: - *((GYamlTree **)dst) = G_YAML_TREE(pygobject_get(arg)); - break; - - default: - assert(false); - break; - - } - - return result; - -} diff --git a/plugins/yaml/python/tree.h b/plugins/yaml/python/tree.h deleted file mode 100644 index df9d5b8..0000000 --- a/plugins/yaml/python/tree.h +++ /dev/null @@ -1,45 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * tree.h - prototypes pour l'équivalent Python du fichier "plugins/yaml/tree.h" - * - * Copyright (C) 2019 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#ifndef _PLUGINS_YAML_PYTHON_TREE_H -#define _PLUGINS_YAML_PYTHON_TREE_H - - -#include -#include - - - -/* Fournit un accès à une définition de type à diffuser. */ -PyTypeObject *get_python_yaml_tree_type(void); - -/* Prend en charge l'objet 'pychrysalide.plugins.yaml.YamlTree'. */ -bool register_python_yaml_tree(PyObject *); - -/* Tente de convertir en arborescence de lignes au format Yaml. */ -int convert_to_yaml_tree(PyObject *, void *); - - - -#endif /* _PLUGINS_YAML_PYTHON_TREE_H */ diff --git a/plugins/yaml/reader-int.h b/plugins/yaml/reader-int.h deleted file mode 100644 index 060b674..0000000 --- a/plugins/yaml/reader-int.h +++ /dev/null @@ -1,60 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * reader-int.h - prototypes internes pour le lecteur de contenu Yaml - * - * Copyright (C) 2023 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Chrysalide. If not, see . - */ - - -#ifndef PLUGINS_YAML_READER_INT_H -#define PLUGINS_YAML_READER_INT_H - - -#include "reader.h" - - - -/* Lecteur de contenu Yaml (instance) */ -struct _GYamlReader -{ - GObject parent; /* A laisser en premier */ - - GYamlLine **lines; /* Lignes Yaml chargées */ - size_t count; /* Quantié de ces lignes */ - - GYamlTree *tree; /* Arborescence constituée */ - -}; - -/* Lecteur de contenu Yaml (classe) */ -struct _GYamlReaderClass -{ - GObjectClass parent; /* A laisser en premier */ - -}; - - -/* Met en place un lecteur pour contenu au format Yaml. */ -bool g_yaml_reader_create_from_text(GYamlReader *, const char *); - -/* Met en place un lecteur pour contenu au format Yaml. */ -bool g_yaml_reader_create_from_file(GYamlReader *, const char *); - - - -#endif /* PLUGINS_YAML_READER_INT_H */ diff --git a/plugins/yaml/reader.c b/plugins/yaml/reader.c deleted file mode 100644 index 665e811..0000000 --- a/plugins/yaml/reader.c +++ /dev/null @@ -1,373 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * reader.c - lecteur de contenu Yaml - * - * Copyright (C) 2019-2020 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Chrysalide. If not, see . - */ - - -#include "reader.h" - - -#include -#include -#include - - -#include - - -#include "line.h" -#include "reader-int.h" - - - -/* Initialise la classe des lecteurs de contenus Yaml. */ -static void g_yaml_reader_class_init(GYamlReaderClass *); - -/* Initialise une instance de lecteur de contenu Yaml. */ -static void g_yaml_reader_init(GYamlReader *); - -/* Supprime toutes les références externes. */ -static void g_yaml_reader_dispose(GYamlReader *); - -/* Procède à la libération totale de la mémoire. */ -static void g_yaml_reader_finalize(GYamlReader *); - - - -/* Indique le type défini pour un lecteur de contenu Yaml. */ -G_DEFINE_TYPE(GYamlReader, g_yaml_reader, G_TYPE_OBJECT); - - -/****************************************************************************** -* * -* Paramètres : klass = classe à initialiser. * -* * -* Description : Initialise la classe des lecteurs de contenus Yaml. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_reader_class_init(GYamlReaderClass *klass) -{ - GObjectClass *object; /* Autre version de la classe */ - - object = G_OBJECT_CLASS(klass); - - object->dispose = (GObjectFinalizeFunc/* ! */)g_yaml_reader_dispose; - object->finalize = (GObjectFinalizeFunc)g_yaml_reader_finalize; - -} - - -/****************************************************************************** -* * -* Paramètres : reader = instance à initialiser. * -* * -* Description : Initialise une instance de lecteur de contenu Yaml. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_reader_init(GYamlReader *reader) -{ - reader->lines = NULL; - reader->count = 0; - - reader->tree = NULL; - -} - - -/****************************************************************************** -* * -* Paramètres : reader = instance d'objet GLib à traiter. * -* * -* Description : Supprime toutes les références externes. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_reader_dispose(GYamlReader *reader) -{ - size_t i; /* Boucle de parcours */ - - for (i = 0; i < reader->count; i++) - g_clear_object(&reader->lines[i]); - - g_clear_object(&reader->tree); - - G_OBJECT_CLASS(g_yaml_reader_parent_class)->dispose(G_OBJECT(reader)); - -} - - -/****************************************************************************** -* * -* Paramètres : reader = instance d'objet GLib à traiter. * -* * -* Description : Procède à la libération totale de la mémoire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_reader_finalize(GYamlReader *reader) -{ - if (reader->lines != NULL) - free(reader->lines); - - G_OBJECT_CLASS(g_yaml_reader_parent_class)->finalize(G_OBJECT(reader)); - -} - - -/****************************************************************************** -* * -* Paramètres : text = définitions textuelles d'un contenu brut. * -* * -* Description : Crée un lecteur pour contenu au format Yaml. * -* * -* Retour : Instance mise en place ou NULL en cas d'échec. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlReader *g_yaml_reader_new_from_text(const char *text) -{ - GYamlReader *result; /* Structure à retourner */ - - result = g_object_new(G_TYPE_YAML_READER, NULL); - - if (!g_yaml_reader_create_from_text(result, text)) - g_clear_object(&result); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : reader = lecteur de définition à initialiser pleinement. * -* text = définitions textuelles d'un contenu brut. * -* * -* Description : Met en place un lecteur pour contenu au format Yaml. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool g_yaml_reader_create_from_text(GYamlReader *reader, const char *text) -{ - bool result; /* Bilan à retourner */ - const char *saved; /* Sauvegarde de position */ - const char *iter; /* Boucle de parcours */ - size_t number; /* Indice de ligne courante */ - size_t rlen; /* Taille d'un contenu brut */ - GYamlLine *line; /* Nouvelle ligne Yaml */ - - result = false; - - for (iter = text, saved = strchr(iter, '\n'), number = 0; - *iter != '\0'; - iter = ++saved, saved = strchr(iter, '\n'), number++) - { - if (saved == NULL) - rlen = strlen(iter); - else - rlen = saved - iter; - - if (rlen > 0) - { - line = g_yaml_line_new(iter, rlen, number); - - if (line == NULL) - goto format_error; - - reader->lines = realloc(reader->lines, ++reader->count * sizeof(GYamlLine *)); - - g_object_ref_sink(G_OBJECT(line)); - reader->lines[reader->count - 1] = line; - - } - - if (saved == NULL) - break; - - } - - reader->tree = g_yaml_tree_new(reader->lines, reader->count); - - result = (reader->tree != NULL); - - format_error: - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : filename = chemin vers des définitions de règles. * -* * -* Description : Crée un lecteur pour contenu au format Yaml. * -* * -* Retour : Instance mise en place ou NULL en cas d'échec. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlReader *g_yaml_reader_new_from_file(const char *filename) -{ - GYamlReader *result; /* Structure à retourner */ - - result = g_object_new(G_TYPE_YAML_READER, NULL); - - if (!g_yaml_reader_create_from_file(result, filename)) - g_clear_object(&result); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : reader = lecteur de définition à initialiser pleinement. * -* filename = chemin vers des définitions de règles. * -* * -* Description : Met en place un lecteur pour contenu au format Yaml. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool g_yaml_reader_create_from_file(GYamlReader *reader, const char *filename) -{ - bool result; /* Bilan à retourner */ - GBinContent *content; /* Fichier à parcourir */ - phys_t size; /* Taille du contenu associé */ - vmpa2t start; /* Tête de lecture */ - const bin_t *data; /* Données à consulter */ - char *dumped; /* Contenu manipulable */ - - result = false; - - content = g_file_content_new(filename); - if (content == NULL) goto no_content; - - size = g_binary_content_compute_size(content); - - g_binary_content_compute_start_pos(content, &start); - data = g_binary_content_get_raw_access(content, &start, size); - - dumped = malloc((size + 1) * sizeof(char)); - - memcpy(dumped, data, size); - dumped[size] = '\0'; - - result = g_yaml_reader_create_from_text(reader, dumped); - - free(dumped); - - g_object_unref(G_OBJECT(content)); - - no_content: - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : reader = lecteur de contenu Yaml à consulter. * -* count = taille de la liste constituée. [OUT] * -* * -* Description : Fournit la liste des lignes lues depuis un contenu Yaml. * -* * -* Retour : Liste de lignes correspondant au contenu Yaml lu. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlLine **g_yaml_reader_get_lines(const GYamlReader *reader, size_t *count) -{ - GYamlLine **result; /* Liste à retourner */ - size_t i; /* Boucle de parcours */ - - *count = reader->count; - - result = malloc(*count * sizeof(GYamlLine *)); - - for (i = 0; i < *count; i++) - { - result[i] = reader->lines[i]; - g_object_ref(result[i]); - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : reader = lecteur de contenu Yaml à consulter. * -* * -* Description : Fournit l'arborescence associée à la lecture de lignes Yaml. * -* * -* Retour : Arborescence constituée par la lecture du contenu Yaml. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlTree *g_yaml_reader_get_tree(const GYamlReader *reader) -{ - GYamlTree *result; /* Arborescence à retourner */ - - result = reader->tree; - - if (result != NULL) - g_object_ref(G_OBJECT(result)); - - return result; - -} diff --git a/plugins/yaml/reader.h b/plugins/yaml/reader.h deleted file mode 100644 index 51bd7e2..0000000 --- a/plugins/yaml/reader.h +++ /dev/null @@ -1,69 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * reader.h - prototypes pour le lecteur de contenu Yaml - * - * Copyright (C) 2019 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Chrysalide. If not, see . - */ - - -#ifndef PLUGINS_YAML_READER_H -#define PLUGINS_YAML_READER_H - - -#include -#include - - -#include "line.h" -#include "tree.h" - - - -#define G_TYPE_YAML_READER g_yaml_reader_get_type() -#define G_YAML_READER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_YAML_READER, GYamlReader)) -#define G_IS_YAML_READER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_YAML_READER)) -#define G_YAML_READER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_YAML_READER, GYamlReaderClass)) -#define G_IS_YAML_READER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_YAML_READER)) -#define G_YAML_READER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_YAML_READER, GYamlReaderClass)) - - -/* Lecteur de contenu Yaml (instance) */ -typedef struct _GYamlReader GYamlReader; - -/* Lecteur de contenu Yaml (classe) */ -typedef struct _GYamlReaderClass GYamlReaderClass; - - -/* Indique le type défini pour un lecteur de contenu Yaml. */ -GType g_yaml_reader_get_type(void); - -/* Crée un lecteur pour contenu au format Yaml. */ -GYamlReader *g_yaml_reader_new_from_text(const char *); - -/* Crée un lecteur pour contenu au format Yaml. */ -GYamlReader *g_yaml_reader_new_from_file(const char *); - -/* Fournit la liste des lignes lues depuis un contenu Yaml. */ -GYamlLine **g_yaml_reader_get_lines(const GYamlReader *, size_t *); - -/* Fournit l'arborescence associée à la lecture de lignes Yaml. */ -GYamlTree *g_yaml_reader_get_tree(const GYamlReader *); - - - -#endif /* PLUGINS_YAML_READER_H */ diff --git a/plugins/yaml/scalar.c b/plugins/yaml/scalar.c deleted file mode 100644 index 1dd5989..0000000 --- a/plugins/yaml/scalar.c +++ /dev/null @@ -1,378 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * scalar.c - noeud Yaml de type "scalar" - * - * Copyright (C) 2019 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Chrysalide. If not, see . - */ - - -#include "scalar.h" - - -#include -#include - - -#include "node-int.h" - - - -/* Noeud d'une arborescence au format Yaml (instance) */ -struct _GYamlScalar -{ - GYamlNode parent; /* A laisser en premier */ - - GYamlLine *key; /* Clef principale du noeud */ - GYamlCollection *collection; /* Collection de noeuds */ - -}; - -/* Noeud d'une arborescence au format Yaml (classe) */ -struct _GYamlScalarClass -{ - GYamlNodeClass parent; /* A laisser en premier */ - -}; - - -/* Initialise la classe des noeuds d'arborescence Yaml. */ -static void g_yaml_scalar_class_init(GYamlScalarClass *); - -/* Initialise une instance de noeud d'arborescence Yaml. */ -static void g_yaml_scalar_init(GYamlScalar *); - -/* Supprime toutes les références externes. */ -static void g_yaml_scalar_dispose(GYamlScalar *); - -/* Procède à la libération totale de la mémoire. */ -static void g_yaml_scalar_finalize(GYamlScalar *); - -/* Recherche les noeuds correspondant à un chemin. */ -static void g_yaml_scalar_find_by_path(const GYamlScalar *, const char *, bool, GYamlNode ***, size_t *); - - - -/* Indique le type défini pour un noeud d'arborescence Yaml. */ -G_DEFINE_TYPE(GYamlScalar, g_yaml_scalar, G_TYPE_YAML_NODE); - - -/****************************************************************************** -* * -* Paramètres : klass = classe à initialiser. * -* * -* Description : Initialise la classe des noeuds d'arborescence Yaml. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_scalar_class_init(GYamlScalarClass *klass) -{ - GObjectClass *object; /* Autre version de la classe */ - GYamlNodeClass *node; /* Version parente de classe */ - - object = G_OBJECT_CLASS(klass); - - object->dispose = (GObjectFinalizeFunc/* ! */)g_yaml_scalar_dispose; - object->finalize = (GObjectFinalizeFunc)g_yaml_scalar_finalize; - - node = G_YAML_NODE_CLASS(klass); - - node->find = (find_yaml_node_fc)g_yaml_scalar_find_by_path; - -} - - -/****************************************************************************** -* * -* Paramètres : node = instance à initialiser. * -* * -* Description : Initialise une instance de noeud d'arborescence Yaml. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_scalar_init(GYamlScalar *node) -{ - node->key = NULL; - node->collection = NULL; - -} - - -/****************************************************************************** -* * -* Paramètres : node = instance d'objet GLib à traiter. * -* * -* Description : Supprime toutes les références externes. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_scalar_dispose(GYamlScalar *node) -{ - g_clear_object(&node->key); - - g_clear_object(&node->collection); - - G_OBJECT_CLASS(g_yaml_scalar_parent_class)->dispose(G_OBJECT(node)); - -} - - -/****************************************************************************** -* * -* Paramètres : node = instance d'objet GLib à traiter. * -* * -* Description : Procède à la libération totale de la mémoire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_scalar_finalize(GYamlScalar *node) -{ - G_OBJECT_CLASS(g_yaml_scalar_parent_class)->finalize(G_OBJECT(node)); - -} - - -/****************************************************************************** -* * -* Paramètres : key = line Yaml représentant la clef du futur noeud. * -* * -* Description : Construit un noeud d'arborescence Yaml. * -* * -* Retour : Instance mise en place ou NULL en cas d'échec. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlScalar *g_yaml_scalar_new(GYamlLine *key) -{ - GYamlScalar *result; /* Structure à retourner */ - - result = g_object_new(G_TYPE_YAML_SCALAR, NULL); - - /** - * Le paragraphe "3.2.2.1. Keys Order" des spécifications précise - * qu'une séquence n'est qu'un noeud sans correspondance clef/valeur. - * - * Cette situation doit donc être prise en compte. - */ - - if (key != NULL) - { - result->key = key; - g_object_ref(G_OBJECT(key)); - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : node = noeud d'arborescence Yaml à consulter. * -* * -* Description : Fournit la ligne principale associée à un noeud. * -* * -* Retour : Ligne Yaml à l'origine du noeud. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlLine *g_yaml_scalar_get_yaml_line(const GYamlScalar *node) -{ - GYamlLine *result; /* Ligne d'origine à renvoyer */ - - result = node->key; - - if (result != NULL) - g_object_ref(G_OBJECT(result)); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : node = noeud d'arborescence Yaml à compléter. * -* collec = collection de noeuds Yaml. * -* * -* Description : Attache une collection de noeuds Yaml à un noeud. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_yaml_scalar_set_collection(GYamlScalar *node, GYamlCollection *collec) -{ - g_clear_object(&node->collection); - - g_object_ref_sink(G_OBJECT(collec)); - node->collection = collec; - -} - - -/****************************************************************************** -* * -* Paramètres : node = noeud d'arborescence Yaml à consulter. * -* * -* Description : Fournit une éventuelle collection rattachée à un noeud. * -* * -* Retour : Collection de noeuds Yaml ou NULL. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlCollection *g_yaml_scalar_get_collection(const GYamlScalar *node) -{ - GYamlCollection *result; /* Collection à renvoyer */ - - result = node->collection; - - if (result != NULL) - g_object_ref(G_OBJECT(result)); - - return result; - -} - - -/****************************************************************************** -* * -* 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] * -* * -* Description : Recherche les noeuds correspondant à un chemin. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_scalar_find_by_path(const GYamlScalar *node, const char *path, bool prepare, GYamlNode ***nodes, size_t *count) -{ - GYamlLine *line; /* Ligne Yaml liée au noeud */ - const char *key; /* Clef associée au noeud */ - char *next; /* Prochaine partie du chemin */ - size_t cmplen; /* Etendue de la comparaison */ - int ret; /* Bilan d'une comparaison */ - GYamlCollection *collec; /* Collection de noeuds */ - - if (path[0] == '\0') - goto exit; - - line = g_yaml_scalar_get_yaml_line(node); - - /* Correspondance au niveau du noeud ? */ - - if (line != NULL) - { - if (path[0] == '/') - { - path++; - - if (path[0] == '\0') - goto matched; - - } - - key = g_yaml_line_get_key(line); - - next = strchr(path, '/'); - - if (next == NULL) - ret = strcmp(path, key); - - else - { - cmplen = next - path; - - if (cmplen == 0) - goto cont; - - ret = strncmp(path, key, cmplen); - - } - - if (ret != 0) - goto done; - - else if (next != NULL) - { - path += cmplen; - goto cont; - } - - matched: - - *nodes = realloc(*nodes, ++(*count) * sizeof(GYamlNode **)); - - g_object_ref(G_OBJECT(node)); - (*nodes)[*count - 1] = G_YAML_NODE(node); - - goto done; - - } - - cont: - - collec = g_yaml_scalar_get_collection(node); - - if (collec != NULL) - { - _g_yaml_node_find_by_path(G_YAML_NODE(collec), path, prepare, nodes, count); - - g_object_unref(G_OBJECT(collec)); - - } - - done: - - if (line != NULL) - g_object_unref(G_OBJECT(line)); - - exit: - - ; - -} diff --git a/plugins/yaml/scalar.h b/plugins/yaml/scalar.h deleted file mode 100644 index 5403e85..0000000 --- a/plugins/yaml/scalar.h +++ /dev/null @@ -1,72 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * scalar.h - prototypes pour un noeud Yaml de type "scalar" - * - * Copyright (C) 2019 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Chrysalide. If not, see . - */ - - -#ifndef PLUGINS_YAML_SCALAR_H -#define PLUGINS_YAML_SCALAR_H - - -#include -#include - - -#include "line.h" -#include "node.h" - - -/* Depuis collection.h : collection de noeuds au format Yaml (instance) */ -typedef struct _GYamlCollection GYamlCollection; - - -#define G_TYPE_YAML_SCALAR g_yaml_scalar_get_type() -#define G_YAML_SCALAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_YAML_SCALAR, GYamlScalar)) -#define G_IS_YAML_SCALAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_YAML_SCALAR)) -#define G_YAML_SCALAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_YAML_SCALAR, GYamlScalarClass)) -#define G_IS_YAML_SCALAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_YAML_SCALAR)) -#define G_YAML_SCALAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_YAML_SCALAR, GYamlScalarClass)) - - -/* Noeud d'une arborescence au format Yaml (instance) */ -typedef struct _GYamlScalar GYamlScalar; - -/* Noeud d'une arborescence au format Yaml (classe) */ -typedef struct _GYamlScalarClass GYamlScalarClass; - - -/* Indique le type défini pour un noeud d'arborescence Yaml. */ -GType g_yaml_scalar_get_type(void); - -/* Construit un noeud d'arborescence Yaml. */ -GYamlScalar *g_yaml_scalar_new(GYamlLine *); - -/* Fournit la ligne principale associée à un noeud. */ -GYamlLine *g_yaml_scalar_get_yaml_line(const GYamlScalar *); - -/* Attache une collection de noeuds Yaml à un noeud. */ -void g_yaml_scalar_set_collection(GYamlScalar *, GYamlCollection *); - -/* Fournit une éventuelle collection rattachée à un noeud. */ -GYamlCollection *g_yaml_scalar_get_collection(const GYamlScalar *); - - - -#endif /* PLUGINS_YAML_SCALAR_H */ diff --git a/plugins/yaml/tree.c b/plugins/yaml/tree.c deleted file mode 100644 index 9125302..0000000 --- a/plugins/yaml/tree.c +++ /dev/null @@ -1,421 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * tree.c - ligne de contenu Yaml - * - * Copyright (C) 2019-2020 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Chrysalide. If not, see . - */ - - -#include "tree.h" - - -#include -#include -#include - - -#include -#include - - -#include "pair.h" -#include "collection.h" - - - -/* Arborescence de lignes au format Yaml (instance) */ -struct _GYamlTree -{ - GObject parent; /* A laisser en premier */ - - GYamlNode *root; /* Racine des noeuds */ - -}; - -/* Arborescence de lignes au format Yaml (classe) */ -struct _GYamlTreeClass -{ - GObjectClass parent; /* A laisser en premier */ - -}; - - -/* Initialise la classe des arborescence de lignes Yaml. */ -static void g_yaml_tree_class_init(GYamlTreeClass *); - -/* Initialise une instance d'arborescence de lignes Yaml. */ -static void g_yaml_tree_init(GYamlTree *); - -/* Supprime toutes les références externes. */ -static void g_yaml_tree_dispose(GYamlTree *); - -/* Procède à la libération totale de la mémoire. */ -static void g_yaml_tree_finalize(GYamlTree *); - -/* Construit une collection de noeuds avec une arborescence. */ -static bool g_yaml_tree_build_node(GYamlCollection *, GYamlLine **, size_t, size_t, size_t *); - - - -/* Indique le type défini pour une arborescence de lignes au format Yaml. */ -G_DEFINE_TYPE(GYamlTree, g_yaml_tree, G_TYPE_OBJECT); - - -/****************************************************************************** -* * -* Paramètres : klass = classe à initialiser. * -* * -* Description : Initialise la classe des arborescence de lignes Yaml. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_tree_class_init(GYamlTreeClass *klass) -{ - GObjectClass *object; /* Autre version de la classe */ - - object = G_OBJECT_CLASS(klass); - - object->dispose = (GObjectFinalizeFunc/* ! */)g_yaml_tree_dispose; - object->finalize = (GObjectFinalizeFunc)g_yaml_tree_finalize; - -} - - -/****************************************************************************** -* * -* Paramètres : tree = instance à initialiser. * -* * -* Description : Initialise une instance d'arborescence de lignes Yaml. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_tree_init(GYamlTree *tree) -{ - tree->root = NULL; - -} - - -/****************************************************************************** -* * -* Paramètres : tree = instance d'objet GLib à traiter. * -* * -* Description : Supprime toutes les références externes. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_tree_dispose(GYamlTree *tree) -{ - g_clear_object(&tree->root); - - G_OBJECT_CLASS(g_yaml_tree_parent_class)->dispose(G_OBJECT(tree)); - -} - - -/****************************************************************************** -* * -* Paramètres : tree = instance d'objet GLib à traiter. * -* * -* Description : Procède à la libération totale de la mémoire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_yaml_tree_finalize(GYamlTree *tree) -{ - G_OBJECT_CLASS(g_yaml_tree_parent_class)->finalize(G_OBJECT(tree)); - -} - - -/****************************************************************************** -* * -* Paramètres : lines = ensemble de lignes à constituer en arborescence. * -* count = taille de cet ensemble de lignes. * -* * -* Description : Construit une arborescence à partir de lignes Yaml. * -* * -* Retour : Instance mise en place ou NULL en cas d'échec. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlTree *g_yaml_tree_new(GYamlLine **lines, size_t count) -{ - GYamlTree *result; /* Structure à retourner */ - GYamlCollection *collec; /* Collection de noeuds */ - size_t indent; /* Indentation initiale */ - size_t processed; /* Quantité de noeuds traités */ - bool status; /* Bilan de construction */ - - result = g_object_new(G_TYPE_YAML_TREE, NULL); - - if (count > 0) - { - collec = g_yaml_collection_new(g_yaml_line_is_list_item(lines[0])); - - result->root = G_YAML_NODE(collec); - - indent = g_yaml_line_count_indent(lines[0]); - processed = 0; - - status = g_yaml_tree_build_node(collec, lines, count, indent, &processed); - - if (status) - assert(processed == count); - - else - { - g_object_unref(G_OBJECT(result)); - result = NULL; - } - - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : lines = ensemble de lignes à constituer en arborescence. * -* count = taille de cet ensemble de lignes. * -* expected = niveau d'identation attendu. * -* cur = position courante dans les lignes. [OUT] * -* * -* Description : Construit une collection de noeuds avec une arborescence. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static bool g_yaml_tree_build_node(GYamlCollection *collec, GYamlLine **lines, size_t count, size_t expected, size_t *cur) -{ - bool result; /* Bilan à retourner */ - bool first; /* Marque d'un premier élément */ - GYamlNode *last; /* Mémorisation du dernier */ - GYamlLine *line; /* Ligne de parcours courante */ - size_t indent; /* Indentation de ligne */ - bool is_item; /* Elément d'une liste ? */ - GYamlCollection *sub; /* Nouvelle sous-collection */ - - result = true; - - first = true; - last = NULL; - - for (; *cur < count; ) - { - line = lines[*cur]; - - indent = g_yaml_line_count_indent(line); - is_item = g_yaml_line_is_list_item(line); - - /** - * Si la première ligne traitée commence par un élément de liste, - * alors un appel parent a constitué une collection qui n'est pas une séquence. - * - * L'objectif est de créer une simple association de 'clefs: valeurs'. - * - * Si la collection n'est pas adaptée, alors le parcours n'est pas encore - * arrivé à ce stade de construction. - */ - if (first && is_item && !g_yaml_collection_is_sequence(collec)) - { - indent += 2; /* 2 == strlen("- ") */ - is_item = false; - } - - first = false; - - /* Fin de l'ensemble courant */ - if (indent < expected) - goto done; - - /* Début d'un sous-ensemble */ - else if (indent > expected) - { - if (last == NULL) - { - result = false; - goto done; - } - - sub = g_yaml_collection_new(is_item); - g_yaml_pair_set_collection(G_YAML_PAIR(last), sub); - - result = g_yaml_tree_build_node(sub, lines, count, indent, cur); - if (!result) goto done; - - } - - /* Elément de même niveau */ - else - { - if (is_item) - { - /* Vérification de cohérence */ - if (!g_yaml_collection_is_sequence(collec)) - { - log_variadic_message(LMT_BAD_BINARY, _("A list item was expected at line %zu"), - g_yaml_line_get_number(line)); - - result = false; - goto done; - - } - - sub = g_yaml_collection_new(false); - g_yaml_collection_add_node(collec, G_YAML_NODE(sub)); - - result = g_yaml_tree_build_node(sub, lines, count, expected + 2 /* 2 == strlen("- ") */, cur); - if (!result) goto done; - - } - - else - { - /* Vérification de cohérence */ - if (g_yaml_collection_is_sequence(collec)) - { - log_variadic_message(LMT_BAD_BINARY, _("A mapping item was expected at line %zu"), - g_yaml_line_get_number(line)); - - - result = false; - goto done; - - } - - last = G_YAML_NODE(g_yaml_pair_new(line)); - - if (last == NULL) - { - result = false; - goto done; - } - - g_yaml_collection_add_node(collec, last); - - (*cur)++; - - } - - } - - } - - done: - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : tree = ligne au format Yaml à consulter. * -* * -* Description : Fournit le noeud constituant la racine d'arborescence Yaml. * -* * -* Retour : Noeud constituant la racine de l'arborescence. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlNode *g_yaml_tree_get_root(const GYamlTree *tree) -{ - GYamlNode *result; /* Liste à retourner */ - - result = tree->root; - - if (result != NULL) - g_object_ref(G_OBJECT(result)); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : tree = ligne au format 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] * -* * -* Description : Recherche les noeuds correspondant à un chemin. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_yaml_tree_find_by_path(const GYamlTree *tree, const char *path, bool prepare, GYamlNode ***nodes, size_t *count) -{ - g_yaml_node_find_by_path(tree->root, path, prepare, nodes, count); - -} - - -/****************************************************************************** -* * -* Paramètres : tree = ligne au format Yaml à consulter. * -* path = chemin d'accès à parcourir. * -* prepare = indication sur une préparation d'un prochain appel.* -* * -* Description : Recherche l'unique noeud correspondant à un chemin. * -* * -* Retour : Noeud avec correspondance établie ou NULL. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GYamlNode *g_yaml_tree_find_one_by_path(GYamlTree *tree, const char *path, bool prepare) -{ - GYamlNode *result; /* Trouvaille unique à renvoyer*/ - - result = g_yaml_node_find_one_by_path(tree->root, path, prepare); - - return result; - -} diff --git a/plugins/yaml/tree.h b/plugins/yaml/tree.h deleted file mode 100644 index bfe034a..0000000 --- a/plugins/yaml/tree.h +++ /dev/null @@ -1,69 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * tree.h - prototypes pour une ligne de contenu Yaml - * - * Copyright (C) 2019 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Chrysalide. If not, see . - */ - - -#ifndef PLUGINS_YAML_TREE_H -#define PLUGINS_YAML_TREE_H - - -#include -#include - - -#include "line.h" -#include "node.h" - - - -#define G_TYPE_YAML_TREE g_yaml_tree_get_type() -#define G_YAML_TREE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_YAML_TREE, GYamlTree)) -#define G_IS_YAML_TREE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_YAML_TREE)) -#define G_YAML_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_YAML_TREE, GYamlTreeClass)) -#define G_IS_YAML_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_YAML_TREE)) -#define G_YAML_TREE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_YAML_TREE, GYamlTreeClass)) - - -/* Arborescence de lignes au format Yaml (instance) */ -typedef struct _GYamlTree GYamlTree; - -/* Arborescence de lignes au format Yaml (classe) */ -typedef struct _GYamlTreeClass GYamlTreeClass; - - -/* Indique le type défini pour une arborescence de lignes au format Yaml. */ -GType g_yaml_tree_get_type(void); - -/* Construit une arborescence à partir de lignes Yaml. */ -GYamlTree *g_yaml_tree_new(GYamlLine **, size_t); - -/* Fournit le noeud constituant la racine d'arborescence Yaml. */ -GYamlNode *g_yaml_tree_get_root(const GYamlTree *); - -/* Recherche les noeuds correspondant à un chemin. */ -void g_yaml_tree_find_by_path(const GYamlTree *, const char *, bool, GYamlNode ***, size_t *); - -/* Recherche l'unique noeud correspondant à un chemin. */ -GYamlNode *g_yaml_tree_find_one_by_path(GYamlTree *, const char *, bool); - - - -#endif /* PLUGINS_YAML_TREE_H */ diff --git a/tests/plugins/yaml.py b/tests/plugins/yaml.py new file mode 100644 index 0000000..2fbb0bd --- /dev/null +++ b/tests/plugins/yaml.py @@ -0,0 +1,148 @@ +#!/usr/bin/python3-dbg +# -*- coding: utf-8 -*- + + +from chrysacase import ChrysalideTestCase +from pychrysalide.plugins import yaml + + +class TestYamlSupport(ChrysalideTestCase): + """TestCase for the YAML support.""" + + + def testParseSimpleYamlContent(self): + """Parse basic YAML content.""" + + definitions = ''' +a: av +b: bv +c: cv +''' + + root = yaml.parse_from_text(definitions) + + self.assertFalse(root.is_sequence) + + self.assertEqual(root.nodes[0].key, 'a') + self.assertEqual(root.nodes[1].key, 'b') + self.assertEqual(root.nodes[2].key, 'c') + + self.assertEqual(root.nodes[0].value, 'av') + self.assertEqual(root.nodes[1].value, 'bv') + self.assertEqual(root.nodes[2].value, 'cv') + + definitions = ''' +- a: av +- b: bv +- c: cv +''' + + root = yaml.parse_from_text(definitions) + + self.assertTrue(root.is_sequence) + + self.assertEqual(root.nodes[0].nodes[0].key, 'a') + self.assertEqual(root.nodes[1].nodes[0].key, 'b') + self.assertEqual(root.nodes[2].nodes[0].key, 'c') + + self.assertEqual(root.nodes[0].nodes[0].value, 'av') + self.assertEqual(root.nodes[1].nodes[0].value, 'bv') + self.assertEqual(root.nodes[2].nodes[0].value, 'cv') + + + def testSearchYamlNodes(self): + """Search YAML nodes related to paths.""" + + definitions = ''' +root: + a: v0 + b: v1 + c: v2 + sub: + aa: v00 + bb: v01 + cc: + - i: w + - j: x + - k: c + d: v3 +''' + + root = yaml.parse_from_text(definitions) + + found = root.find_first_by_path('/root/a') + + self.assertEqual(found.value, 'v0') + + found = root.find_first_by_path('/root/sub') + + self.assertEqual(found.value, None) + + found = root.find_first_by_path('/root/sub/cc') + + self.assertEqual(found.value, None) + + found = root.find_first_by_path('/root/sub/cc/j') + + self.assertEqual(found.value, 'x') + + found = root.find_first_by_path('/root/d') + + self.assertEqual(found.value, 'v3') + + + definitions = ''' +root: + - a: av + aa: aav + ab: abv + - b: bv + ba: bav + bb: bbv +''' + + root = yaml.parse_from_text(definitions) + + found = root.find_first_by_path('/root/ba') + + self.assertEqual(found.value, 'bav') + + found = root.find_first_by_path('/root/b') + + self.assertEqual(found.value, 'bv') + + found = root.find_first_by_path('/root/') + + self.assertTrue(found.is_sequence) + self.assertFalse(found.nodes[0].is_sequence) + self.assertEqual(found.nodes[0].nodes[0].value, 'av') + + + def testComplexYamlContent(self): + """Process more complex YAML content.""" + + definitions = ''' +root: + a: 'v0' + b: 'v1 ? 1 : 2' + c: v2 # final comment + d: "'xx::xx'" +''' + + root = yaml.parse_from_text(definitions) + + found = root.find_first_by_path('/root/a') + + self.assertEqual(found.value, 'v0') + + found = root.find_first_by_path('/root/b') + + self.assertEqual(found.value, 'v1 ? 1 : 2') + + found = root.find_first_by_path('/root/c') + + self.assertEqual(found.value, 'v2') + + found = root.find_first_by_path('/root/d') + + self.assertEqual(found.value, "'xx::xx'") diff --git a/tests/plugins/yamlrdr.py b/tests/plugins/yamlrdr.py deleted file mode 100644 index dbd9651..0000000 --- a/tests/plugins/yamlrdr.py +++ /dev/null @@ -1,261 +0,0 @@ -#!/usr/bin/python3-dbg -# -*- coding: utf-8 -*- - - -from chrysacase import ChrysalideTestCase -from pychrysalide.plugins.yaml import YamlReader - - -class TestYamlReader(ChrysalideTestCase): - """TestCase for the Yaml reader.""" - - - @classmethod - def setUpClass(cls): - - super(TestYamlReader, cls).setUpClass() - - cls._simple_map_data = ''' -a: av -b: bv -c: cv - -''' - - cls._simple_seq_data = ''' -- a: av -- b: bv -- c: cv - -''' - - cls._nested_data = ''' -root: - a: v0 - b: v1 - c: v2 - sub: - aa: v00 - bb: v01 - cc: v02 - - i: w - - j: x - - k: c - d: v3 - -''' - - cls._mixed_data = ''' -root: - - a: av - aa: aav - ab: abv - - b: bv - ba: bav - bb: bbv - -''' - - - def testSimpleYamlContent(self): - """Validate Yaml content readers.""" - - def _build_node_desc(node, left, extra = ''): - - if hasattr(node, 'key'): - - line = node.yaml_line - - prefix = '- ' if line.is_list_item else extra - desc = left + prefix + line.key + ':' + (' ' + line.value if line.value else '') + '\n' - indent = ' ' - - collec = node.collection - - else: - - desc = '' - indent = '' - - if hasattr(node, 'nodes'): - collec = node - - if collec: - - if collec.is_sequence: - extra = ' ' - - for child in collec.nodes: - desc += _build_node_desc(child, left + indent, extra) - - return desc - - - reader = YamlReader(text=self._simple_map_data) - self.assertIsNotNone(reader) - self.assertIsNotNone(reader.tree) - - fulldesc = _build_node_desc(reader.tree.root, '') - - self.assertEqual('\n' + fulldesc + '\n', self._simple_map_data) - - reader = YamlReader(text=self._simple_seq_data) - self.assertIsNotNone(reader) - self.assertIsNotNone(reader.tree) - - fulldesc = _build_node_desc(reader.tree.root, '') - - self.assertEqual('\n' + fulldesc + '\n', self._simple_seq_data) - - reader = YamlReader(text=self._nested_data) - self.assertIsNotNone(reader) - self.assertIsNotNone(reader.tree) - - fulldesc = _build_node_desc(reader.tree.root, '') - - self.assertEqual('\n' + fulldesc + '\n', self._nested_data) - - reader = YamlReader(text=self._mixed_data) - self.assertIsNotNone(reader) - self.assertIsNotNone(reader.tree) - - fulldesc = _build_node_desc(reader.tree.root, '') - - self.assertEqual('\n' + fulldesc + '\n', self._mixed_data) - - - def testSimpleYamlContentFinder(self): - """Validate Yaml nested content search.""" - - reader = YamlReader(text=self._nested_data) - self.assertIsNotNone(reader) - - found = reader.tree.find_by_path('/root/sub') - - self.assertEqual(len(found), 1) - - if len(found) == 1: - self.assertEqual(found[0].key, 'sub') - - found = reader.tree.find_by_path('/root/sub/') - - self.assertEqual(len(found), 3) - - found = reader.tree.find_by_path('/root/sub/xx') - - self.assertEqual(len(found), 0) - - found = reader.tree.find_by_path('/root/sub/cc/i') - - self.assertEqual(len(found), 1) - - if len(found) == 1: - self.assertEqual(found[0].key, 'i') - self.assertEqual(found[0].yaml_line.is_list_item, True) - - found = reader.tree.find_by_path('/root/sub/cc') - - self.assertEqual(len(found), 1) - - if len(found) == 1: - - root = found[0] - - found = root.find_by_path('cc/i') - - self.assertEqual(len(found), 1) - - if len(found) == 1: - - self.assertEqual(found[0].key, 'i') - self.assertEqual(found[0].yaml_line.is_list_item, True) - - found = root.find_by_path('/cc/i') - - self.assertEqual(len(found), 1) - - if len(found) == 1: - - self.assertEqual(found[0].key, 'i') - self.assertEqual(found[0].yaml_line.is_list_item, True) - - found = root.find_by_path('//i') - - self.assertEqual(len(found), 1) - - if len(found) == 1: - - self.assertEqual(found[0].key, 'i') - self.assertEqual(found[0].yaml_line.is_list_item, True) - - - def testMixedYamlContentFinder(self): - """Validate Yaml mixed content search.""" - - reader = YamlReader(text=self._mixed_data) - self.assertIsNotNone(reader) - - found = reader.tree.find_by_path('/root') - - self.assertEqual(len(found), 1) - - if len(found) == 1: - self.assertEqual(found[0].key, 'root') - - found = reader.tree.find_by_path('/root/', True) - - self.assertEqual(len(found), 1) - - found = reader.tree.find_one_by_path('/root/', True) - - self.assertIsNotNone(found) - - if found: - - sub = found.find_one_by_path('/a') - self.assertIsNotNone(sub) - self.assertEqual(sub.key, 'a') - - sub = found.find_one_by_path('/aa') - self.assertIsNotNone(sub) - self.assertEqual(sub.key, 'aa') - - found = reader.tree.find_by_path('/root/') - - self.assertEqual(len(found), 2) - - if len(found) == 2: - - sub = found[0].find_one_by_path('/a') - self.assertIsNotNone(sub) - self.assertEqual(sub.key, 'a') - - sub = found[0].find_one_by_path('/aa') - self.assertIsNotNone(sub) - self.assertEqual(sub.key, 'aa') - - - def testItemsWithoutValue(self): - """Find items without values.""" - - from pychrysalide import core - core.set_verbosity(5) - - data = ''' -vals: - - 1 - - 2 - - 3 - -''' - - reader = YamlReader(text=data) - self.assertIsNotNone(reader) - - found = reader.tree.find_by_path('/vals/') - - self.assertEqual(len(found), 3) - - self.assertEqual(found[0].nodes[0].key, '1') - self.assertEqual(found[1].nodes[0].key, '2') - self.assertEqual(found[2].nodes[0].key, '3') -- cgit v0.11.2-87-g4458