+int variant_definition_set_tag(struct definition_variant *variant,
+ struct bt_definition *enum_tag);
+/*
+ * Returns the field selected by the current tag value.
+ * field returned only valid as long as the variant structure is not appended
+ * to.
+ */
+struct bt_definition *bt_variant_get_current_field(struct definition_variant *variant);
+int bt_variant_rw(struct bt_stream_pos *pos, struct bt_definition *definition);
+
+/*
+ * elem_declaration passed as parameter now belongs to the array. No
+ * need to free it explicitly. "len" is the number of elements in the
+ * array.
+ */
+struct declaration_array *
+ bt_array_declaration_new(size_t len, struct bt_declaration *elem_declaration,
+ struct declaration_scope *parent_scope);
+uint64_t bt_array_len(struct definition_array *array);
+struct bt_definition *bt_array_index(struct definition_array *array, uint64_t i);
+int bt_array_rw(struct bt_stream_pos *pos, struct bt_definition *definition);
+GString *bt_get_char_array(const struct bt_definition *field);
+int bt_get_array_len(const struct bt_definition *field);
+
+/*
+ * int_declaration and elem_declaration passed as parameter now belong
+ * to the sequence. No need to free them explicitly.
+ */
+struct declaration_sequence *
+ bt_sequence_declaration_new(const char *length_name,
+ struct bt_declaration *elem_declaration,
+ struct declaration_scope *parent_scope);
+uint64_t bt_sequence_len(struct definition_sequence *sequence);
+struct bt_definition *bt_sequence_index(struct definition_sequence *sequence, uint64_t i);
+int bt_sequence_rw(struct bt_stream_pos *pos, struct bt_definition *definition);
+
+/*
+ * in: path (dot separated), out: q (GArray of GQuark)
+ */
+void bt_append_scope_path(const char *path, GArray *q);
+
+/*
+ * Lookup helpers.
+ */
+struct bt_definition *bt_lookup_definition(const struct bt_definition *definition,
+ const char *field_name);
+struct bt_definition *bt_lookup_definition_by_quark(const struct bt_definition *definition,
+ GQuark quark);
+struct definition_integer *bt_lookup_integer(const struct bt_definition *definition,
+ const char *field_name,
+ int signedness);
+struct definition_enum *bt_lookup_enum(const struct bt_definition *definition,
+ const char *field_name,
+ int signedness);
+struct bt_definition *bt_lookup_variant(const struct bt_definition *definition,
+ const char *field_name);
+
+static inline
+const char *rem_(const char *str)
+{
+ if (str[0] == '_')
+ return &str[1];
+ else
+ return str;
+}