diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2024-08-25 17:03:08 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2024-08-25 17:03:08 (GMT) |
commit | a0532508524a37444d15b878c5e494cd348b0cae (patch) | |
tree | 8b3d06e52123e953cd937501a7ea5d0d46461a6e /src/common | |
parent | 41dcf8a45d61108fef1f545ecdee5d79d8135089 (diff) |
Include support for the JSON format.
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/Makefile.am | 3 | ||||
-rw-r--r-- | src/common/json.c | 203 | ||||
-rw-r--r-- | src/common/json.h | 44 |
3 files changed, 249 insertions, 1 deletions
diff --git a/src/common/Makefile.am b/src/common/Makefile.am index 24929e7..7f0fe4e 100644 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -56,6 +56,7 @@ libcommon4_la_SOURCES = \ extstr.h extstr.c \ fnv1a.h fnv1a.c \ io.h io.c \ + json.h json.c \ leb128.h leb128.c \ macros.h \ packed.h packed.c \ @@ -72,7 +73,7 @@ libcommon4_la_SOURCES += \ endif -libcommon4_la_CFLAGS = $(TOOLKIT_CFLAGS) $(LIBSSL_CFLAGS) +libcommon4_la_CFLAGS = $(TOOLKIT_CFLAGS) $(LIBSSL_CFLAGS) $(LIBJSONGLIB_CFLAGS) if BUILD_CURL_SUPPORT diff --git a/src/common/json.c b/src/common/json.c new file mode 100644 index 0000000..cb64822 --- /dev/null +++ b/src/common/json.c @@ -0,0 +1,203 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * json.c - manipulations génériques de données au format JSON + * + * Copyright (C) 2024 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 <http://www.gnu.org/licenses/>. + */ + + +#include "json.h" + + +#include <assert.h> + + + +/****************************************************************************** +* * +* Paramètres : root = racine d'une arborescence JSON chargée. * +* query = chemin XPath d'une requête à mener. * +* error = description d'une éventuelle erreur rencontrée. [OUT]* +* * +* Description : Détermine la présence d'un élément avec une valeur textuelle.* +* * +* Retour : true si le noeud existe et porte une chaîne comme valeur. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool has_json_string_value(JsonNode *root, const char *xpath, GError **error) +{ + bool result; /* Bilan à retourner */ + JsonNode *found; /* Accès direct aux trouvailles*/ + JsonArray *array; /* Liste des résultats */ + guint count; /* Taille de la liste */ + JsonNode *node; /* Noeud portant la cible */ + GValue value; /* Valeur correspondante */ + + result = false; + + *error = NULL; + found = json_path_query(xpath, root, error); + + if (found != NULL) + { + assert(*error == NULL); + + array = json_node_get_array(found); + + count = json_array_get_length(array); + + if (count == 1) + { + node = json_array_get_element(array, 0); + + memset(&value, 0, sizeof(GValue)); + json_node_get_value(node, &value); + + if (G_VALUE_HOLDS(&value, G_TYPE_STRING)) + result = true; + + } + + json_node_unref(found); + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : root = racine d'une arborescence JSON chargée. * +* query = chemin XPath d'une requête à mener. * +* error = description d'une éventuelle erreur rencontrée. [OUT]* +* * +* Description : Fournit le contenu d'un élément avec une valeur textuelle. * +* * +* Retour : Valeur trouvée ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +char *get_json_string_value(JsonNode *root, const char *xpath, GError **error) +{ + char *result; /* Valeur à retourner */ + JsonNode *found; /* Accès direct aux trouvailles*/ + JsonArray *array; /* Liste des résultats */ + guint count; /* Taille de la liste */ + JsonNode *node; /* Noeud portant la cible */ + GValue value; /* Valeur correspondante */ + const gchar *raw; /* Valeur brute présente */ + + result = NULL; + + *error = NULL; + found = json_path_query(xpath, root, error); + + if (found != NULL) + { + assert(*error == NULL); + + array = json_node_get_array(found); + + count = json_array_get_length(array); + + if (count == 1) + { + node = json_array_get_element(array, 0); + + memset(&value, 0, sizeof(GValue)); + json_node_get_value(node, &value); + + if (G_VALUE_HOLDS(&value, G_TYPE_STRING)) + { + raw = json_array_get_string_element(array, 0); + result = strdup(raw); + } + + } + + json_node_unref(found); + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : root = racine d'une arborescence JSON chargée. * +* query = chemin XPath d'une requête à mener. * +* error = description d'une éventuelle erreur rencontrée. [OUT]* +* * +* Description : Fournit le contenu d'un élément avec une valeur entière. * +* * +* Retour : Valeur trouvée ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +long long get_json_integer_value(JsonNode *root, const char *xpath, GError **error) +{ + long long result; /* Valeur à retourner */ + JsonNode *found; /* Accès direct aux trouvailles*/ + JsonArray *array; /* Liste des résultats */ + guint count; /* Taille de la liste */ + JsonNode *node; /* Noeud portant la cible */ + GValue value; /* Valeur correspondante */ + + result = 0xffffffffffffffffll; + + *error = NULL; + found = json_path_query(xpath, root, error); + + if (found != NULL) + { + assert(*error == NULL); + + array = json_node_get_array(found); + + count = json_array_get_length(array); + + if (count == 1) + { + node = json_array_get_element(array, 0); + + memset(&value, 0, sizeof(GValue)); + json_node_get_value(node, &value); + + if (G_VALUE_HOLDS(&value, G_TYPE_INT64)) + result = json_array_get_int_element(array, 0); + + } + + json_node_unref(found); + + } + + return result; + +} diff --git a/src/common/json.h b/src/common/json.h new file mode 100644 index 0000000..8794bf6 --- /dev/null +++ b/src/common/json.h @@ -0,0 +1,44 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * json.h - prototypes pour des manipulations génériques de données au format JSON + * + * Copyright (C) 2024 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 <http://www.gnu.org/licenses/>. + */ + + +#ifndef _COMMON_JSON_H +#define _COMMON_JSON_H + + +#include <stdbool.h> +#include <json-glib/json-glib.h> + + + +/* Détermine la présence d'un élément avec une valeur textuelle. */ +bool has_json_string_value(JsonNode *, const char *, GError **); + +/* Fournit le contenu d'un élément avec une valeur textuelle. */ +char *get_json_string_value(JsonNode *, const char *, GError **); + +/* Fournit le contenu d'un élément avec une valeur entière. */ +long long get_json_integer_value(JsonNode *, const char *, GError **); + + + +#endif /* _COMMON_JSON_H */ |