diff options
Diffstat (limited to 'plugins/yaml/reader.c')
-rw-r--r-- | plugins/yaml/reader.c | 171 |
1 files changed, 86 insertions, 85 deletions
diff --git a/plugins/yaml/reader.c b/plugins/yaml/reader.c index eebc02b..665e811 100644 --- a/plugins/yaml/reader.c +++ b/plugins/yaml/reader.c @@ -29,28 +29,12 @@ #include <gio/gio.h> -#include "line.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 */ +#include <analysis/contents/file.h> - GYamlTree *tree; /* Arborescence constituée */ -}; - -/* Lecteur de contenu Yaml (classe) */ -struct _GYamlReaderClass -{ - GObjectClass parent; /* A laisser en premier */ +#include "line.h" +#include "reader-int.h" -}; /* Initialise la classe des lecteurs de contenus Yaml. */ @@ -167,8 +151,7 @@ static void g_yaml_reader_finalize(GYamlReader *reader) /****************************************************************************** * * -* Paramètres : content = données brutes au format Yaml à charger. * -* length = quantité de ces données. * +* Paramètres : text = définitions textuelles d'un contenu brut. * * * * Description : Crée un lecteur pour contenu au format Yaml. * * * @@ -178,39 +161,64 @@ static void g_yaml_reader_finalize(GYamlReader *reader) * * ******************************************************************************/ -GYamlReader *g_yaml_reader_new_from_content(const char *content, size_t length) +GYamlReader *g_yaml_reader_new_from_text(const char *text) { GYamlReader *result; /* Structure à retourner */ - char *dumped; /* Contenu manipulable */ - char *saved; /* Sauvegarde de position */ - char *iter; /* Boucle de parcours */ - size_t number; /* Indice de ligne courante */ - GYamlLine *line; /* Nouvelle ligne Yaml */ result = g_object_new(G_TYPE_YAML_READER, NULL); - dumped = malloc(length * sizeof(char)); + if (!g_yaml_reader_create_from_text(result, text)) + g_clear_object(&result); - memcpy(dumped, content, length); + 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 */ - for (iter = dumped, saved = strchr(iter, '\n'), number = 0; + result = false; + + for (iter = text, saved = strchr(iter, '\n'), number = 0; *iter != '\0'; iter = ++saved, saved = strchr(iter, '\n'), number++) { - if (saved != NULL) - *saved = '\0'; + if (saved == NULL) + rlen = strlen(iter); + else + rlen = saved - iter; - if (*iter != '\0') + if (rlen > 0) { - line = g_yaml_line_new(iter, number); + line = g_yaml_line_new(iter, rlen, number); if (line == NULL) goto format_error; - result->lines = realloc(result->lines, ++result->count * sizeof(GYamlLine *)); + reader->lines = realloc(reader->lines, ++reader->count * sizeof(GYamlLine *)); g_object_ref_sink(G_OBJECT(line)); - result->lines[result->count - 1] = line; + reader->lines[reader->count - 1] = line; } @@ -219,24 +227,20 @@ GYamlReader *g_yaml_reader_new_from_content(const char *content, size_t length) } - free(dumped); + reader->tree = g_yaml_tree_new(reader->lines, reader->count); - result->tree = g_yaml_tree_new(result->lines, result->count); - - return result; + result = (reader->tree != NULL); format_error: - g_object_unref(G_OBJECT(result)); - - return NULL; + return result; } /****************************************************************************** * * -* Paramètres : path = chemin d'accès à un contenu à charger. * +* Paramètres : filename = chemin vers des définitions de règles. * * * * Description : Crée un lecteur pour contenu au format Yaml. * * * @@ -246,68 +250,65 @@ GYamlReader *g_yaml_reader_new_from_content(const char *content, size_t length) * * ******************************************************************************/ -GYamlReader *g_yaml_reader_new_from_path(const char *path) +GYamlReader *g_yaml_reader_new_from_file(const char *filename) { GYamlReader *result; /* Structure à retourner */ - char *scheme; /* Préfixe d'URI identifié */ - GFile *file; /* Accès au contenu visé */ - GFileInputStream *stream; /* Flux ouvert en lecture */ - GFileInfo *info; /* Informations du flux */ - size_t length; /* Quantité d'octets présents */ - char *content; /* Données obtenues par lecture*/ - result = NULL; - - /* Ouverture du fichier */ - - scheme = g_uri_parse_scheme(path); - - if (scheme != NULL) - { - g_free(scheme); - file = g_file_new_for_uri(path); - } - - else - file = g_file_new_for_path(path); + result = g_object_new(G_TYPE_YAML_READER, NULL); - stream = g_file_read(file, NULL, NULL); + if (!g_yaml_reader_create_from_file(result, filename)) + g_clear_object(&result); - if (stream == NULL) - goto no_content; + return result; - /* Détermination de sa taille */ +} - info = g_file_input_stream_query_info(stream, G_FILE_ATTRIBUTE_STANDARD_SIZE, NULL, NULL); - if (info == NULL) - goto no_size_info; +/****************************************************************************** +* * +* 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 : - * +* * +******************************************************************************/ - length = g_file_info_get_size(info); +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 */ - /* Lecture des données */ + result = false; - content = malloc(length + 1 * sizeof(char)); + content = g_file_content_new(filename); + if (content == NULL) goto no_content; - if (!g_input_stream_read_all(G_INPUT_STREAM(stream), content, length, (gsize []) { 0 }, NULL, NULL)) - goto read_error; + size = g_binary_content_compute_size(content); - content[length] = '\0'; + g_binary_content_compute_start_pos(content, &start); + data = g_binary_content_get_raw_access(content, &start, size); - result = g_yaml_reader_new_from_content(content, length + 1); + dumped = malloc((size + 1) * sizeof(char)); - read_error: + memcpy(dumped, data, size); + dumped[size] = '\0'; - free(content); + result = g_yaml_reader_create_from_text(reader, dumped); - no_size_info: + free(dumped); - g_object_unref(G_OBJECT(stream)); + g_object_unref(G_OBJECT(content)); no_content: - g_object_unref(G_OBJECT(file)); - return result; } |