1 /* WEED is free software; you can redistribute it and/or 2 modify it under the terms of the GNU Lesser General Public 3 License as published by the Free Software Foundation; either 4 version 3 of the License, or (at your option) any later version. 5 6 Weed is distributed in the hope that it will be useful, 7 but WITHOUT ANY WARRANTY; without even the implied warranty of 8 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 9 Lesser General Public License for more details. 10 11 You should have received a copy of the GNU Lesser General Public 12 License along with this source code; if not, write to the Free Software 13 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 14 15 Weed is developed by: 16 17 Gabriel "Salsaman" Finch - http://lives-video.com 18 19 partly based on LiViDO, which was developed by: 20 Niels Elburg - http://veejay.sf.net 21 Denis "Jaromil" Rojo - http://freej.dyne.org 22 Tom Schouten - http://zwizwa.fartit.com 23 Andraz Tori - http://cvs.cinelerra.org 24 25 reviewed with suggestions and contributions from: 26 Silvano "Kysucix" Galliani - http://freej.dyne.org 27 Kentaro Fukuchi - http://megaui.net/fukuchi 28 Jun Iio - http://www.malib.net 29 Carlo Prelz - http://www2.fluido.as:8080/ 30 */ 31 32 /* (C) G. Finch, 2005 - 2019 */ 33 34 ///////////////// host applications should #include weed-host.h before this header ///////////////////////// 35 36 #ifndef __WEED_H__ 37 #define __WEED_H__ 38 39 #ifdef __cplusplus 40 extern "C" 41 { 42 #endif /* __cplusplus */ 43 44 #define __need_size_t // for malloc, realloc, etc 45 #define __need_NULL 46 #include <stddef.h> 47 #include <inttypes.h> 48 49 /* API / ABI version * 200 */ 50 #define WEED_ABI_VERSION 200 51 #define WEED_API_VERSION WEED_ABI_VERSION 52 53 #define WEED_TRUE 1 54 #define WEED_FALSE 0 55 56 #define WEED_ABI_CHECK_VERSION(version) (WEED_ABI_VERSION >= version) 57 #define WEED_API_CHECK_VERSION(version) WEED_ABI_CHECK_VERSION(version) 58 59 #ifdef __LIBWEED__ 60 #define __WEED_FN_DEF__ extern 61 #else 62 #ifdef __WEED_HOST__ 63 #define __WEED_FN_DEF__ 64 #else 65 #define __WEED_FN_DEF__ static 66 #endif 67 #endif 68 69 typedef uint32_t weed_size_t; 70 typedef int32_t weed_error_t; 71 typedef void *weed_voidptr_t; 72 typedef void (*weed_funcptr_t)(); 73 74 #define WEED_VOIDPTR_SIZE sizeof(weed_voidptr_t) 75 #define WEED_FUNCPTR_SIZE sizeof(weed_funcptr_t) 76 77 #ifndef HAVE_WEED_DATA_T 78 #define HAVE_WEED_DATA_T 79 typedef struct _weed_data weed_data_t; 80 #ifdef __LIBWEED__ 81 struct _weed_data { 82 weed_size_t size; 83 union { 84 weed_voidptr_t voidptr; 85 weed_funcptr_t funcptr; 86 } value; 87 }; 88 #endif 89 #endif 90 91 #ifndef HAVE_WEED_LEAF_T 92 #define HAVE_WEED_LEAF_T 93 typedef struct _weed_leaf weed_leaf_t; 94 #ifdef __LIBWEED__ 95 #define _CACHE_SIZE_ 64 /// altering _CACHE_SIZE_ requires recompiling libweed 96 97 struct _weed_leaf_nopadding { 98 uint32_t key_hash; 99 weed_size_t num_elements; 100 weed_leaf_t *next; 101 const char *key; 102 uint32_t seed_type, flags; 103 weed_data_t **data; 104 void *private_data; 105 }; 106 107 /* N.B. padbytes are not wasted, they may be used to store key names provided they fit */ 108 #define _WEED_PADBYTES_ ((_CACHE_SIZE_-(int)(sizeof(struct _weed_leaf_nopadding)))%_CACHE_SIZE_) 109 110 struct _weed_leaf { 111 uint32_t key_hash; 112 weed_size_t num_elements; 113 weed_leaf_t *next; 114 const char *key; 115 uint32_t seed_type, flags; 116 weed_data_t **data; 117 void *private_data; 118 char padding[_WEED_PADBYTES_]; 119 }; 120 #endif 121 #endif 122 123 #ifndef HAVE_WEED_PLANT_T 124 #define HAVE_WEED_PLANT_T 125 typedef weed_leaf_t weed_plant_t; 126 #endif 127 128 typedef weed_plant_t * weed_plantptr_t; 129 130 typedef void *(*weed_malloc_f)(size_t); 131 typedef void (*weed_free_f)(void *); 132 typedef void *(*weed_memset_f)(void *, int, size_t); 133 typedef void *(*weed_memcpy_f)(void *, const void *, size_t); 134 135 /* added in ABI 200 */ 136 typedef void *(*weed_realloc_f)(void *, size_t); 137 typedef void *(*weed_calloc_f)(size_t, size_t); 138 typedef void *(*weed_memmove_f)(void *, const void *, size_t); 139 140 typedef weed_plant_t *(*weed_plant_new_f)(int32_t plant_type); 141 typedef char **(*weed_plant_list_leaves_f)(weed_plant_t *, weed_size_t *nleaves); 142 typedef weed_error_t (*weed_leaf_set_f)(weed_plant_t *, const char *key, uint32_t seed_type, weed_size_t num_elems, 143 weed_voidptr_t values); 144 typedef weed_error_t (*weed_leaf_get_f)(weed_plant_t *, const char *key, int32_t idx, weed_voidptr_t value); 145 typedef weed_size_t (*weed_leaf_num_elements_f)(weed_plant_t *, const char *key); 146 typedef weed_size_t (*weed_leaf_element_size_f)(weed_plant_t *, const char *key, int32_t idx); 147 typedef uint32_t (*weed_leaf_seed_type_f)(weed_plant_t *, const char *key); 148 typedef uint32_t (*weed_leaf_get_flags_f)(weed_plant_t *, const char *key); 149 typedef weed_error_t (*weed_plant_free_f)(weed_plant_t *); 150 typedef weed_error_t (*weed_leaf_delete_f)(weed_plant_t *, const char *key); 151 152 #if defined (__WEED_HOST__) || defined (__LIBWEED__) 153 /* host only functions */ 154 typedef weed_error_t (*weed_leaf_set_flags_f)(weed_plant_t *, const char *key, uint32_t flags); 155 typedef weed_error_t (*weed_leaf_set_private_data_f)(weed_plant_t *, const char *key, void *data); 156 typedef weed_error_t (*weed_leaf_get_private_data_f)(weed_plant_t *, const char *key, void **data_return); 157 158 __WEED_FN_DEF__ weed_leaf_set_flags_f weed_leaf_set_flags; 159 __WEED_FN_DEF__ weed_leaf_set_private_data_f weed_leaf_set_private_data; 160 __WEED_FN_DEF__ weed_leaf_get_private_data_f weed_leaf_get_private_data; 161 162 #if defined(__WEED_HOST__) || defined(__LIBWEED__) 163 /// set this flagbit to enable potential backported bugfixes which may theoretically impact existing behaviour 164 #define WEED_INIT_ALLBUGFIXES (1<<0) 165 166 /// set this to expose extra debug functions 167 #define WEED_INIT_DEBUGMODE (1<<1) 168 169 int32_t weed_get_abi_version(void); 170 171 #endif 172 173 #ifdef __WEED_HOST__ 174 weed_error_t weed_init(int32_t abi, uint64_t init_flags); 175 #endif 176 177 #endif 178 179 __WEED_FN_DEF__ weed_leaf_get_f weed_leaf_get; 180 __WEED_FN_DEF__ weed_leaf_set_f weed_leaf_set; 181 __WEED_FN_DEF__ weed_plant_new_f weed_plant_new; 182 __WEED_FN_DEF__ weed_plant_list_leaves_f weed_plant_list_leaves; 183 __WEED_FN_DEF__ weed_leaf_num_elements_f weed_leaf_num_elements; 184 __WEED_FN_DEF__ weed_leaf_element_size_f weed_leaf_element_size; 185 __WEED_FN_DEF__ weed_leaf_seed_type_f weed_leaf_seed_type; 186 __WEED_FN_DEF__ weed_leaf_get_flags_f weed_leaf_get_flags; 187 188 /* plugins only got these in API 200 */ 189 __WEED_FN_DEF__ weed_plant_free_f weed_plant_free; 190 __WEED_FN_DEF__ weed_leaf_delete_f weed_leaf_delete; 191 192 #ifndef __LIBWEED__ 193 __WEED_FN_DEF__ weed_malloc_f weed_malloc; 194 __WEED_FN_DEF__ weed_free_f weed_free; 195 __WEED_FN_DEF__ weed_memcpy_f weed_memcpy; 196 __WEED_FN_DEF__ weed_memset_f weed_memset; 197 198 /* added in API 200 */ 199 __WEED_FN_DEF__ weed_realloc_f weed_realloc; 200 __WEED_FN_DEF__ weed_calloc_f weed_calloc; 201 __WEED_FN_DEF__ weed_memmove_f weed_memmove; 202 #endif 203 204 /* plant types */ 205 #define WEED_PLANT_UNKNOWN 0 206 #define WEED_PLANT_FIRST_CUSTOM 16384 207 #define WEED_PLANT_GENERIC (WEED_PLANT_FIRST_CUSTOM - 1) ///< "don't care" value, if UNKNOWN cannot be used 208 209 /* Weed errors */ 210 #define WEED_SUCCESS 0 211 #define WEED_ERROR_MEMORY_ALLOCATION 1 212 #define WEED_ERROR_NOSUCH_LEAF 2 213 #define WEED_ERROR_NOSUCH_ELEMENT 3 214 #define WEED_ERROR_WRONG_SEED_TYPE 4 215 #define WEED_ERROR_IMMUTABLE 5 216 #define WEED_ERROR_UNDELETABLE 6 217 #define WEED_ERROR_CONCURRENCY 7 218 #define WEED_ERROR_BADVERSION 8 219 220 #define WEED_ERROR_FIRST_CUSTOM 1024 221 222 /* Seed types */ 223 #define WEED_SEED_INVALID 0 // the "seed_type" of a non-existent leaf 224 225 /* Fundamental seeds */ 226 #define WEED_SEED_INT 1 // int32_t / uint_32t 227 #define WEED_SEED_DOUBLE 2 // 64 bit signed double 228 #define WEED_SEED_BOOLEAN 3 // int32_t: should only be set to values WEED_TRUE or WEED_FALSE 229 #define WEED_SEED_STRING 4 // NUL terminated array of char 230 #define WEED_SEED_INT64 5 // int64_t 231 232 /* Pointer seeds */ 233 #define WEED_SEED_FUNCPTR 64 // weed_funcptr_t 234 #define WEED_SEED_VOIDPTR 65 // weed_voidptr_t 235 #define WEED_SEED_PLANTPTR 66 // weed_plant_t * 236 237 #define WEED_SEED_FIRST_CUSTOM 1024 238 239 /* flag bits */ 240 #define WEED_FLAG_UNDELETABLE (1 << 0) // leaf value may be altered but it cannot be deleted 241 #define WEED_FLAG_IMMUTABLE (1 << 1) // leaf value may not be changed, but it may be deleted 242 #define WEED_FLAG_RESERVED_13 (1 << 2) // reserved for future use by Weed 243 #define WEED_FLAG_RESERVED_12 (1 << 3) // reserved for future use by Weed 244 #define WEED_FLAG_RESERVED_11 (1 << 4) // reserved for future use by Weed 245 #define WEED_FLAG_RESERVED_10 (1 << 5) // reserved for future use by Weed 246 #define WEED_FLAG_RESERVED_9 (1 << 6) // reserved for future use by Weed 247 #define WEED_FLAG_RESERVED_8 (1 << 7) // reserved for future use by Weed 248 #define WEED_FLAG_RESERVED_7 (1 << 8) // reserved for future use by Weed 249 #define WEED_FLAG_RESERVED_6 (1 << 9) // reserved for future use by Weed 250 #define WEED_FLAG_RESERVED_5 (1 << 10) // reserved for future use by Weed 251 #define WEED_FLAG_RESERVED_4 (1 << 11) // reserved for future use by Weed 252 #define WEED_FLAG_RESERVED_3 (1 << 12) // reserved for future use by Weed 253 #define WEED_FLAG_RESERVED_2 (1 << 13) // reserved for future use by Weed 254 #define WEED_FLAG_RESERVED_1 (1 << 14) // reserved for future use by Weed 255 #define WEED_FLAG_RESERVED_0 (1 << 15) // reserved for future use by Weed 256 #define WEED_FLAGBITS_RESERVED (WEED_FLAG_FIRST_CUSTOM - 1 \ 257 - WEED_FLAG_UNDELETABLE - WEED_FLAG_IMMUTABLE) 258 #define WEED_FLAG_FIRST_CUSTOM (1 << 16) // bits 16 - 31 left for custom use 259 260 /* mandatory leaf for all WEED_PLANTs, WEED_SEED_INT */ 261 #define WEED_LEAF_TYPE "type" 262 263 /* may be used by any plant to set the API / ABI version, WEED_SEED_INT */ 264 #define WEED_LEAF_WEED_API_VERSION "weed_api_version" 265 #define WEED_LEAF_WEED_ABI_VERSION WEED_LEAF_WEED_API_VERSION 266 267 #ifdef __cplusplus 268 } 269 #endif /* __cplusplus */ 270 271 #endif // #ifndef __WEED_H__ 272