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