struct definition {
struct declaration *declaration;
int index; /* Position of the definition in its container */
+ GQuark name; /* Field name in its container (or 0 if unset) */
int ref; /* number of references to the definition */
};
-typedef void (*rw_dispatch)(struct stream_pos *pos,
- struct definition *definition);
+typedef int (*rw_dispatch)(struct stream_pos *pos,
+ struct definition *definition);
/* Parent of per-plugin positions */
struct stream_pos {
};
static inline
-void generic_rw(struct stream_pos *pos, struct definition *definition)
+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];
- call(pos, definition);
+ return call(pos, definition);
}
/*
struct declaration *declaration;
};
-struct field {
- GQuark name;
- struct definition *definition;
-};
-
struct declaration_struct {
struct declaration p;
GHashTable *fields_by_name; /* Tuples (field name, field index) */
struct definition p;
struct declaration_struct *declaration;
struct definition_scope *scope;
- GArray *fields; /* Array of struct field */
+ GPtrArray *fields; /* Array of pointers to struct definition */
};
struct declaration_untagged_variant {
struct declaration_variant *declaration;
struct definition_scope *scope;
struct definition *enum_tag;
- GArray *fields; /* Array of struct field */
- struct field *current_field; /* Last field read */
+ GPtrArray *fields; /* Array of pointers to struct definition */
+ struct definition *current_field; /* Last field read */
};
struct declaration_array {
struct definition p;
struct declaration_array *declaration;
struct definition_scope *scope;
- GArray *elems; /* struct field */
+ GPtrArray *elems; /* Array of pointers to struct definition */
};
struct declaration_sequence {
struct declaration_sequence *declaration;
struct definition_scope *scope;
struct definition_integer *len;
- GArray *elems; /* struct field */
+ GPtrArray *elems; /* Array of pointers to struct definition */
};
int register_declaration(GQuark declaration_name,
struct declaration_field *
struct_declaration_get_field_from_index(struct declaration_struct *struct_declaration,
int index);
-struct field *
+struct definition *
struct_definition_get_field_from_index(struct definition_struct *struct_definition,
int index);
-void struct_rw(struct stream_pos *pos, struct definition *definition);
+int struct_rw(struct stream_pos *pos, struct definition *definition);
/*
* The tag enumeration is validated to ensure that it contains only mappings
* field returned only valid as long as the variant structure is not appended
* to.
*/
-struct field *variant_get_current_field(struct definition_variant *variant);
-void variant_rw(struct stream_pos *pos, struct definition *definition);
+struct definition *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);
-void array_rw(struct stream_pos *pos, struct definition *definition);
+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);
-void sequence_rw(struct stream_pos *pos, struct definition *definition);
+int sequence_rw(struct stream_pos *pos, struct definition *definition);
/*
* in: path (dot separated), out: q (GArray of GQuark)