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