FD.io VPP  v18.07.1-19-g511ce25
Vector Packet Processing
json_format.h
Go to the documentation of this file.
1 /*
2  *------------------------------------------------------------------
3  * json_format.h
4  *
5  * Copyright (c) 2015 Cisco and/or its affiliates.
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at:
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *------------------------------------------------------------------
18  */
19 
20 #ifndef __JSON_FORMAT_H__
21 #define __JSON_FORMAT_H__
22 
23 #include <vppinfra/clib.h>
24 #include <vppinfra/format.h>
25 #include <netinet/ip.h>
26 
27 /* JSON value type */
28 typedef enum
29 {
41 
44 
45 /* JSON object structure */
47 {
49  union
50  {
54  struct in_addr ip4;
55  struct in6_addr ip6;
59  };
60 };
61 
63 {
64  const char *name;
66 };
67 
68 void vat_json_print (FILE * ofp, vat_json_node_t * node);
69 void vat_json_free (vat_json_node_t * node);
70 
73 {
74  json->type = VAT_JSON_OBJECT;
75  json->pairs = NULL;
76 }
77 
80 {
81  json->type = VAT_JSON_ARRAY;
82  json->array = NULL;
83 }
84 
87 {
88  json->type = VAT_JSON_STRING;
89  json->string = str;
90 }
91 
94 {
95  u8 *ns = NULL;
96  vec_validate (ns, strlen ((const char *) str));
97  strcpy ((char *) ns, (const char *) str);
98  vec_add1 (ns, '\0');
99  vat_json_set_string (json, ns);
100 }
101 
104 {
105  json->type = VAT_JSON_INT;
106  json->sint = num;
107 }
108 
111 {
112  json->type = VAT_JSON_UINT;
113  json->uint = num;
114 }
115 
118 {
119  json->type = VAT_JSON_REAL;
120  json->real = real;
121 }
122 
124 vat_json_set_ip4 (vat_json_node_t * json, struct in_addr ip4)
125 {
126  json->type = VAT_JSON_IPV4;
127  json->ip4 = ip4;
128 }
129 
131 vat_json_set_ip6 (vat_json_node_t * json, struct in6_addr ip6)
132 {
133  json->type = VAT_JSON_IPV6;
134  json->ip6 = ip6;
135 }
136 
138 vat_json_object_add (vat_json_node_t * json, const char *name)
139 {
140  ASSERT (VAT_JSON_OBJECT == json->type);
141  uword pos = vec_len (json->pairs);
142  vec_validate (json->pairs, pos);
143  json->pairs[pos].name = name;
144  return &json->pairs[pos].value;
145 }
146 
149 {
150  ASSERT (VAT_JSON_ARRAY == json->type);
151  uword pos = vec_len (json->array);
152  vec_validate (json->array, pos);
153  return &json->array[pos];
154 }
155 
157 vat_json_object_add_list (vat_json_node_t * json, const char *name)
158 {
159  vat_json_node_t *array_node = vat_json_object_add (json, name);
160  vat_json_init_array (array_node);
161  return array_node;
162 }
163 
166  const char *name, u8 * str)
167 {
168  vat_json_set_string_copy (vat_json_object_add (json, name), str);
169 }
170 
173  const char *name, u64 number)
174 {
175  vat_json_set_uint (vat_json_object_add (json, name), number);
176 }
177 
179 vat_json_object_add_int (vat_json_node_t * json, const char *name, i64 number)
180 {
181  vat_json_set_int (vat_json_object_add (json, name), number);
182 }
183 
186 {
187  vat_json_set_real (vat_json_object_add (json, name), real);
188 }
189 
192  const char *name, struct in_addr ip4)
193 {
194  vat_json_set_ip4 (vat_json_object_add (json, name), ip4);
195 }
196 
199  const char *name, struct in6_addr ip6)
200 {
201  vat_json_set_ip6 (vat_json_object_add (json, name), ip6);
202 }
203 
206 {
207  vat_json_set_int (vat_json_array_add (json), number);
208 }
209 
212 {
213  vat_json_set_uint (vat_json_array_add (json), number);
214 }
215 
218  const char *name, u8 * array, uword size)
219 {
220  ASSERT (VAT_JSON_OBJECT == json->type);
221  vat_json_node_t *json_array = vat_json_object_add (json, name);
222  vat_json_init_array (json_array);
223  int i;
224  for (i = 0; i < size; i++)
225  {
226  vat_json_array_add_uint (json_array, array[i]);
227  }
228 }
229 
232 {
233  int i = 0;
234 
235  ASSERT (VAT_JSON_OBJECT == json->type);
236  for (i = 0; i < vec_len (json->pairs); i++)
237  {
238  if (0 == strcmp (json->pairs[i].name, name))
239  {
240  return &json->pairs[i].value;
241  }
242  }
243  return NULL;
244 }
245 
246 #endif /* __JSON_FORMAT_H__ */
247 
248 /*
249  * fd.io coding-style-patch-verification: ON
250  *
251  * Local Variables:
252  * eval: (c-set-style "gnu")
253  * End:
254  */
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:437
struct in6_addr ip6
Definition: json_format.h:55
vat_json_val_type_t
Definition: json_format.h:28
unsigned long u64
Definition: types.h:89
static_always_inline void vat_json_init_array(vat_json_node_t *json)
Definition: json_format.h:79
#define NULL
Definition: clib.h:55
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:523
int i
unsigned char u8
Definition: types.h:56
double f64
Definition: types.h:142
#define static_always_inline
Definition: clib.h:93
static_always_inline void vat_json_set_ip6(vat_json_node_t *json, struct in6_addr ip6)
Definition: json_format.h:131
static_always_inline void vat_json_set_real(vat_json_node_t *json, f64 real)
Definition: json_format.h:117
static_always_inline void vat_json_object_add_ip6(vat_json_node_t *json, const char *name, struct in6_addr ip6)
Definition: json_format.h:198
static_always_inline void vat_json_array_add_int(vat_json_node_t *json, i64 number)
Definition: json_format.h:205
static_always_inline vat_json_node_t * vat_json_object_add_list(vat_json_node_t *json, const char *name)
Definition: json_format.h:157
static_always_inline vat_json_node_t * vat_json_array_add(vat_json_node_t *json)
Definition: json_format.h:148
vat_json_val_type_t type
Definition: json_format.h:48
void vat_json_print(FILE *ofp, vat_json_node_t *node)
Definition: json_format.c:245
uword size
static_always_inline void vat_json_set_string_copy(vat_json_node_t *json, const u8 *str)
Definition: json_format.h:93
vat_json_node_t value
Definition: json_format.h:65
static_always_inline void vat_json_array_add_uint(vat_json_node_t *json, u64 number)
Definition: json_format.h:211
signed long i64
Definition: types.h:82
static_always_inline void vat_json_object_add_bytes(vat_json_node_t *json, const char *name, u8 *array, uword size)
Definition: json_format.h:217
static_always_inline void vat_json_object_add_string_copy(vat_json_node_t *json, const char *name, u8 *str)
Definition: json_format.h:165
static_always_inline void vat_json_object_add_real(vat_json_node_t *json, const char *name, f64 real)
Definition: json_format.h:185
static_always_inline void vat_json_init_object(vat_json_node_t *json)
Definition: json_format.h:72
static_always_inline void vat_json_object_add_int(vat_json_node_t *json, const char *name, i64 number)
Definition: json_format.h:179
static_always_inline void vat_json_set_string(vat_json_node_t *json, u8 *str)
Definition: json_format.h:86
vat_json_node_t * array
Definition: json_format.h:52
static_always_inline void vat_json_object_add_uint(vat_json_node_t *json, const char *name, u64 number)
Definition: json_format.h:172
static_always_inline vat_json_node_t * vat_json_object_get_element(vat_json_node_t *json, const char *name)
Definition: json_format.h:231
#define ASSERT(truth)
struct in_addr ip4
Definition: json_format.h:54
static_always_inline void vat_json_set_uint(vat_json_node_t *json, u64 num)
Definition: json_format.h:110
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
u64 uword
Definition: types.h:112
static_always_inline void vat_json_object_add_ip4(vat_json_node_t *json, const char *name, struct in_addr ip4)
Definition: json_format.h:191
static_always_inline vat_json_node_t * vat_json_object_add(vat_json_node_t *json, const char *name)
Definition: json_format.h:138
const char * name
Definition: json_format.h:64
static_always_inline void vat_json_set_int(vat_json_node_t *json, i64 num)
Definition: json_format.h:103
vat_json_pair_t * pairs
Definition: json_format.h:51
static_always_inline void vat_json_set_ip4(vat_json_node_t *json, struct in_addr ip4)
Definition: json_format.h:124
void vat_json_free(vat_json_node_t *node)
Definition: json_format.c:257