summaryrefslogtreecommitdiff
path: root/plugins/yaml/reader.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2023-02-04 16:36:10 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2023-02-04 16:36:10 (GMT)
commite85f35454bf94b7414dd9d2f5e6609601951293c (patch)
treef8cf3afe5b2ed34949878552b663d4b037e16238 /plugins/yaml/reader.c
parentdb3b204dd7a71b2f74a4e69b2159a96e3ab66614 (diff)
Provide constructor to load Yaml contents without external files.
Diffstat (limited to 'plugins/yaml/reader.c')
-rw-r--r--plugins/yaml/reader.c171
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;
}