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