libweed  2.0.0
weed.h
Go to the documentation of this file.
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 
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
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
126 #endif
127 
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);
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 #define WEED_INIT_ALLBUGFIXES (1<<0)
165 
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 
187 
188 /* plugins only got these in API 200 */
191 
192 #ifndef __LIBWEED__
197 
198 /* added in API 200 */
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)
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__
weed_leaf_set
__WEED_FN_DEF__ weed_leaf_set_f weed_leaf_set
Definition: weed.h:180
__WEED_FN_DEF__
#define __WEED_FN_DEF__
Definition: weed.h:65
weed_error_t
int32_t weed_error_t
Definition: weed.h:70
weed_size_t
uint32_t weed_size_t
Definition: weed.h:69
weed_init
EXPORTED weed_error_t weed_init(int32_t abi, uint64_t init_flags)
Definition: weed.c:286
weed_calloc
__WEED_FN_DEF__ weed_calloc_f weed_calloc
Definition: weed.h:200
weed_data_t
struct _weed_data weed_data_t
Definition: weed.h:79
weed_leaf_get
__WEED_FN_DEF__ weed_leaf_get_f weed_leaf_get
Definition: weed.h:179
weed_memset
__WEED_FN_DEF__ weed_memset_f weed_memset
Definition: weed.h:196
weed_plant_t
weed_leaf_t weed_plant_t
Definition: weed.h:125
weed_get_abi_version
EXPORTED int32_t weed_get_abi_version(void)
weed_leaf_delete_f
weed_error_t(* weed_leaf_delete_f)(weed_plant_t *, const char *key)
Definition: weed.h:150
weed_leaf_get_flags_f
uint32_t(* weed_leaf_get_flags_f)(weed_plant_t *, const char *key)
Definition: weed.h:148
weed_memmove
__WEED_FN_DEF__ weed_memmove_f weed_memmove
Definition: weed.h:201
weed_plant_list_leaves_f
char **(* weed_plant_list_leaves_f)(weed_plant_t *, weed_size_t *nleaves)
Definition: weed.h:141
weed_leaf_set_f
weed_error_t(* weed_leaf_set_f)(weed_plant_t *, const char *key, uint32_t seed_type, weed_size_t num_elems, weed_voidptr_t values)
Definition: weed.h:142
weed_leaf_element_size
__WEED_FN_DEF__ weed_leaf_element_size_f weed_leaf_element_size
Definition: weed.h:184
weed_leaf_get_flags
__WEED_FN_DEF__ weed_leaf_get_flags_f weed_leaf_get_flags
Definition: weed.h:186
weed_memmove_f
void *(* weed_memmove_f)(void *, const void *, size_t)
Definition: weed.h:138
weed_memset_f
void *(* weed_memset_f)(void *, int, size_t)
Definition: weed.h:132
weed_leaf_num_elements_f
weed_size_t(* weed_leaf_num_elements_f)(weed_plant_t *, const char *key)
Definition: weed.h:145
weed_leaf_element_size_f
weed_size_t(* weed_leaf_element_size_f)(weed_plant_t *, const char *key, int32_t idx)
Definition: weed.h:146
weed_memcpy
__WEED_FN_DEF__ weed_memcpy_f weed_memcpy
Definition: weed.h:195
weed_plant_list_leaves
__WEED_FN_DEF__ weed_plant_list_leaves_f weed_plant_list_leaves
Definition: weed.h:182
weed_leaf_seed_type_f
uint32_t(* weed_leaf_seed_type_f)(weed_plant_t *, const char *key)
Definition: weed.h:147
weed_leaf_get_f
weed_error_t(* weed_leaf_get_f)(weed_plant_t *, const char *key, int32_t idx, weed_voidptr_t value)
Definition: weed.h:144
weed_leaf_t
struct _weed_leaf weed_leaf_t
Definition: weed.h:93
weed_malloc
__WEED_FN_DEF__ weed_malloc_f weed_malloc
Definition: weed.h:193
weed_leaf_seed_type
__WEED_FN_DEF__ weed_leaf_seed_type_f weed_leaf_seed_type
Definition: weed.h:185
weed_realloc
__WEED_FN_DEF__ weed_realloc_f weed_realloc
Definition: weed.h:199
weed_calloc_f
void *(* weed_calloc_f)(size_t, size_t)
Definition: weed.h:137
weed_plant_free
__WEED_FN_DEF__ weed_plant_free_f weed_plant_free
Definition: weed.h:189
weed_plant_new
__WEED_FN_DEF__ weed_plant_new_f weed_plant_new
Definition: weed.h:181
weed_voidptr_t
void * weed_voidptr_t
Definition: weed.h:71
weed_leaf_num_elements
__WEED_FN_DEF__ weed_leaf_num_elements_f weed_leaf_num_elements
Definition: weed.h:183
weed_free
__WEED_FN_DEF__ weed_free_f weed_free
Definition: weed.h:194
weed_plant_free_f
weed_error_t(* weed_plant_free_f)(weed_plant_t *)
Definition: weed.h:149
weed_free_f
void(* weed_free_f)(void *)
Definition: weed.h:131
weed_plant_new_f
weed_plant_t *(* weed_plant_new_f)(int32_t plant_type)
Definition: weed.h:140
weed_funcptr_t
void(* weed_funcptr_t)()
Definition: weed.h:72
weed_leaf_delete
__WEED_FN_DEF__ weed_leaf_delete_f weed_leaf_delete
Definition: weed.h:190
weed_realloc_f
void *(* weed_realloc_f)(void *, size_t)
Definition: weed.h:136
weed_plantptr_t
weed_plant_t * weed_plantptr_t
Definition: weed.h:128
weed_memcpy_f
void *(* weed_memcpy_f)(void *, const void *, size_t)
Definition: weed.h:133
weed_malloc_f
void *(* weed_malloc_f)(size_t)
Definition: weed.h:130