summaryrefslogtreecommitdiff
path: root/plugins/yaml/pair.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2023-05-07 09:10:31 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2023-05-07 09:10:31 (GMT)
commit9e4480706b28abc41618bd598c00a194beb14c4f (patch)
tree15fc4fc623407863f0ecdec5ca97a4cac63f8ad2 /plugins/yaml/pair.c
parent25bac01127581767639a5bd9024c41eb803388fa (diff)
Aggregate YAML values from sequences when requested and possible.
Diffstat (limited to 'plugins/yaml/pair.c')
-rw-r--r--plugins/yaml/pair.c176
1 files changed, 168 insertions, 8 deletions
diff --git a/plugins/yaml/pair.c b/plugins/yaml/pair.c
index 1057a68..4faba88 100644
--- a/plugins/yaml/pair.c
+++ b/plugins/yaml/pair.c
@@ -29,6 +29,9 @@
#include <string.h>
+#include <common/extstr.h>
+
+
#include "pair-int.h"
@@ -111,7 +114,10 @@ static void g_yaml_pair_class_init(GYamlPairClass *klass)
static void g_yaml_pair_init(GYamlPair *pair)
{
pair->key = NULL;
+ pair->key_style = YOS_PLAIN;
+
pair->value = NULL;
+ pair->value_style = YOS_PLAIN;
pair->children = NULL;
@@ -166,8 +172,10 @@ static void g_yaml_pair_finalize(GYamlPair *pair)
/******************************************************************************
* *
-* Paramètres : key = désignation pour le noeud YAML. *
-* value = éventuelle valeur directe portée par le noeud. *
+* Paramètres : key = désignation pour le noeud YAML. *
+* kstyle = format d'origine de la clef. *
+* value = éventuelle valeur directe portée par le noeud. *
+* vstyle = éventuel format d'origine de l'éventuelle valeur. *
* *
* Description : Construit un noeud d'arborescence YAML. *
* *
@@ -177,13 +185,13 @@ static void g_yaml_pair_finalize(GYamlPair *pair)
* *
******************************************************************************/
-GYamlPair *g_yaml_pair_new(const char *key, const char *value)
+GYamlPair *g_yaml_pair_new(const char *key, YamlOriginalStyle kstyle, const char *value, YamlOriginalStyle vstyle)
{
GYamlPair *result; /* Structure à retourner */
result = g_object_new(G_TYPE_YAML_PAIR, NULL);
- if (!g_yaml_pair_create(result, key, value))
+ if (!g_yaml_pair_create(result, key, kstyle, value, vstyle))
g_clear_object(&result);
return result;
@@ -193,9 +201,11 @@ GYamlPair *g_yaml_pair_new(const char *key, const char *value)
/******************************************************************************
* *
-* Paramètres : pair = paire YAML à initialiser pleinement. *
-* key = désignation pour le noeud YAML. *
-* value = éventuelle valeur directe portée par le noeud. *
+* Paramètres : pair = paire YAML à initialiser pleinement. *
+* key = désignation pour le noeud YAML. *
+* kstyle = format d'origine de la clef. *
+* value = éventuelle valeur directe portée par le noeud. *
+* vstyle = éventuel format d'origine de l'éventuelle valeur. *
* *
* Description : Met en place une pair clef/valeur YAML. *
* *
@@ -205,16 +215,20 @@ GYamlPair *g_yaml_pair_new(const char *key, const char *value)
* *
******************************************************************************/
-bool g_yaml_pair_create(GYamlPair *pair, const char *key, const char *value)
+bool g_yaml_pair_create(GYamlPair *pair, const char *key, YamlOriginalStyle kstyle, const char *value, YamlOriginalStyle vstyle)
{
bool result; /* Bilan à retourner */
result = true;
pair->key = strdup(key);
+ pair->key_style = kstyle;
if (value != NULL)
+ {
pair->value = strdup(value);
+ pair->value_style = vstyle;
+ }
return result;
@@ -248,6 +262,29 @@ const char *g_yaml_pair_get_key(const GYamlPair *pair)
* *
* Paramètres : pair = noeud d'arborescence YAML à consulter. *
* *
+* Description : Indique le format d'origine YAML associé à la clef. *
+* *
+* Retour : Valeur renseignée lors du chargement du noeud. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+YamlOriginalStyle g_yaml_pair_get_key_style(const GYamlPair *pair)
+{
+ YamlOriginalStyle result; /* Indication à retourner */
+
+ result = pair->key_style;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : pair = noeud d'arborescence YAML à consulter. *
+* *
* Description : Fournit l'éventuelle valeur d'une paire en YAML. *
* *
* Retour : Valeur sous forme de chaîne de caractères ou NULL. *
@@ -269,6 +306,129 @@ const char *g_yaml_pair_get_value(const GYamlPair *pair)
/******************************************************************************
* *
+* Paramètres : pair = noeud d'arborescence YAML à consulter. *
+* *
+* Description : Indique le format d'origine YAML associé à la valeur. *
+* *
+* Retour : Valeur renseignée lors du chargement du noeud. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+YamlOriginalStyle g_yaml_pair_get_value_style(const GYamlPair *pair)
+{
+ YamlOriginalStyle result; /* Indication à retourner */
+
+ result = pair->value_style;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : pair = noeud d'arborescence YAML à consulter. *
+* *
+* Description : Rassemble une éventuelle séquence de valeurs attachées. *
+* *
+* Retour : Valeur sous forme de chaîne de caractères ou NULL. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char *g_yaml_pair_aggregate_value(const GYamlPair *pair)
+{
+ char *result; /* Valeur à retourner */
+ GYamlNode **nodes; /* Eventuels noeuds trouvés */
+ size_t count; /* Quantité de ces noeuds */
+ size_t i; /* Boucle de parcours */
+ GYamlPair *child; /* Couple clef/valeur enfant */
+ bool failed; /* Détection d'un échec */
+
+ result = NULL;
+
+ if (pair->value != NULL)
+ result = strdup(pair->value);
+
+ else if (pair->children != NULL)
+ {
+ if (!g_yaml_collection_is_sequence(pair->children))
+ goto exit;
+
+ nodes = g_yaml_collection_get_nodes(pair->children, &count);
+
+ if (count == 0)
+ result = strdup("[ ]");
+
+ else
+ {
+ result = strdup("[ ");
+
+ for (i = 0; i < count; i++)
+ {
+ if (!G_IS_YAML_PAIR(nodes[i]))
+ break;
+
+ child = G_YAML_PAIR(nodes[i]);
+
+ if (child->value != NULL)
+ break;
+
+ if (i > 0)
+ result = stradd(result, ", ");
+
+ switch (child->key_style)
+ {
+ case YOS_PLAIN:
+ result = stradd(result, child->key);
+ break;
+
+ case YOS_SINGLE_QUOTED:
+ result = straddfmt(result, "'%s'", child->key);
+ break;
+
+ case YOS_DOUBLE_QUOTED:
+ result = straddfmt(result, "\"%s\"", child->key);
+ break;
+
+ }
+
+ g_object_unref(G_OBJECT(nodes[i]));
+
+ }
+
+ failed = (i < count);
+
+ for (; i < count; i++)
+ g_object_unref(G_OBJECT(nodes[i]));
+
+ free(nodes);
+
+ if (failed)
+ {
+ free(result);
+ result = NULL;
+ }
+
+ else
+ result = stradd(result, " ]");
+
+ }
+
+ }
+
+ exit:
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : pair = noeud d'arborescence YAML à compléter. *
* children = collection de noeuds YAML. *
* *