aboutsummaryrefslogtreecommitdiff
path: root/src/json/json.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/json/json.c')
-rw-r--r--src/json/json.c126
1 files changed, 63 insertions, 63 deletions
diff --git a/src/json/json.c b/src/json/json.c
index fe6117c20..ecdea0294 100644
--- a/src/json/json.c
+++ b/src/json/json.c
@@ -1,22 +1,22 @@
1/* 1/*
2 This file is part of GNUnet 2 This file is part of GNUnet
3 Copyright (C) 2014-2017 GNUnet e.V. 3 Copyright (C) 2014-2017 GNUnet e.V.
4 4
5 GNUnet is free software: you can redistribute it and/or modify it 5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published 6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License, 7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version. 8 or (at your option) any later version.
9 9
10 GNUnet is distributed in the hope that it will be useful, but 10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of 11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details. 13 Affero General Public License for more details.
14 14
15 You should have received a copy of the GNU Affero General Public License 15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 17
18 SPDX-License-Identifier: AGPL3.0-or-later 18 SPDX-License-Identifier: AGPL3.0-or-later
19*/ 19 */
20/** 20/**
21 * @file json/json.c 21 * @file json/json.c
22 * @brief functions to parse JSON snippets 22 * @brief functions to parse JSON snippets
@@ -42,34 +42,34 @@
42 * @return #GNUNET_OK on success, #GNUNET_SYSERR on error 42 * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
43 */ 43 */
44int 44int
45GNUNET_JSON_parse (const json_t *root, 45GNUNET_JSON_parse(const json_t *root,
46 struct GNUNET_JSON_Specification *spec, 46 struct GNUNET_JSON_Specification *spec,
47 const char **error_json_name, 47 const char **error_json_name,
48 unsigned int *error_line) 48 unsigned int *error_line)
49{ 49{
50 if (NULL == root) 50 if (NULL == root)
51 return GNUNET_SYSERR; 51 return GNUNET_SYSERR;
52 for (unsigned int i = 0; NULL != spec[i].parser; i++) 52 for (unsigned int i = 0; NULL != spec[i].parser; i++)
53 {
54 json_t *pos;
55
56 if (NULL == spec[i].field)
57 pos = (json_t *) root;
58 else
59 pos = json_object_get (root, spec[i].field);
60 if ((NULL == pos) && (spec[i].is_optional))
61 continue;
62 if ((NULL == pos) ||
63 (GNUNET_OK != spec[i].parser (spec[i].cls, pos, &spec[i])))
64 { 53 {
65 if (NULL != error_json_name) 54 json_t *pos;
66 *error_json_name = spec[i].field; 55
67 if (NULL != error_line) 56 if (NULL == spec[i].field)
68 *error_line = i; 57 pos = (json_t *)root;
69 GNUNET_JSON_parse_free (spec); 58 else
70 return GNUNET_SYSERR; 59 pos = json_object_get(root, spec[i].field);
60 if ((NULL == pos) && (spec[i].is_optional))
61 continue;
62 if ((NULL == pos) ||
63 (GNUNET_OK != spec[i].parser(spec[i].cls, pos, &spec[i])))
64 {
65 if (NULL != error_json_name)
66 *error_json_name = spec[i].field;
67 if (NULL != error_line)
68 *error_line = i;
69 GNUNET_JSON_parse_free(spec);
70 return GNUNET_SYSERR;
71 }
71 } 72 }
72 }
73 return GNUNET_OK; /* all OK! */ 73 return GNUNET_OK; /* all OK! */
74} 74}
75 75
@@ -81,7 +81,7 @@ GNUNET_JSON_parse (const json_t *root,
81 * @return spec copy of @a spec with optional bit set 81 * @return spec copy of @a spec with optional bit set
82 */ 82 */
83struct GNUNET_JSON_Specification 83struct GNUNET_JSON_Specification
84GNUNET_JSON_spec_mark_optional (struct GNUNET_JSON_Specification spec) 84GNUNET_JSON_spec_mark_optional(struct GNUNET_JSON_Specification spec)
85{ 85{
86 struct GNUNET_JSON_Specification ret = spec; 86 struct GNUNET_JSON_Specification ret = spec;
87 87
@@ -97,11 +97,11 @@ GNUNET_JSON_spec_mark_optional (struct GNUNET_JSON_Specification spec)
97 * @param spec specification of the parse operation 97 * @param spec specification of the parse operation
98 */ 98 */
99void 99void
100GNUNET_JSON_parse_free (struct GNUNET_JSON_Specification *spec) 100GNUNET_JSON_parse_free(struct GNUNET_JSON_Specification *spec)
101{ 101{
102 for (unsigned int i = 0; NULL != spec[i].parser; i++) 102 for (unsigned int i = 0; NULL != spec[i].parser; i++)
103 if (NULL != spec[i].cleaner) 103 if (NULL != spec[i].cleaner)
104 spec[i].cleaner (spec[i].cls, &spec[i]); 104 spec[i].cleaner(spec[i].cls, &spec[i]);
105} 105}
106 106
107 107
@@ -118,24 +118,24 @@ GNUNET_JSON_parse_free (struct GNUNET_JSON_Specification *spec)
118 * @return #GNUNET_OK if parsing the value worked 118 * @return #GNUNET_OK if parsing the value worked
119 */ 119 */
120static int 120static int
121set_json (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, 121set_json(struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
122 void *scls, 122 void *scls,
123 const char *option, 123 const char *option,
124 const char *value) 124 const char *value)
125{ 125{
126 json_t **json = scls; 126 json_t **json = scls;
127 json_error_t error; 127 json_error_t error;
128 128
129 *json = json_loads (value, JSON_REJECT_DUPLICATES, &error); 129 *json = json_loads(value, JSON_REJECT_DUPLICATES, &error);
130 if (NULL == *json) 130 if (NULL == *json)
131 { 131 {
132 fprintf (stderr, 132 fprintf(stderr,
133 _ ("Failed to parse JSON in option `%s': %s (%s)\n"), 133 _("Failed to parse JSON in option `%s': %s (%s)\n"),
134 option, 134 option,
135 error.text, 135 error.text,
136 error.source); 136 error.source);
137 return GNUNET_SYSERR; 137 return GNUNET_SYSERR;
138 } 138 }
139 return GNUNET_OK; 139 return GNUNET_OK;
140} 140}
141 141
@@ -150,19 +150,19 @@ set_json (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
150 * @param[out] val set to the JSON specified at the command line 150 * @param[out] val set to the JSON specified at the command line
151 */ 151 */
152struct GNUNET_GETOPT_CommandLineOption 152struct GNUNET_GETOPT_CommandLineOption
153GNUNET_JSON_getopt (char shortName, 153GNUNET_JSON_getopt(char shortName,
154 const char *name, 154 const char *name,
155 const char *argumentHelp, 155 const char *argumentHelp,
156 const char *description, 156 const char *description,
157 json_t **json) 157 json_t **json)
158{ 158{
159 struct GNUNET_GETOPT_CommandLineOption clo = {.shortName = shortName, 159 struct GNUNET_GETOPT_CommandLineOption clo = { .shortName = shortName,
160 .name = name, 160 .name = name,
161 .argumentHelp = argumentHelp, 161 .argumentHelp = argumentHelp,
162 .description = description, 162 .description = description,
163 .require_argument = 1, 163 .require_argument = 1,
164 .processor = &set_json, 164 .processor = &set_json,
165 .scls = (void *) json}; 165 .scls = (void *)json };
166 166
167 return clo; 167 return clo;
168} 168}