Volksdata 1.0b7
RDF library
Loading...
Searching...
No Matches
codec.h
Go to the documentation of this file.
1
19
20#ifndef VOLK_CODEC_H
21#define VOLK_CODEC_H
22
23// Add new codec implementations to this include list.
27
28/*
29 * Define supported codecs.
30 *
31 * Add new codec implementations to this table.
32 */
33#define CODEC_TBL \
34/* #enum suffix #fmt #codec if */ \
35 ENTRY( NT, nt, nt_codec ) \
36 ENTRY( TTL, ttl, ttl_codec ) \
37 ENTRY( TRIG, trig, trig_codec ) \
38
39
44
45#define ENTRY(a, b, c) VOLK_CODEC_FMT_##a,
47typedef enum {
50#undef ENTRY
51
52
58typedef struct codec_iter_wrapper_t {
59 void *it;
62
63
70#define ENTRY(a, b, c) case VOLK_CODEC_FMT_##a: return &c;
71static inline const VOLK_Codec *
72VOLK_codec_get (const VOLK_CodecFormat fmt)
73{
74 switch (fmt) {
76 default:
77 log_warn ("No codec found for format `%s`.", fmt);
78 return NULL;
79 }
80}
81#undef ENTRY
82
83
84/*
85 * Codec operations.
86 */
87
88
100static inline VOLK_rc
101VOLK_codec_encode_term (const VOLK_Term *term, char **out, VOLK_CodecFormat fmt)
102{
103 const VOLK_Codec *codec = VOLK_codec_get (fmt);
105 return VOLK_NOT_IMPL_ERR;
106
107 return codec->encode_term (term, out);
108}
109
110
123static inline VOLK_CodecIterator *
124VOLK_codec_encode_gr_init (
125 const VOLK_Graph *gr, void *udata, VOLK_CodecFormat fmt)
126{
127 const VOLK_Codec *codec = VOLK_codec_get (fmt);
128 if (UNLIKELY (!(codec->features & VOLK_CODEC_FEAT_ENCODE_GR))) {
129 log_error ("Graph encoding is not supported by this codec.");
130 return NULL;
131 }
132 VOLK_CodecIterator *itw = malloc (sizeof *itw);
133 NLNL (itw);
134 itw->codec = codec;
135 itw->it = codec->encode_graph_init (gr, udata);
136
137 return itw;
138}
139
140
154static inline VOLK_rc
155VOLK_codec_encode_gr_iter (VOLK_CodecIterator *itw, char **res)
156{ return itw->codec->encode_graph_iter (itw->it, res); }
157
158
163static inline void
164VOLK_codec_encode_gr_done (VOLK_CodecIterator *itw)
165{
166 itw->codec->encode_graph_done (itw->it);
167 free (itw);
168}
169
170
171
186static inline VOLK_CodecIterator *
187VOLK_codec_encode_dset_init (const VOLK_Graph **dset, VOLK_CodecFormat fmt)
188{
189 const VOLK_Codec *codec = VOLK_codec_get (fmt);
190 if (UNLIKELY (!(codec->features & VOLK_CODEC_FEAT_ENCODE_DS))) {
191 log_error ("Dataset encoding is not supported by this codec.");
192 return NULL;
193 }
194
195 VOLK_CodecIterator *itw = malloc (sizeof *itw);
196 NLNL (itw);
197 itw->codec = codec;
198 itw->it = codec->encode_dset_init (dset);
199
200 return itw;
201}
202
203
219static inline VOLK_rc
220VOLK_codec_encode_dset_iter (
221 VOLK_CodecIterator *itw, const VOLK_Graph *gr, char **res)
222{ return itw->codec->encode_dset_iter (itw->it, gr, res); }
223
224
225
232static inline void
233VOLK_codec_encode_dset_done (VOLK_CodecIterator *itw)
234{
235 itw->codec->encode_dset_done (itw->it);
236 free (itw);
237}
238
239
248static inline VOLK_CodecIterator *
249VOLK_codec_encode_store_init (VOLK_Store *store, VOLK_CodecFormat fmt)
250{
251 const VOLK_Codec *codec = VOLK_codec_get (fmt);
253 log_error ("Store encoding is not supported by this codec.");
254 return NULL;
255 }
256
257 VOLK_CodecIterator *itw = malloc (sizeof *itw);
258 NLNL (itw);
259 itw->codec = codec;
260 itw->it = codec->encode_store_init (store);
261
262 return itw;
263}
264
265
282static inline VOLK_rc
283VOLK_codec_encode_store_iter (VOLK_CodecIterator *itw , char **res)
284{ return itw->codec->encode_store_iter (itw->it, res); }
285
286
291static inline void
292VOLK_codec_encode_store_done (VOLK_CodecIterator *itw)
293{
294 itw->codec->encode_store_done (itw->it);
295 free (itw);
296}
297
298
299/*
300 * Decode functions.
301 */
302
303static inline VOLK_rc
304VOLK_codec_decode_term (
305 const char *data, VOLK_Term **out, VOLK_CodecFormat fmt)
306{
307 const VOLK_Codec *codec = VOLK_codec_get (fmt);
309 return VOLK_NOT_IMPL_ERR;
310 return codec->decode_term (data, out);
311}
312
313
327static inline VOLK_rc
328VOLK_codec_decode_gr (
329 FILE *fh, const char *data, VOLK_Graph *gr, VOLK_CodecFormat fmt,
330 size_t *ct, char **err)
331{
332 const VOLK_Codec *codec = VOLK_codec_get (fmt);
334 return VOLK_NOT_IMPL_ERR;
335
336 return codec->decode_graph (fh, data, gr, ct, err);
337}
338
339
356static inline VOLK_rc
357VOLK_codec_decode_dset (
358 FILE *fh, const char *data, VOLK_Store *store, void *txn,
359 VOLK_CodecFormat fmt, size_t *ct, char **err)
360{
361 const VOLK_Codec *codec = VOLK_codec_get (fmt);
362 if (UNLIKELY (!(codec->features & VOLK_CODEC_FEAT_DECODE_DS))) {
363 log_error ("Store decoding is not supported by this codec.");
364 return VOLK_NOT_IMPL_ERR;
365 }
366
367 return codec->decode_dset (fh, data, store, txn, ct, err);
368}
369
370
371/*
372static inline VOLK_rc
373VOLK_codec_decode_dset_iter (
374 VOLK_CodecIterator *itw, VOLK_Graph **gr,
375 size_t *ct, char **err
376)
377{ return itw->codec->decode_dset_iter (itw->it, gr, ct, err); }
378
379
380static inline void
381VOLK_codec_decode_dset_done (VOLK_CodecIterator *itw)
382{
383 itw->codec->decode_dset_done (itw->it);
384 free (itw);
385}
386*/
387
388
389/* TODO
390static inline VOLK_rc
391VOLK_codec_decode_dset (
392 FILE *fh, const char *data, VOLK_Graph **out, VOLK_CodecFormat fmt)
393{
394 const VOLK_Codec *codec = VOLK_codec_get (fmt);
395 if (UNLIKELY (!(codec->features & VOLK_CODEC_FEAT_DECODE_DS)))
396 return VOLK_NOT_IMPL_ERR;
397
398 void *it = codec->decode_dset_init (fh, data);
399}
400*/
401
402/* TODO probably not needed.
403static inline VOLK_rc
404VOLK_codec_decode_store (
405 const VOLK_Store *store, char**res, VOLK_CodecFormat fmt)
406{
407 const VOLK_Codec *codec = VOLK_codec_get (fmt);
408 if (UNLIKELY (!(codec->features & VOLK_CODEC_FEAT_DECODE_STORE)))
409 return VOLK_NOT_IMPL_ERR;
410
411 void *it = codec->decode_store_init (store);
412}
413*/
414
416
417#endif // VOLK_CODEC_H
#define CODEC_TBL
Definition codec.h:33
#define UNLIKELY(x)
Definition core.h:39
@ VOLK_CODEC_FEAT_DECODE_GR
Supports decoding a graph.
@ VOLK_CODEC_FEAT_ENCODE_GR
Supports encoding a graph.
@ VOLK_CODEC_FEAT_ENCODE_DS
Supports encoding a data set.
@ VOLK_CODEC_FEAT_ENCODE_STORE
Supports encoding a whole store.
@ VOLK_CODEC_FEAT_DECODE_TERM
Supports decoding a single term.
@ VOLK_CODEC_FEAT_ENCODE_TERM
Supports encoding a single term.
@ VOLK_CODEC_FEAT_DECODE_DS
Supports decoding a data set.
VOLK_CodecFormat
Codec formats available.
Definition codec.h:47
#define NLNL(exp)
Log error and return NULL if exp is NULL.
Definition core.h:374
int VOLK_rc
Definition core.h:79
#define VOLK_NOT_IMPL_ERR
Functionality is not implemented.
Definition core.h:138
Codec iterator.
Definition codec.h:58
const VOLK_Codec * codec
Definition codec.h:60
Prototype for initializing a dataset decoding loop.
encode_ds_init_fn_t encode_dset_init
dataset encoder initialization.
encode_store_init_fn_t encode_store_init
store encoder initialization.
encode_ds_done_fn_t encode_dset_done
dataset encoder finalization.
encode_term_fn_t encode_term
Feature flags.
encode_store_done_fn_t encode_store_done
store encoder finalization.
decode_gr_fn_t decode_graph
Graph decoder function.
encode_gr_done_fn_t encode_graph_done
Graph encoder finalization.
encode_gr_init_fn_t encode_graph_init
Graph encoder initialization.
encode_ds_iter_fn_t encode_dset_iter
dataset encoder iteration.
VOLK_CodecFeatures features
encode_store_iter_fn_t encode_store_iter
store encoder iteration.
decode_term_fn_t decode_term
Term decoder function.
decode_ds_fn_t decode_dset
dataset decoder initialization.
encode_gr_iter_fn_t encode_graph_iter
Graph encoder iteration.
Store structure.
Definition store.h:59
RDF term.
Definition term.h:62