VR-Vantage 3.0.3 API Documentation
Home
Modules
Namespaces
Classes
Files
Libraries
Examples
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Properties
Friends
Macros
Groups
Pages
sensorFx
examples
guiClient
json.h
Go to the documentation of this file.
1
2
/* vim: set et ts=3 sw=3 sts=3 ft=c:
3
*
4
* Copyright (C) 2012, 2013, 2014 James McLaughlin et al. All rights reserved.
5
* https://github.com/udp/json-parser
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
*
11
* 1. Redistributions of source code must retain the above copyright
12
* notice, this list of conditions and the following disclaimer.
13
*
14
* 2. Redistributions in binary form must reproduce the above copyright
15
* notice, this list of conditions and the following disclaimer in the
16
* documentation and/or other materials provided with the distribution.
17
*
18
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28
* SUCH DAMAGE.
29
*/
30
31
#ifndef _JSON_H
32
#define _JSON_H
33
34
#ifndef json_char
35
#define json_char char
36
#endif
37
38
#ifndef json_int_t
39
#ifndef _MSC_VER
40
#include <
inttypes.h
>
41
#define json_int_t int64_t
42
#else
43
#define json_int_t __int64
44
#endif
45
#endif
46
47
#include <stdlib.h>
48
49
#ifdef __cplusplus
50
51
#include <string.h>
52
53
extern
"C"
{
54
55
#endif
56
57
typedef
struct
58
{
59
unsigned
long
max_memory
;
60
int
settings
;
61
62
/* Custom allocator support (leave null to use malloc/free)
63
*/
64
65
void
* (* mem_alloc)(size_t,
int
zero,
void
* user_data);
66
void
(* mem_free)(
void
*,
void
* user_data);
67
68
void
*
user_data
;
/* will be passed to mem_alloc and mem_free */
69
70
}
json_settings
;
71
72
#define json_enable_comments 0x01
73
74
typedef
enum
75
{
76
json_none
,
77
json_object
,
78
json_array
,
79
json_integer
,
80
json_double
,
81
json_string
,
82
json_boolean
,
83
json_null
84
85
}
json_type
;
86
87
extern
const
struct
_json_value
json_value_none
;
88
89
typedef
struct
_json_value
90
{
91
struct
_json_value
*
parent
;
92
93
json_type
type
;
94
95
union
96
{
97
int
boolean
;
98
json_int_t
integer
;
99
double
dbl
;
100
101
struct
102
{
103
unsigned
int
length
;
104
json_char
*
ptr
;
/* null terminated */
105
106
}
string
;
107
108
struct
109
{
110
unsigned
int
length
;
111
112
struct
113
{
114
json_char
*
name
;
115
unsigned
int
name_length
;
116
117
struct
_json_value
*
value
;
118
119
}*
values
;
120
121
#if defined(__cplusplus) && __cplusplus >= 201103L
122
decltype(
values
) begin()
const
123
{
124
return
values
;
125
}
126
decltype(
values
)
end
()
const
127
{
128
return
values
+
length
;
129
}
130
#endif
131
132
}
object
;
133
134
struct
135
{
136
unsigned
int
length
;
137
struct
_json_value
**
values
;
138
139
#if defined(__cplusplus) && __cplusplus >= 201103L
140
decltype(values) begin()
const
141
{
142
return
values
;
143
}
144
decltype(values)
end
()
const
145
{
146
return
values +
length
;
147
}
148
#endif
149
150
}
array
;
151
152
}
u
;
153
154
union
155
{
156
struct
_json_value
*
next_alloc
;
157
void
*
object_mem
;
158
159
}
_reserved
;
160
161
162
/* Some C++ operator sugar */
163
164
#ifdef __cplusplus
165
166
public
:
167
168
inline
_json_value
()
169
{
170
memset(
this
, 0,
sizeof
(
_json_value
));
171
}
172
173
inline
const
struct
_json_value
& operator [](
int
index
)
const
174
{
175
if
(
type
!=
json_array
|| index < 0
176
|| ((
unsigned
int
) index) >=
u
.array.length)
177
{
178
return
json_value_none
;
179
}
180
181
return
*
u
.array.values [
index
];
182
}
183
184
inline
const
struct
_json_value
& operator [](
const
char
* index)
const
185
{
186
if
(
type
!=
json_object
)
187
{
188
return
json_value_none
;
189
}
190
191
for
(
unsigned
int
i = 0; i <
u
.object.length; ++ i)
192
if
(!strcmp(
u
.object.values [i].name, index))
193
{
194
return
*
u
.object.values [i].value;
195
}
196
197
return
json_value_none
;
198
}
199
200
inline
operator
const
char
* ()
const
201
{
202
switch
(
type
)
203
{
204
case
json_string
:
205
return
u
.string.ptr;
206
207
default
:
208
return
""
;
209
};
210
}
211
212
inline
operator
json_int_t
()
const
213
{
214
switch
(
type
)
215
{
216
case
json_integer
:
217
return
u
.integer;
218
219
case
json_double
:
220
return
(
json_int_t
)
u
.dbl;
221
222
default
:
223
return
0;
224
};
225
}
226
227
inline
operator
bool
()
const
228
{
229
if
(
type
!=
json_boolean
)
230
{
231
return
false
;
232
}
233
234
return
u
.boolean != 0;
235
}
236
237
inline
operator
double ()
const
238
{
239
switch
(
type
)
240
{
241
case
json_integer
:
242
return
(
double
)
u
.integer;
243
244
case
json_double
:
245
return
u
.dbl;
246
247
default
:
248
return
0;
249
};
250
}
251
252
#endif
253
254
}
json_value
;
255
256
json_value
*
json_parse
(
const
json_char
* json,
257
size_t
length
);
258
259
#define json_error_max 128
260
json_value
*
json_parse_ex
(
json_settings
* settings,
261
const
json_char
* json,
262
size_t
length
,
263
char
* error);
264
265
void
json_value_free
(
json_value
*);
266
267
json_value
*
json_value_find
(
const
json_value
*
parent
,
const
char
*
name
);
268
269
270
/* Not usually necessary, unless you used a custom mem_alloc and now want to
271
* use a custom mem_free.
272
*/
273
void
json_value_free_ex
(
json_settings
* settings,
274
json_value
*);
275
276
277
#ifdef __cplusplus
278
}
/* extern "C" */
279
#endif
280
281
#endif
282
283
Copyright © 2005-2023 MAK Technologies. All Rights Reserved (
www.mak.com
)