xref: /lighttpd1.4/src/array.h (revision 2c409321)
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 	int is_index_key; /* 1 if key is a array index (autogenerated keys) */ \
22 	const struct data_methods *fn /* function table */
23 
24 typedef struct data_unset {
25 	DATA_UNSET;
26 } data_unset;
27 
28 typedef struct {
29 	data_unset  **data;
30 
31 	size_t *sorted;
32 
33 	size_t used; /* <= SSIZE_MAX */
34 	size_t size;
35 
36 	size_t unique_ndx;
37 } array;
38 
39 typedef struct {
40 	DATA_UNSET;
41 
42 	buffer *value;
43 } data_string;
44 
45 data_string *data_string_init(void);
46 
47 typedef struct {
48 	DATA_UNSET;
49 
50 	array *value;
51 } data_array;
52 
53 data_array *data_array_init(void);
54 
55 typedef struct {
56 	DATA_UNSET;
57 
58 	int value;
59 } data_integer;
60 
61 data_integer *data_integer_init(void);
62 
63 array *array_init(void);
64 array *array_init_array(array *a);
65 void array_free(array *a);
66 void array_reset(array *a);
67 void array_reset_data_strings(array *a);
68 void array_insert_unique(array *a, data_unset *entry);
69 data_unset *array_pop(array *a); /* only works on "simple" lists with autogenerated keys */
70 int array_is_vlist(array *a);
71 int array_is_kvany(array *a);
72 int array_is_kvarray(array *a);
73 int array_is_kvstring(array *a);
74 int array_print(array *a, int depth);
75 #define array_get_element(a, key) array_get_element_klen((a), (key), sizeof(key)-1)
76 data_unset *array_get_element_klen(const array *a, const char *key, size_t klen);
77 data_unset *array_extract_element_klen(array *a, const char *key, size_t klen); /* removes found entry from array */
78 void array_set_key_value(array *hdrs, const char *key, size_t key_len, const char *value, size_t val_len);
79 void array_insert_key_value(array *hdrs, const char *key, size_t key_len, const char *value, size_t val_len);
80 void array_insert_value(array *hdrs, const char *value, size_t val_len);
81 int * array_get_int_ptr(array *a, const char *k, size_t klen);
82 void array_replace(array *a, data_unset *entry);
83 void array_print_indent(int depth);
84 size_t array_get_max_key_length(array *a);
85 
86 data_unset * array_match_key_prefix_klen (const array * const a, const char * const s, const size_t slen);
87 data_unset * array_match_key_prefix_nc_klen (const array * const a, const char * const s, const size_t slen);
88 data_unset * array_match_key_prefix (const array * const a, const buffer * const b);
89 data_unset * array_match_key_prefix_nc (const array * const a, const buffer * const b);
90 const buffer * array_match_value_prefix (const array * const a, const buffer * const b);
91 const buffer * array_match_value_prefix_nc (const array * const a, const buffer * const b);
92 data_unset * array_match_key_suffix (const array * const a, const buffer * const b);
93 data_unset * array_match_key_suffix_nc (const array * const a, const buffer * const b);
94 const buffer * array_match_value_suffix (const array * const a, const buffer * const b);
95 const buffer * array_match_value_suffix_nc (const array * const a, const buffer * const b);
96 data_unset * array_match_path_or_ext (const array * const a, const buffer * const b);
97 
98 #endif
99