Repository navigation
Expand file tree
/
Copy pathfihjson.h
More file actions
109 lines (88 loc) · 2.7 KB
/
Copy pathfihjson.h
File metadata and controls
109 lines (88 loc) · 2.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#ifndef _FIHJSON_H_
#define _FIHJSON_H_
#include <stddef.h>
/* JSON 6 types , @ECMA-404 */
/*
https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
JSON-text Format = whitespace value whitespace
whitespace = *(%x20 / %x09 / %x0A / %x0D)
space / tab / LF / CR
value = null / false / true
"null" "false" "true"
*/
typedef enum
{
F_NULL, F_FALSE, F_TRUE, F_NUMBER,
F_STRING, F_ARRAY, F_OBJECT
}json_type;
typedef enum
{
F_PARSE_OK = 0,
F_STRINGIFY_OK = 1,
F_PARSE_ERROR_VALUE = 2,
F_PARSE_ERROR_MULTIPLE_ROOT = 4,
F_PARSE_ERROR_EMPTY = 6,
F_PARSE_ERROR_NUMBER_OUT_OF_RANGE = 8,
F_PARSE_ERROR_MISS_QUOTATION = 10,
F_PARSE_ERROR_ESCAPE = 12,
F_PARSE_ERROR_MISS_COMMA_OR_BKT = 14,
F_PARSE_ERROR_MISS_KEY = 16,
F_PARSE_ERROR_MISS_COLON = 18,
F_PARSE_ERROR_MISS_COMMA_OR_CBKT = 20
}parse_code;
typedef struct json_value json_value;
typedef struct json_object json_object;
struct json_value
{
json_type type;
/* number */
double num;
/* for string */
char* s;
size_t slen;
/* for array */
json_value* arr;
size_t arrlen;
/* for object*/
json_object* obj;
size_t olen;
json_value(*add)(json_value* root, json_type type, char* k, json_value v);
};
struct json_object
{
size_t klen;
char* k;
json_value v;
};
typedef struct
{
const char* json;
char* stack;
size_t size, top; // dynamic stack
}json_context;
#ifndef F_JSON_CONTEXT_STACK_SIZE
#define F_JSON_CONTEXT_STACK_SIZE 256
#endif
extern char* json_type_list[];
void json_set_boolean(json_value* v, int b);
void json_set_number(json_value* v, double num);
void json_set_string(json_value* v, const char* str, size_t len);
json_type json_get_type(const json_value* value);
int json_get_boolean(const json_value* value);
double json_get_number(const json_value* value);
const char* json_get_string(const json_value* value);
size_t json_get_string_length(const json_value* value);
size_t json_get_array_size(const json_value* v);
json_value* json_get_array_element(const json_value* v, size_t index);
size_t json_get_object_size(const json_value* v);
const char* json_get_object_key(const json_value* v, size_t index);
size_t json_get_object_key_length(const json_value* v, size_t index);
json_value* json_get_object_value(const json_value* v, size_t index);
int json_parse(json_value* value, const char* json);
int json_stringify(const json_value* v, char** json, size_t* length);
int json_stringify_string(json_context* c, const char* str, size_t len);
//int json_parse_literal(json_context* c, json_value* v, char* expect);
void init_json_value(json_value* v);
void free_json_value(json_value* v);
void add_json(json_value* root, json_type type, char* k, json_value v);
#endif //FIHJSON_H