xref: /lighttpd1.4/src/array.h (revision a762402d)
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_UNSET, TYPE_STRING, TYPE_OTHER, TYPE_ARRAY, TYPE_INTEGER, TYPE_DONOTUSE, TYPE_CONFIG } 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 
29 	uint32_t *sorted;
30 
31 	uint32_t used; /* <= INT32_MAX */
32 	uint32_t size;
33 } array;
34 
35 typedef struct {
36 	DATA_UNSET;
37 
38 	buffer value;
39 } data_string;
40 
41 data_string *data_string_init(void);
42 
43 typedef struct {
44 	DATA_UNSET;
45 
46 	array value;
47 } data_array;
48 
49 data_array *data_array_init(void);
50 
51 typedef struct {
52 	DATA_UNSET;
53 
54 	int value;
55 } data_integer;
56 
57 data_integer *data_integer_init(void);
58 
59 __attribute_returns_nonnull__
60 array *array_init(void);
61 
62 __attribute_cold__
63 void array_copy_array(array *dst, const array *src);
64 
65 __attribute_cold__
66 void array_free_data(array *a);
67 
68 void array_free(array *a);
69 
70 __attribute_hot__
71 void array_reset_data_strings(array *a);
72 
73 __attribute_cold__
74 void array_insert_unique(array *a, data_unset *entry);
75 
76 __attribute_cold__
77 data_unset *array_pop(array *a); /* only works on "simple" lists with autogenerated keys */
78 
79 __attribute_cold__
80 __attribute_pure__
81 int array_is_vlist(const array *a);
82 
83 __attribute_cold__
84 __attribute_pure__
85 int array_is_kvany(const array *a);
86 
87 __attribute_cold__
88 __attribute_pure__
89 int array_is_kvarray(const array *a);
90 
91 __attribute_cold__
92 __attribute_pure__
93 int array_is_kvstring(const array *a);
94 
95 __attribute_pure__
96 data_unset *array_get_element_klen(const array *a, const char *key, size_t klen);
97 
98 __attribute_cold__
99 __attribute_pure__
100 data_unset *array_get_data_unset(const array *a, const char *key, size_t klen);
101 
102 __attribute_cold__
103 data_unset *array_extract_element_klen(array *a, const char *key, size_t klen); /* removes found entry from array */
104 
105 __attribute_returns_nonnull__
106 int * array_get_int_ptr(array *a, const char *k, size_t klen);
107 
108 __attribute_returns_nonnull__
109 buffer * array_get_buf_ptr(array *a, const char *k, size_t klen);
110 
111 void array_insert_value(array *a, const char *v, size_t vlen);
112 
113 static inline void array_set_key_value(array * const a, const char * const k, const size_t klen, const char * const v, const size_t vlen);
114 
115 static inline void array_set_key_value(array * const a, const char * const k, const size_t klen, const char * const v, const size_t vlen) {
116     buffer_copy_string_len(array_get_buf_ptr(a, k, klen), v, vlen);
117 }
118 
119 __attribute_cold__
120 void array_replace(array *a, data_unset *entry);
121 
122 __attribute_cold__
123 int array_print(const array *a, int depth);
124 
125 __attribute_cold__
126 void array_print_indent(int depth);
127 
128 __attribute_cold__
129 __attribute_pure__
130 size_t array_get_max_key_length(const array *a);
131 
132 __attribute_pure__
133 data_unset * array_match_key_prefix_klen (const array * const a, const char * const s, const size_t slen);
134 
135 __attribute_pure__
136 data_unset * array_match_key_prefix_nc_klen (const array * const a, const char * const s, const size_t slen);
137 
138 __attribute_pure__
139 data_unset * array_match_key_prefix (const array * const a, const buffer * const b);
140 
141 __attribute_pure__
142 data_unset * array_match_key_prefix_nc (const array * const a, const buffer * const b);
143 
144 __attribute_pure__
145 const buffer * array_match_value_prefix (const array * const a, const buffer * const b);
146 
147 __attribute_pure__
148 const buffer * array_match_value_prefix_nc (const array * const a, const buffer * const b);
149 
150 __attribute_pure__
151 data_unset * array_match_key_suffix (const array * const a, const buffer * const b);
152 
153 __attribute_pure__
154 data_unset * array_match_key_suffix_nc (const array * const a, const buffer * const b);
155 
156 __attribute_pure__
157 const buffer * array_match_value_suffix (const array * const a, const buffer * const b);
158 
159 __attribute_pure__
160 const buffer * array_match_value_suffix_nc (const array * const a, const buffer * const b);
161 
162 __attribute_pure__
163 data_unset * array_match_path_or_ext (const array * const a, const buffer * const b);
164 
165 #endif
166