Make the Cairo and Pango libraries required rather than optional.
[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 <cairo.h>
30 #include <stdbool.h>
31 #include <stddef.h>
32 #include <stdint.h>
33
34 #include "libpspp/compiler.h"
35
36 struct fmt_spec;
37 struct pivot_table;
38 struct spv_data;
39 struct spv_reader;
40 struct spvlb_table;
41 struct string;
42 struct _xmlDoc;
43
44 /* SPV files. */
45
46 char *spv_open (const char *filename, struct spv_reader **) WARN_UNUSED_RESULT;
47 void spv_close (struct spv_reader *);
48
49 char *spv_detect (const char *filename) WARN_UNUSED_RESULT;
50
51 const char *spv_get_errors (const struct spv_reader *);
52 void spv_clear_errors (struct spv_reader *);
53
54 struct spv_item *spv_get_root (const struct spv_reader *);
55 void spv_item_dump (const struct spv_item *, int indentation);
56
57 const struct page_setup *spv_get_page_setup (const struct spv_reader *);
58
59 /* Items.
60
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. */
65
66 enum spv_item_type
67   {
68     SPV_ITEM_HEADING,
69     SPV_ITEM_TEXT,
70     SPV_ITEM_TABLE,
71     SPV_ITEM_GRAPH,
72     SPV_ITEM_MODEL,
73     SPV_ITEM_IMAGE,
74     SPV_ITEM_TREE,
75   };
76
77 const char *spv_item_type_to_string (enum spv_item_type);
78
79 #define SPV_CLASSES                                \
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")
93 enum spv_item_class
94   {
95 #define SPV_CLASS(ENUM, NAME) SPV_CLASS_##ENUM,
96     SPV_CLASSES
97 #undef SPV_CLASS
98   };
99 enum
100   {
101 #define SPV_CLASS(ENUM, NAME) +1
102     SPV_N_CLASSES = SPV_CLASSES
103 #undef SPV_CLASS
104 };
105 #define SPV_ALL_CLASSES ((1u << SPV_N_CLASSES) - 1)
106
107 const char *spv_item_class_to_string (enum spv_item_class);
108 enum spv_item_class spv_item_class_from_string (const char *);
109
110 struct spv_item
111   {
112     struct spv_reader *spv;
113     struct spv_item *parent;
114     size_t parent_idx;         /* item->parent->children[parent_idx] == item */
115
116     bool error;
117
118     char *structure_member;
119
120     enum spv_item_type type;
121     char *label;                /* Localized label. */
122     char *command_id;           /* Non-localized unique command identifier. */
123
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. */
127     bool visible;
128
129     /* SPV_ITEM_HEADING only. */
130     struct spv_item **children;
131     size_t n_children, allocated_children;
132
133     /* SPV_ITEM_TABLE only. */
134     struct pivot_table *table;    /* NULL if not yet loaded. */
135     struct pivot_table_look *table_look;
136     char *bin_member;
137     char *xml_member;
138     char *subtype;
139
140     /* SPV_ITEM_TEXT only.  */
141     struct pivot_value *text;
142
143     /* SPV_ITEM_IMAGE only. */
144     char *png_member;
145     cairo_surface_t *image;
146   };
147
148 void spv_item_format_path (const struct spv_item *, struct string *);
149
150 void spv_item_load (const struct spv_item *);
151
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 *);
154
155 const char *spv_item_get_label (const struct spv_item *);
156
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);
160
161 bool spv_item_is_table (const struct spv_item *);
162 const struct pivot_table *spv_item_get_table (const struct spv_item *);
163
164 bool spv_item_is_text (const struct spv_item *);
165 const struct pivot_value *spv_item_get_text (const struct spv_item *);
166
167 bool spv_item_is_image (const struct spv_item *);
168 cairo_surface_t *spv_item_get_image (const struct spv_item *);
169
170 bool spv_item_is_visible (const struct spv_item *);
171
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 *);
177
178 const struct spv_item *spv_item_get_parent (const struct spv_item *);
179 size_t spv_item_get_level (const struct spv_item *);
180
181 const char *spv_item_get_command_id (const struct spv_item *);
182 const char *spv_item_get_subtype (const struct spv_item *);
183
184 char *spv_item_get_structure (const struct spv_item *, struct _xmlDoc **)
185   WARN_UNUSED_RESULT;
186
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 **)
190   WARN_UNUSED_RESULT;
191 char *spv_item_get_raw_light_table (const struct spv_item *,
192                                     void **data, size_t *size)
193   WARN_UNUSED_RESULT;
194
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)
198   WARN_UNUSED_RESULT;
199 char *spv_item_get_legacy_data (const struct spv_item *, struct spv_data *)
200   WARN_UNUSED_RESULT;
201 char *spv_item_get_legacy_table (const struct spv_item *, struct _xmlDoc **)
202   WARN_UNUSED_RESULT;
203
204 void spv_item_set_table_look (struct spv_item *,
205                               const struct pivot_table_look *);
206
207 char *spv_decode_fmt_spec (uint32_t u32, struct fmt_spec *) WARN_UNUSED_RESULT;
208
209 #endif /* output/spv/spv.h */