diff options
Diffstat (limited to 'plugins/yaml/pair.c')
-rw-r--r-- | plugins/yaml/pair.c | 176 |
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. * * * |