xref: /lighttpd1.4/src/array.h (revision e6741acd)
1 #ifndef ARRAY_H
2 #define ARRAY_H
3 #include "first.h"
4 
5 #include "buffer.h"
6 
7 typedef enum { TYPE_UNSET, TYPE_STRING, TYPE_OTHER, TYPE_ARRAY, TYPE_INTEGER, TYPE_DONOTUSE, TYPE_CONFIG } data_type_t;
8 #define DATA_UNSET \
9 	data_type_t type; \
10 	buffer *key; \
11 	int is_index_key; /* 1 if key is a array index (autogenerated keys) */ \
12 	struct data_unset *(*copy)(const struct data_unset *src); \
13 	void (* free)(struct data_unset *p); \
14 	void (* reset)(struct data_unset *p); \
15 	int (*insert_dup)(struct data_unset *dst, struct data_unset *src); \
16 	void (*print)(const struct data_unset *p, int depth)
17 
18 typedef struct data_unset {
19 	DATA_UNSET;
20 } data_unset;
21 
22 typedef struct {
23 	data_unset  **data;
24 
25 	size_t *sorted;
26 
27 	size_t used; /* <= SSIZE_MAX */
28 	size_t size;
29 
30 	size_t unique_ndx;
31 } array;
32 
33 typedef struct {
34 	DATA_UNSET;
35 
36 	buffer *value;
37 } data_string;
38 
39 data_string *data_string_init(void);
40 
41 typedef struct {
42 	DATA_UNSET;
43 
44 	array *value;
45 } data_array;
46 
47 data_array *data_array_init(void);
48 
49 typedef struct {
50 	DATA_UNSET;
51 
52 	int value;
53 } data_integer;
54 
55 data_integer *data_integer_init(void);
56 
57 array *array_init(void);
58 array *array_init_array(array *a);
59 void array_free(array *a);
60 void array_reset(array *a);
61 void array_insert_unique(array *a, data_unset *entry);
62 data_unset *array_pop(array *a); /* only works on "simple" lists with autogenerated keys */
63 int array_is_vlist(array *a);
64 int array_is_kvany(array *a);
65 int array_is_kvarray(array *a);
66 int array_is_kvstring(array *a);
67 int array_print(array *a, int depth);
68 #define array_get_element(a, key) array_get_element_klen((a), (key), sizeof(key)-1)
69 data_unset *array_get_element_klen(const array *a, const char *key, size_t klen);
70 data_unset *array_extract_element_klen(array *a, const char *key, size_t klen); /* removes found entry from array */
71 void array_set_key_value(array *hdrs, const char *key, size_t key_len, const char *value, size_t val_len);
72 void array_insert_key_value(array *hdrs, const char *key, size_t key_len, const char *value, size_t val_len);
73 void array_insert_value(array *hdrs, const char *value, size_t val_len);
74 void array_replace(array *a, data_unset *entry);
75 void array_print_indent(int depth);
76 size_t array_get_max_key_length(array *a);
77 
78 data_unset * array_match_key_prefix_klen (const array * const a, const char * const s, const size_t slen);
79 data_unset * array_match_key_prefix_nc_klen (const array * const a, const char * const s, const size_t slen);
80 data_unset * array_match_key_prefix (const array * const a, const buffer * const b);
81 data_unset * array_match_key_prefix_nc (const array * const a, const buffer * const b);
82 const buffer * array_match_value_prefix (const array * const a, const buffer * const b);
83 const buffer * array_match_value_prefix_nc (const array * const a, const buffer * const b);
84 data_unset * array_match_key_suffix (const array * const a, const buffer * const b);
85 data_unset * array_match_key_suffix_nc (const array * const a, const buffer * const b);
86 const buffer * array_match_value_suffix (const array * const a, const buffer * const b);
87 const buffer * array_match_value_suffix_nc (const array * const a, const buffer * const b);
88 data_unset * array_match_path_or_ext (const array * const a, const buffer * const b);
89 
90 #endif
91