* definition_free called with definition ref is decremented to 0.
*/
void (*definition_free)(struct definition *definition);
- /*
- * Definition copy function. Knows how to find the child
- * definition from the parent definition.
- */
- void (*copy)(struct stream_pos *dest, const struct format *fdest,
- struct stream_pos *src, const struct format *fsrc,
- struct definition *definition);
};
struct definition {
int ref; /* number of references to the definition */
};
+typedef int (*rw_dispatch)(struct stream_pos *pos,
+ struct definition *definition);
+
+/* Parent of per-plugin positions */
+struct stream_pos {
+ /* read/write dispatch table. Specific to plugin used for stream. */
+ rw_dispatch *rw_table; /* rw dispatch table */
+};
+
+static inline
+int generic_rw(struct stream_pos *pos, struct definition *definition)
+{
+ enum ctf_type_id dispatch_id = definition->declaration->id;
+ rw_dispatch call;
+
+ assert(pos->rw_table[dispatch_id] != NULL);
+ call = pos->rw_table[dispatch_id];
+ return call(pos, definition);
+}
+
/*
* Because we address in bits, bitfields end up being exactly the same as
* integers, except that their read/write functions must be able to deal with
struct definition_float {
struct definition p;
struct declaration_float *declaration;
+ struct definition_integer *sign;
+ struct definition_integer *mantissa;
+ struct definition_integer *exp;
/* Last values read */
long double value;
};
struct definition p;
struct declaration_string *declaration;
char *value; /* freed at definition_string teardown */
+ size_t len, alloc_len;
};
struct declaration_field {
struct field *
struct_definition_get_field_from_index(struct definition_struct *struct_definition,
int index);
+int struct_rw(struct stream_pos *pos, struct definition *definition);
/*
* The tag enumeration is validated to ensure that it contains only mappings
* to.
*/
struct field *variant_get_current_field(struct definition_variant *variant);
+int variant_rw(struct stream_pos *pos, struct definition *definition);
/*
* elem_declaration passed as parameter now belongs to the array. No
struct declaration_scope *parent_scope);
uint64_t array_len(struct definition_array *array);
struct definition *array_index(struct definition_array *array, uint64_t i);
+int array_rw(struct stream_pos *pos, struct definition *definition);
/*
* int_declaration and elem_declaration passed as parameter now belong
struct declaration_scope *parent_scope);
uint64_t sequence_len(struct definition_sequence *sequence);
struct definition *sequence_index(struct definition_sequence *sequence, uint64_t i);
+int sequence_rw(struct stream_pos *pos, struct definition *definition);
/*
* in: path (dot separated), out: q (GArray of GQuark)