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
40extern "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
69typedef uint32_t weed_size_t;
70typedef int32_t weed_error_t;
71typedef void *weed_voidptr_t;
72typedef 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
79typedef struct _weed_data weed_data_t;
80#ifdef __LIBWEED__
81struct _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
93typedef struct _weed_leaf weed_leaf_t;
94#ifdef __LIBWEED__
95#define _CACHE_SIZE_ 64
96
97struct _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
110struct _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
130typedef void *(*weed_malloc_f)(size_t);
131typedef void (*weed_free_f)(void *);
132typedef void *(*weed_memset_f)(void *, int, size_t);
133typedef void *(*weed_memcpy_f)(void *, const void *, size_t);
134
135/* added in ABI 200 */
136typedef void *(*weed_realloc_f)(void *, size_t);
137typedef void *(*weed_calloc_f)(size_t, size_t);
138typedef void *(*weed_memmove_f)(void *, const void *, size_t);
139
140typedef weed_plant_t *(*weed_plant_new_f)(int32_t plant_type);
141typedef char **(*weed_plant_list_leaves_f)(weed_plant_t *, weed_size_t *nleaves);
142typedef 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);
144typedef weed_error_t (*weed_leaf_get_f)(weed_plant_t *, const char *key, int32_t idx, weed_voidptr_t value);
145typedef weed_size_t (*weed_leaf_num_elements_f)(weed_plant_t *, const char *key);
146typedef weed_size_t (*weed_leaf_element_size_f)(weed_plant_t *, const char *key, int32_t idx);
147typedef uint32_t (*weed_leaf_seed_type_f)(weed_plant_t *, const char *key);
148typedef uint32_t (*weed_leaf_get_flags_f)(weed_plant_t *, const char *key);
150typedef 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 */
154typedef weed_error_t (*weed_leaf_set_flags_f)(weed_plant_t *, const char *key, uint32_t flags);
155typedef weed_error_t (*weed_leaf_set_private_data_f)(weed_plant_t *, const char *key, void *data);
156typedef 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__)
164#define WEED_INIT_ALLBUGFIXES (1<<0)
165
167#define WEED_INIT_DEBUGMODE (1<<1)
168
169int32_t weed_get_abi_version(void);
170
171#endif
172
173#ifdef __WEED_HOST__
174weed_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__
EXPORTED weed_error_t weed_init(int32_t abi, uint64_t init_flags)
Definition: weed.c:286
EXPORTED int32_t weed_get_abi_version(void)
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
void *(* weed_calloc_f)(size_t, size_t)
Definition: weed.h:137
__WEED_FN_DEF__ weed_plant_list_leaves_f weed_plant_list_leaves
Definition: weed.h:182
uint32_t(* weed_leaf_get_flags_f)(weed_plant_t *, const char *key)
Definition: weed.h:148
__WEED_FN_DEF__ weed_leaf_set_f weed_leaf_set
Definition: weed.h:180
__WEED_FN_DEF__ weed_memset_f weed_memset
Definition: weed.h:196
__WEED_FN_DEF__ weed_calloc_f weed_calloc
Definition: weed.h:200
void *(* weed_memcpy_f)(void *, const void *, size_t)
Definition: weed.h:133
char **(* weed_plant_list_leaves_f)(weed_plant_t *, weed_size_t *nleaves)
Definition: weed.h:141
int32_t weed_error_t
Definition: weed.h:70
__WEED_FN_DEF__ weed_plant_free_f weed_plant_free
Definition: weed.h:189
weed_size_t(* weed_leaf_num_elements_f)(weed_plant_t *, const char *key)
Definition: weed.h:145
__WEED_FN_DEF__ weed_memcpy_f weed_memcpy
Definition: weed.h:195
__WEED_FN_DEF__ weed_realloc_f weed_realloc
Definition: weed.h:199
__WEED_FN_DEF__ weed_plant_new_f weed_plant_new
Definition: weed.h:181
void *(* weed_memmove_f)(void *, const void *, size_t)
Definition: weed.h:138
__WEED_FN_DEF__ weed_leaf_get_flags_f weed_leaf_get_flags
Definition: weed.h:186
#define __WEED_FN_DEF__
Definition: weed.h:65
weed_error_t(* weed_leaf_get_f)(weed_plant_t *, const char *key, int32_t idx, weed_voidptr_t value)
Definition: weed.h:144
void(* weed_funcptr_t)()
Definition: weed.h:72
weed_error_t(* weed_plant_free_f)(weed_plant_t *)
Definition: weed.h:149
void(* weed_free_f)(void *)
Definition: weed.h:131
__WEED_FN_DEF__ weed_malloc_f weed_malloc
Definition: weed.h:193
void * weed_voidptr_t
Definition: weed.h:71
weed_leaf_t weed_plant_t
Definition: weed.h:125
weed_error_t(* weed_leaf_delete_f)(weed_plant_t *, const char *key)
Definition: weed.h:150
__WEED_FN_DEF__ weed_leaf_seed_type_f weed_leaf_seed_type
Definition: weed.h:185
__WEED_FN_DEF__ weed_memmove_f weed_memmove
Definition: weed.h:201
weed_plant_t *(* weed_plant_new_f)(int32_t plant_type)
Definition: weed.h:140
struct _weed_data weed_data_t
Definition: weed.h:79
__WEED_FN_DEF__ weed_free_f weed_free
Definition: weed.h:194
void *(* weed_memset_f)(void *, int, size_t)
Definition: weed.h:132
__WEED_FN_DEF__ weed_leaf_element_size_f weed_leaf_element_size
Definition: weed.h:184
uint32_t(* weed_leaf_seed_type_f)(weed_plant_t *, const char *key)
Definition: weed.h:147
weed_plant_t * weed_plantptr_t
Definition: weed.h:128
__WEED_FN_DEF__ weed_leaf_delete_f weed_leaf_delete
Definition: weed.h:190
weed_size_t(* weed_leaf_element_size_f)(weed_plant_t *, const char *key, int32_t idx)
Definition: weed.h:146
struct _weed_leaf weed_leaf_t
Definition: weed.h:93
uint32_t weed_size_t
Definition: weed.h:69
void *(* weed_malloc_f)(size_t)
Definition: weed.h:130
void *(* weed_realloc_f)(void *, size_t)
Definition: weed.h:136
__WEED_FN_DEF__ weed_leaf_num_elements_f weed_leaf_num_elements
Definition: weed.h:183
__WEED_FN_DEF__ weed_leaf_get_f weed_leaf_get
Definition: weed.h:179