1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 2017 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 #define OUTPUT_SPV_H 1
20 /* SPSS Viewer (SPV) file reader.
22 An SPV file, represented as struct spv_reader, contains a number of
23 top-level headings, each of which recursively contains other headings and
24 tables. Here, we model a heading, text, table, or other element as an
25 "item", and a an SPV file as a single root item that contains each of the
26 top-level headings as a child item.
34 #include "libpspp/compiler.h"
46 char *spv_open (const char *filename, struct spv_reader **) WARN_UNUSED_RESULT;
47 void spv_close (struct spv_reader *);
49 char *spv_detect (const char *filename) WARN_UNUSED_RESULT;
51 const char *spv_get_errors (const struct spv_reader *);
52 void spv_clear_errors (struct spv_reader *);
54 struct spv_item *spv_get_root (const struct spv_reader *);
55 void spv_item_dump (const struct spv_item *, int indentation);
57 const struct page_setup *spv_get_page_setup (const struct spv_reader *);
61 An spv_item represents of the elements that can occur in an SPV file. Items
62 form a tree because "heading" items can have an arbitrary number of child
63 items, which in turn may also be headings. The root item, that is, the item
64 returned by spv_get_root(), is always a heading. */
77 const char *spv_item_type_to_string (enum spv_item_type);
80 SPV_CLASS(CHARTS, "charts") \
81 SPV_CLASS(HEADINGS, "headings") \
82 SPV_CLASS(LOGS, "logs") \
83 SPV_CLASS(MODELS, "models") \
84 SPV_CLASS(TABLES, "tables") \
85 SPV_CLASS(TEXTS, "texts") \
86 SPV_CLASS(TREES, "trees") \
87 SPV_CLASS(WARNINGS, "warnings") \
88 SPV_CLASS(OUTLINEHEADERS, "outlineheaders") \
89 SPV_CLASS(PAGETITLE, "pagetitle") \
90 SPV_CLASS(NOTES, "notes") \
91 SPV_CLASS(UNKNOWN, "unknown") \
92 SPV_CLASS(OTHER, "other")
95 #define SPV_CLASS(ENUM, NAME) SPV_CLASS_##ENUM,
101 #define SPV_CLASS(ENUM, NAME) +1
102 SPV_N_CLASSES = SPV_CLASSES
105 #define SPV_ALL_CLASSES ((1u << SPV_N_CLASSES) - 1)
107 const char *spv_item_class_to_string (enum spv_item_class);
108 enum spv_item_class spv_item_class_from_string (const char *);
112 struct spv_reader *spv;
113 struct spv_item *parent;
114 size_t parent_idx; /* item->parent->children[parent_idx] == item */
118 char *structure_member;
120 enum spv_item_type type;
121 char *label; /* Localized label. */
122 char *command_id; /* Non-localized unique command identifier. */
124 /* Whether the item is visible.
125 For SPV_ITEM_HEADING, false indicates that the item is collapsed.
126 For SPV_ITEM_TABLE, false indicates that the item is not shown. */
129 /* SPV_ITEM_HEADING only. */
130 struct spv_item **children;
131 size_t n_children, allocated_children;
133 /* SPV_ITEM_TABLE only. */
134 struct pivot_table *table; /* NULL if not yet loaded. */
135 struct pivot_table_look *table_look;
140 /* SPV_ITEM_TEXT only. */
141 struct pivot_value *text;
143 /* SPV_ITEM_IMAGE only. */
145 cairo_surface_t *image;
148 void spv_item_format_path (const struct spv_item *, struct string *);
150 void spv_item_load (const struct spv_item *);
152 enum spv_item_type spv_item_get_type (const struct spv_item *);
153 enum spv_item_class spv_item_get_class (const struct spv_item *);
155 const char *spv_item_get_label (const struct spv_item *);
157 bool spv_item_is_heading (const struct spv_item *);
158 size_t spv_item_get_n_children (const struct spv_item *);
159 struct spv_item *spv_item_get_child (const struct spv_item *, size_t idx);
161 bool spv_item_is_table (const struct spv_item *);
162 const struct pivot_table *spv_item_get_table (const struct spv_item *);
164 bool spv_item_is_text (const struct spv_item *);
165 const struct pivot_value *spv_item_get_text (const struct spv_item *);
167 bool spv_item_is_image (const struct spv_item *);
168 cairo_surface_t *spv_item_get_image (const struct spv_item *);
170 bool spv_item_is_visible (const struct spv_item *);
172 #define SPV_ITEM_FOR_EACH(ITER, ROOT) \
173 for ((ITER) = (ROOT); (ITER) != NULL; (ITER) = spv_item_next(ITER))
174 #define SPV_ITEM_FOR_EACH_SKIP_ROOT(ITER, ROOT) \
175 for ((ITER) = (ROOT); ((ITER) = spv_item_next(ITER)) != NULL;)
176 struct spv_item *spv_item_next (const struct spv_item *);
178 const struct spv_item *spv_item_get_parent (const struct spv_item *);
179 size_t spv_item_get_level (const struct spv_item *);
181 const char *spv_item_get_command_id (const struct spv_item *);
182 const char *spv_item_get_subtype (const struct spv_item *);
184 char *spv_item_get_structure (const struct spv_item *, struct _xmlDoc **)
187 bool spv_item_is_light_table (const struct spv_item *);
188 char *spv_item_get_light_table (const struct spv_item *,
189 struct spvlb_table **)
191 char *spv_item_get_raw_light_table (const struct spv_item *,
192 void **data, size_t *size)
195 bool spv_item_is_legacy_table (const struct spv_item *);
196 char *spv_item_get_raw_legacy_data (const struct spv_item *item,
197 void **data, size_t *size)
199 char *spv_item_get_legacy_data (const struct spv_item *, struct spv_data *)
201 char *spv_item_get_legacy_table (const struct spv_item *, struct _xmlDoc **)
204 void spv_item_set_table_look (struct spv_item *,
205 const struct pivot_table_look *);
207 char *spv_decode_fmt_spec (uint32_t u32, struct fmt_spec *) WARN_UNUSED_RESULT;
209 #endif /* output/spv/spv.h */