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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
/*
* Copyright (C) Igor Sysoev
* Copyright (C) Valentin V. Bartenev
* Copyright (C) NGINX, Inc.
* Copyright 2024, Alejandro Colomar <alx@kernel.org>
*/
#ifndef _NXT_CONF_INCLUDED_
#define _NXT_CONF_INCLUDED_
typedef enum {
NXT_CONF_NULL = 0,
NXT_CONF_BOOLEAN,
NXT_CONF_INTEGER,
NXT_CONF_NUMBER,
NXT_CONF_STRING,
NXT_CONF_ARRAY,
NXT_CONF_OBJECT,
} nxt_conf_type_t;
typedef enum {
NXT_CONF_OP_OK = 0,
NXT_CONF_OP_NOT_FOUND,
NXT_CONF_OP_NOT_ALLOWED,
NXT_CONF_OP_ERROR,
} nxt_conf_op_ret_t;
typedef struct nxt_conf_value_s nxt_conf_value_t;
typedef struct nxt_conf_op_s nxt_conf_op_t;
typedef struct {
u_char *pos;
u_char *detail;
} nxt_conf_json_error_t;
typedef enum {
NXT_CONF_MAP_INT8,
NXT_CONF_MAP_INT32,
NXT_CONF_MAP_INT64,
NXT_CONF_MAP_INT,
NXT_CONF_MAP_SIZE,
NXT_CONF_MAP_OFF,
NXT_CONF_MAP_MSEC,
NXT_CONF_MAP_DOUBLE,
NXT_CONF_MAP_STR,
NXT_CONF_MAP_STR_COPY,
NXT_CONF_MAP_CSTRZ,
NXT_CONF_MAP_PTR,
} nxt_conf_map_type_t;
typedef struct {
nxt_str_t name;
nxt_conf_map_type_t type;
size_t offset;
} nxt_conf_map_t;
typedef struct {
uint32_t level;
uint8_t more_space; /* 1 bit. */
} nxt_conf_json_pretty_t;
typedef struct {
nxt_conf_value_t *conf;
nxt_mp_t *pool;
nxt_str_t error;
void *ctx;
nxt_tstr_state_t *tstr_state;
nxt_mp_t *conf_pool;
nxt_uint_t ver;
} nxt_conf_validation_t;
NXT_EXPORT nxt_uint_t nxt_conf_type(const nxt_conf_value_t *value);
NXT_EXPORT nxt_conf_value_t *nxt_conf_get_path(nxt_conf_value_t *value,
const nxt_str_t *path);
NXT_EXPORT nxt_conf_value_t *nxt_conf_get_object_member(
const nxt_conf_value_t *value, const nxt_str_t *name, uint32_t *index);
NXT_EXPORT nxt_conf_value_t *nxt_conf_next_object_member(
const nxt_conf_value_t *value, nxt_str_t *name, uint32_t *next);
NXT_EXPORT nxt_conf_value_t *nxt_conf_get_array_element(
const nxt_conf_value_t *value, uint32_t index);
NXT_EXPORT nxt_conf_value_t *nxt_conf_get_array_element_or_itself(
nxt_conf_value_t *value, uint32_t index);
NXT_EXPORT nxt_int_t nxt_conf_map_object(nxt_mp_t *mp,
const nxt_conf_value_t *value, const nxt_conf_map_t *map, nxt_uint_t n,
void *data);
nxt_conf_op_ret_t nxt_conf_op_compile(nxt_mp_t *mp, nxt_conf_op_t **ops,
const nxt_conf_value_t *root, const nxt_str_t *path, nxt_conf_value_t *value,
nxt_bool_t add);
nxt_conf_value_t *nxt_conf_clone(nxt_mp_t *mp, nxt_conf_op_t *op,
const nxt_conf_value_t *value);
nxt_conf_value_t *nxt_conf_json_parse(nxt_mp_t *mp, u_char *start, u_char *end,
nxt_conf_json_error_t *error);
#define nxt_conf_json_parse_str(mp, str) \
nxt_conf_json_parse(mp, (str)->start, (str)->start + (str)->length, NULL)
size_t nxt_conf_json_length(const nxt_conf_value_t *value,
nxt_conf_json_pretty_t *pretty);
u_char *nxt_conf_json_print(u_char *p, const nxt_conf_value_t *value,
nxt_conf_json_pretty_t *pretty);
void nxt_conf_json_position(u_char *start, const u_char *pos, nxt_uint_t *line,
nxt_uint_t *column);
nxt_int_t nxt_conf_validate(nxt_conf_validation_t *vldt);
NXT_EXPORT void nxt_conf_get_string(const nxt_conf_value_t *value,
nxt_str_t *str);
NXT_EXPORT nxt_str_t *nxt_conf_get_string_dup(const nxt_conf_value_t *value,
nxt_mp_t *mp, nxt_str_t *str);
NXT_EXPORT void nxt_conf_set_string(nxt_conf_value_t *value,
const nxt_str_t *str);
NXT_EXPORT nxt_int_t nxt_conf_set_string_dup(nxt_conf_value_t *value,
nxt_mp_t *mp, const nxt_str_t *str);
NXT_EXPORT double nxt_conf_get_number(nxt_conf_value_t *value);
NXT_EXPORT uint8_t nxt_conf_get_boolean(nxt_conf_value_t *value);
// FIXME reimplement and reorder functions below
NXT_EXPORT nxt_uint_t nxt_conf_object_members_count(
const nxt_conf_value_t *value);
nxt_conf_value_t *nxt_conf_create_object(nxt_mp_t *mp, nxt_uint_t count);
void nxt_conf_set_member(nxt_conf_value_t *object, const nxt_str_t *name,
const nxt_conf_value_t *value, uint32_t index);
nxt_int_t nxt_conf_set_member_dup(nxt_conf_value_t *object, nxt_mp_t *mp,
const nxt_str_t *name, const nxt_conf_value_t *value, uint32_t index);
void nxt_conf_set_member_string(nxt_conf_value_t *object,
const nxt_str_t *name, const nxt_str_t *value, uint32_t index);
nxt_int_t nxt_conf_set_member_string_dup(nxt_conf_value_t *object,
nxt_mp_t *mp, const nxt_str_t *name, const nxt_str_t *value,
uint32_t index);
void nxt_conf_set_member_integer(nxt_conf_value_t *object,
const nxt_str_t *name, int64_t value, uint32_t index);
void nxt_conf_set_member_null(nxt_conf_value_t *object, const nxt_str_t *name,
uint32_t index);
nxt_conf_value_t *nxt_conf_create_array(nxt_mp_t *mp, nxt_uint_t count);
void nxt_conf_set_element(nxt_conf_value_t *array, nxt_uint_t index,
const nxt_conf_value_t *value);
nxt_int_t nxt_conf_set_element_string_dup(nxt_conf_value_t *array,
nxt_mp_t *mp, nxt_uint_t index, const nxt_str_t *value);
NXT_EXPORT nxt_uint_t nxt_conf_array_elements_count(
const nxt_conf_value_t *value);
NXT_EXPORT nxt_uint_t nxt_conf_array_elements_count_or_1(
const nxt_conf_value_t *value);
void nxt_conf_array_qsort(const nxt_conf_value_t *value,
int (*compare)(const void *, const void *));
#endif /* _NXT_CONF_INCLUDED_ */
|