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