+int variant_definition_set_tag(struct definition_variant *variant,
+ struct 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 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
+ * need to free it explicitly. "len" is the number of elements in the
+ * array.
+ */
+struct declaration_array *
+ array_declaration_new(size_t len, struct declaration *elem_declaration,
+ 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);
+GString *get_char_array(const struct definition *field);
+int get_array_len(const struct definition *field);
+
+/*
+ * int_declaration and elem_declaration passed as parameter now belong
+ * to the sequence. No need to free them explicitly.
+ */
+struct declaration_sequence *
+ sequence_declaration_new(const char *length_name,
+ struct declaration *elem_declaration,
+ 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)
+ */
+void append_scope_path(const char *path, GArray *q);
+
+/*
+ * Lookup helpers.
+ */
+struct definition *lookup_definition(const struct definition *definition,
+ const char *field_name);
+struct definition_integer *lookup_integer(const struct definition *definition,
+ const char *field_name,
+ int signedness);
+struct definition_enum *lookup_enum(const struct definition *definition,
+ const char *field_name,
+ int signedness);
+struct definition *lookup_variant(const struct definition *definition,
+ const char *field_name);
+
+static inline
+const char *rem_(const char *str)
+{
+ if (str[0] == '_')
+ return &str[1];
+ else
+ return str;
+}