vizml work
[pspp] / src / output / spv / spv.h
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2017 Free Software Foundation, Inc.
3
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.
8
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.
13
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/>. */
16
17 #ifndef OUTPUT_SPV_H
18 #define OUTPUT_SPV_H 1
19
20 /* SPSS Viewer (SPV) file reader.
21
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.
27  */
28
29 #include <stdbool.h>
30 #include <stddef.h>
31 #include <stdint.h>
32 #include "libpspp/compiler.h"
33
34 struct fmt_spec;
35 struct pivot_table;
36 struct spv_data;
37 struct spv_reader;
38 struct spvlb_table;
39 struct string;
40 struct _xmlDoc;
41
42 /* SPV files. */
43
44 char *spv_open (const char *filename, struct spv_reader **) WARN_UNUSED_RESULT;
45 void spv_close (struct spv_reader *);
46
47 char *spv_detect (const char *filename) WARN_UNUSED_RESULT;
48
49 const char *spv_get_errors (const struct spv_reader *);
50 void spv_clear_errors (struct spv_reader *);
51
52 struct spv_item *spv_get_root (const struct spv_reader *);
53 void spv_item_dump (const struct spv_item *, int indentation);
54
55 const struct page_setup *spv_get_page_setup (const struct spv_reader *);
56
57 /* Items.
58
59    An spv_item represents of the elements that can occur in an SPV file.  Items
60    form a tree because "heading" items can have an arbitrary number of child
61    items, which in turn may also be headings.  The root item, that is, the item
62    returned by spv_get_root(), is always a heading. */
63
64 enum spv_item_type
65   {
66     SPV_ITEM_HEADING,
67     SPV_ITEM_TEXT,
68     SPV_ITEM_TABLE,
69     SPV_ITEM_GRAPH,
70     SPV_ITEM_MODEL,
71     SPV_ITEM_OBJECT,
72     SPV_ITEM_TREE,
73   };
74
75 const char *spv_item_type_to_string (enum spv_item_type);
76
77 #define SPV_CLASSES                                \
78     SPV_CLASS(CHARTS, "charts")                    \
79     SPV_CLASS(HEADINGS, "headings")                \
80     SPV_CLASS(LOGS, "logs")                        \
81     SPV_CLASS(MODELS, "models")                    \
82     SPV_CLASS(TABLES, "tables")                    \
83     SPV_CLASS(TEXTS, "texts")                      \
84     SPV_CLASS(TREES, "trees")                      \
85     SPV_CLASS(WARNINGS, "warnings")                \
86     SPV_CLASS(OUTLINEHEADERS, "outlineheaders")    \
87     SPV_CLASS(PAGETITLE, "pagetitle")              \
88     SPV_CLASS(NOTES, "notes")                      \
89     SPV_CLASS(UNKNOWN, "unknown")                  \
90     SPV_CLASS(OTHER, "other")
91 enum spv_item_class
92   {
93 #define SPV_CLASS(ENUM, NAME) SPV_CLASS_##ENUM,
94     SPV_CLASSES
95 #undef SPV_CLASS
96   };
97 enum
98   {
99 #define SPV_CLASS(ENUM, NAME) +1
100     SPV_N_CLASSES = SPV_CLASSES
101 #undef SPV_CLASS
102 };
103 #define SPV_ALL_CLASSES ((1u << SPV_N_CLASSES) - 1)
104
105 const char *spv_item_class_to_string (enum spv_item_class);
106 enum spv_item_class spv_item_class_from_string (const char *);
107
108 struct spv_item
109   {
110     struct spv_reader *spv;
111     struct spv_item *parent;
112     size_t parent_idx;         /* item->parent->children[parent_idx] == item */
113
114     bool error;
115
116     char *structure_member;
117
118     enum spv_item_type type;
119     char *label;
120     char *command_id;           /* Unique command identifier. */
121
122     /* Whether the item is visible.
123        For SPV_ITEM_HEADING, false indicates that the item is collapsed.
124        For SPV_ITEM_TABLE, false indicates that the item is not shown. */
125     bool visible;
126
127     /* SPV_ITEM_HEADING only. */
128     struct spv_item **children;
129     size_t n_children, allocated_children;
130
131     /* SPV_ITEM_TABLE only. */
132     struct pivot_table *table;    /* NULL if not yet loaded. */
133     struct spv_legacy_properties *legacy_properties;
134     char *subtype;
135
136     /* SPV_ITEM_GRAPH only. */
137     bool graph;
138
139     /* SPV_ITEM_TABLE and SPV_ITEM_GRAPH only. */
140     char *bin_member;
141     char *xml_member;
142
143     /* SPV_ITEM_TEXT only.  */
144     struct pivot_value *text;
145
146     /* SPV_ITEM_OBJECT only. */
147     char *object_type;
148     char *uri;
149   };
150
151 void spv_item_format_path (const struct spv_item *, struct string *);
152
153 void spv_item_load (const struct spv_item *);
154
155 enum spv_item_type spv_item_get_type (const struct spv_item *);
156 enum spv_item_class spv_item_get_class (const struct spv_item *);
157
158 const char *spv_item_get_label (const struct spv_item *);
159
160 bool spv_item_is_heading (const struct spv_item *);
161 size_t spv_item_get_n_children (const struct spv_item *);
162 struct spv_item *spv_item_get_child (const struct spv_item *, size_t idx);
163
164 bool spv_item_is_table (const struct spv_item *);
165 struct pivot_table *spv_item_get_table (const struct spv_item *);
166
167 bool spv_item_is_graph (const struct spv_item *);
168 void spv_item_get_graph (const struct spv_item *);
169
170 bool spv_item_is_text (const struct spv_item *);
171 const struct pivot_value *spv_item_get_text (const struct spv_item *);
172
173 bool spv_item_is_visible (const struct spv_item *);
174
175 #define SPV_ITEM_FOR_EACH(ITER, ROOT) \
176   for ((ITER) = (ROOT); (ITER) != NULL; (ITER) = spv_item_next(ITER))
177 #define SPV_ITEM_FOR_EACH_SKIP_ROOT(ITER, ROOT) \
178   for ((ITER) = (ROOT); ((ITER) = spv_item_next(ITER)) != NULL; )
179 struct spv_item *spv_item_next (const struct spv_item *);
180
181 const struct spv_item *spv_item_get_parent (const struct spv_item *);
182 size_t spv_item_get_level (const struct spv_item *);
183
184 const char *spv_item_get_member_name (const struct spv_item *);
185 const char *spv_item_get_command_id (const struct spv_item *);
186 const char *spv_item_get_subtype (const struct spv_item *);
187
188 char *spv_item_get_structure (const struct spv_item *, struct _xmlDoc **)
189   WARN_UNUSED_RESULT;
190
191 bool spv_item_is_light_table (const struct spv_item *);
192 char *spv_item_get_light_table (const struct spv_item *,
193                                     struct spvlb_table **)
194   WARN_UNUSED_RESULT;
195 char *spv_item_get_raw_light_table (const struct spv_item *,
196                                     void **data, size_t *size)
197   WARN_UNUSED_RESULT;
198
199 bool spv_item_is_legacy_table (const struct spv_item *);
200 char *spv_item_get_raw_legacy_data (const struct spv_item *item,
201                                     void **data, size_t *size)
202   WARN_UNUSED_RESULT;
203 char *spv_item_get_legacy_data (const struct spv_item *, struct spv_data *)
204   WARN_UNUSED_RESULT;
205 char *spv_item_get_legacy_table (const struct spv_item *, struct _xmlDoc **)
206   WARN_UNUSED_RESULT;
207
208 char *spv_decode_fmt_spec (uint32_t u32, struct fmt_spec *) WARN_UNUSED_RESULT;
209
210 #endif /* output/spv/spv.h */