xref: /lighttpd1.4/src/array.h (revision dde9df43)
1 #ifndef ARRAY_H
2 #define ARRAY_H
3 #include "first.h"
4 
5 #include "buffer.h"
6 
7 struct data_unset; /* declaration */
8 
9 struct data_methods {
10 	struct data_unset *(*copy)(const struct data_unset *src); \
11 	void (*free)(struct data_unset *p); \
12 	int (*insert_dup)(struct data_unset *dst, struct data_unset *src); \
13 	void (*print)(const struct data_unset *p, int depth);
14 };
15 
16 typedef enum { TYPE_STRING, TYPE_ARRAY, TYPE_INTEGER, TYPE_CONFIG, TYPE_OTHER } data_type_t;
17 #define DATA_UNSET \
18 	buffer key; \
19 	const struct data_methods *fn; /* function table */ \
20 	data_type_t type
21 
22 typedef struct data_unset {
23 	DATA_UNSET;
24 } data_unset;
25 
26 typedef struct {
27 	data_unset **data;
28 	data_unset **sorted;
29 
30 	uint32_t used; /* <= INT32_MAX */
31 	uint32_t size;
32 } array;
33 
34 typedef struct {
35 	DATA_UNSET;
36 	int ext; /*(fits in space due to alignment in 64-bit; extends 32-bit)*/
37 	buffer value;
38 } data_string;
39 
40 __attribute_returns_nonnull__
41 data_string *data_string_init(void);
42 
43 typedef struct {
44 	DATA_UNSET;
45 
46 	array value;
47 } data_array;
48 
49 __attribute_returns_nonnull__
50 data_array *data_array_init(void);
51 
52 typedef struct {
53 	DATA_UNSET;
54 
55 	int value;
56 } data_integer;
57 
58 __attribute_returns_nonnull__
59 data_integer *data_integer_init(void);
60 
61 __attribute_returns_nonnull__
62 array *array_init(uint32_t n);
63 
64 __attribute_cold__
65 void array_copy_array(array *dst, const array *src);
66 
67 __attribute_cold__
68 void array_free_data(array *a);
69 
70 void array_free(array *a);
71 
72 __attribute_hot__
73 void array_reset_data_strings(array *a);
74 
75 __attribute_cold__
76 void array_insert_unique(array *a, data_unset *entry);
77 
78 __attribute_cold__
79 data_unset *array_pop(array *a); /* only works on "simple" lists with autogenerated keys */
80 
81 __attribute_cold__
82 __attribute_pure__
83 int array_is_vlist(const array *a);
84 
85 __attribute_cold__
86 __attribute_pure__
87 int array_is_kvany(const array *a);
88 
89 __attribute_cold__
90 __attribute_pure__
91 int array_is_kvarray(const array *a);
92 
93 __attribute_cold__
94 __attribute_pure__
95 int array_is_kvstring(const array *a);
96 
97 __attribute_pure__
98 data_unset *array_get_element_klen_ext(const array *a, int ext, const char *key, uint32_t klen);
99 
100 __attribute_pure__
101 const data_unset *array_get_element_klen(const array *a, const char *key, uint32_t klen);
102 
103 __attribute_cold__
104 __attribute_pure__
105 data_unset *array_get_data_unset(const array *a, const char *key, uint32_t klen);
106 
107 __attribute_cold__
108 data_unset *array_extract_element_klen(array *a, const char *key, uint32_t klen); /* removes found entry from array */
109 
110 __attribute_returns_nonnull__
111 int * array_get_int_ptr(array *a, const char *k, uint32_t klen);
112 
113 __attribute_returns_nonnull__
114 buffer * array_get_buf_ptr_ext(array *a, int ext, const char *k, uint32_t klen);
115 
116 __attribute_returns_nonnull__
117 buffer * array_get_buf_ptr(array *a, const char *k, uint32_t klen);
118 
119 void array_insert_value(array *a, const char *v, uint32_t vlen);
120 
121 static inline void array_set_key_value(array * const a, const char * const k, const uint32_t klen, const char * const v, const uint32_t vlen);
122 
123 static inline void array_set_key_value(array * const a, const char * const k, const uint32_t klen, const char * const v, const uint32_t vlen) {
124     buffer_copy_string_len(array_get_buf_ptr(a, k, klen), v, vlen);
125 }
126 
127 __attribute_cold__
128 void array_replace(array *a, data_unset *entry);
129 
130 __attribute_cold__
131 int array_print(const array *a, int depth);
132 
133 __attribute_cold__
134 void array_print_indent(int depth);
135 
136 __attribute_cold__
137 __attribute_pure__
138 uint32_t array_get_max_key_length(const array *a);
139 
140 __attribute_pure__
141 data_unset * array_match_key_prefix_klen (const array * const a, const char * const s, const uint32_t slen);
142 
143 __attribute_pure__
144 data_unset * array_match_key_prefix_nc_klen (const array * const a, const char * const s, const uint32_t slen);
145 
146 __attribute_pure__
147 data_unset * array_match_key_prefix (const array * const a, const buffer * const b);
148 
149 __attribute_pure__
150 data_unset * array_match_key_prefix_nc (const array * const a, const buffer * const b);
151 
152 __attribute_pure__
153 const buffer * array_match_value_prefix (const array * const a, const buffer * const b);
154 
155 __attribute_pure__
156 const buffer * array_match_value_prefix_nc (const array * const a, const buffer * const b);
157 
158 __attribute_pure__
159 data_unset * array_match_key_suffix (const array * const a, const buffer * const b);
160 
161 __attribute_pure__
162 data_unset * array_match_key_suffix_nc (const array * const a, const buffer * const b);
163 
164 __attribute_pure__
165 const buffer * array_match_value_suffix (const array * const a, const buffer * const b);
166 
167 __attribute_pure__
168 const buffer * array_match_value_suffix_nc (const array * const a, const buffer * const b);
169 
170 __attribute_pure__
171 data_unset * array_match_path_or_ext (const array * const a, const buffer * const b);
172 
173 #endif
174