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