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