+void output_item_set_command_name (struct output_item *, const char *);
+void output_item_set_command_name_nocopy (struct output_item *, char *);
+
+char *output_item_get_subtype (const struct output_item *);
+
+void output_item_add_spv_info (struct output_item *);
+
+void output_item_dump (const struct output_item *, int indentation);
+\f
+/* In-order traversal of a tree of output items. */
+
+struct output_iterator_node
+ {
+ const struct output_item *group;
+ size_t idx;
+ };
+
+struct output_iterator
+ {
+ const struct output_item *cur;
+ struct output_iterator_node *nodes;
+ size_t n, allocated;
+ };
+#define OUTPUT_ITERATOR_INIT(ITEM) { .cur = ITEM }
+
+/* Iteration functions. */
+void output_iterator_init (struct output_iterator *,
+ const struct output_item *);
+void output_iterator_destroy (struct output_iterator *);
+void output_iterator_next (struct output_iterator *);
+
+/* Iteration helper macros. */
+#define OUTPUT_ITEM_FOR_EACH(ITER, ROOT) \
+ for (output_iterator_init (ITER, ROOT); (ITER)->cur; \
+ output_iterator_next (ITER))
+#define OUTPUT_ITEM_FOR_EACH_SKIP_ROOT(ITER, ROOT) \
+ for (output_iterator_init (ITER, ROOT), output_iterator_next (ITER); \
+ (ITER)->cur; output_iterator_next (ITER))
+\f
+/* OUTPUT_ITEM_CHART. */
+struct output_item *chart_item_create (struct chart *);
+\f
+/* OUTPUT_ITEM_GROUP. */
+struct output_item *group_item_create (const char *command_name,
+ const char *label);
+struct output_item *group_item_create_nocopy (char *command_name, char *label);
+
+void group_item_add_child (struct output_item *parent,
+ struct output_item *child);
+
+struct output_item *root_item_create (void);
+
+struct output_item *group_item_clone_empty (const struct output_item *);
+\f
+/* OUTPUT_ITEM_IMAGE. */
+
+struct output_item *image_item_create (cairo_surface_t *);
+\f
+/* OUTPUT_ITEM_MESSAGE. */
+
+struct output_item *message_item_create (const struct msg *);
+
+const struct msg *message_item_get_msg (const struct output_item *);
+
+struct output_item *message_item_to_text_item (struct output_item *);
+\f
+/* OUTPUT_ITEM_PAGE_BREAK. */
+
+struct output_item *page_break_item_create (void);
+\f
+/* OUTPUT_ITEM_TABLE. */
+
+struct output_item *table_item_create (struct pivot_table *);
+\f
+/* OUTPUT_ITEM_TEXT. */
+
+struct output_item *text_item_create (enum text_item_subtype,
+ const char *text, const char *label);
+struct output_item *text_item_create_nocopy (enum text_item_subtype,
+ char *text, char *label);
+struct output_item *text_item_create_value (enum text_item_subtype,
+ struct pivot_value *value,
+ char *label);
+
+enum text_item_subtype text_item_get_subtype (const struct output_item *);
+char *text_item_get_plain_text (const struct output_item *);
+
+bool text_item_append (struct output_item *dst, const struct output_item *src);
+
+struct output_item *text_item_to_table_item (struct output_item *);
+
+const char *text_item_subtype_to_string (enum text_item_subtype);
+\f
+/* An informational node for output items that were read from an .spv file.
+ This is mostly for debugging and troubleshooting purposes with the
+ pspp-output program. */
+struct spv_info
+ {
+ /* The .spv file. */
+ struct zip_reader *zip_reader;
+
+ /* True if there was an error reading the output item (e.g. because of
+ corruption or because PSPP doesn't understand the format.) */
+ bool error;
+
+ /* Zip member names. All may be NULL. */
+ char *structure_member;
+ char *xml_member;
+ char *bin_member;
+ char *png_member;
+ };
+
+void spv_info_destroy (struct spv_info *);
+struct spv_info *spv_info_clone (const struct spv_info *);
+size_t spv_info_get_members (const struct spv_info *, const char **members,
+ size_t allocated_members);
+