html: Pop up tooltip with table notes in output.
[pspp] / src / output / pivot-table.h
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2017-2018 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_PIVOT_TABLE_H
18 #define OUTPUT_PIVOT_TABLE_H 1
19
20 #include <stdint.h>
21 #include <time.h>
22 #include "data/format.h"
23 #include "data/settings.h"
24 #include "libpspp/compiler.h"
25 #include "libpspp/hmap.h"
26 #include "output/table.h"
27
28 struct pivot_value;
29 struct variable;
30 union value;
31
32 /* Pivot tables.
33
34    Pivot tables are PSPP's primary form of output.  They are analogous to the
35    pivot tables you might be familiar with from spreadsheets and databases.
36    See https://en.wikipedia.org/wiki/Pivot_table for a brief introduction to
37    the overall concept of a pivot table.
38
39    In PSPP, the most important internal pieces of a pivot table are:
40
41    - Title.  Every pivot table has a title that is displayed above it.  It also
42      has an optional caption (displayed below it) and corner text (displayed in
43      the upper left corner).
44
45    - Dimensions.  A dimension consists of zero or more categories.  A category
46      has a label, such as "df" or "Asymp. Sig." or 123 or a variable name.  The
47      categories are the leaves of a tree whose non-leaf nodes form groups of
48      categories.  The tree always has a root group whose label is the name of
49      the dimension.
50
51    - Axes.  A table has three axes: column, row, and layer.  Each dimension is
52      assigned to an axis, and each axis has zero or more dimensions.  When an
53      axis has more than one dimension, they are ordered from innermost to
54      outermost.
55
56    - Data.  A table's data consists of zero or more cells.  Each cell maps from
57      a category for each dimension to a value, which is commonly a number but
58      could also be a variable name or an arbitrary text string.
59
60    Creating a pivot table usually consists of the following steps:
61
62    1. Create the table with pivot_table_create(), passing in the title.
63       It's commonly useful to set up a few options at this point:
64
65       - If empty rows or columns should not be displayed, set ->omit_empty to
66         true.
67
68       - Set the format to use for "count" values with
69         pivot_table_set_weight_var() or pivot_table_set_weight_format().
70
71    2. Create each dimension with pivot_dimension_create() and populate it with
72       categories and, possibly, with groups that contain the categories.  This
73       call also assigns the dimension to an axis.
74
75       In simple cases, only a call to pivot_dimension_create() is needed.
76       Other functions such as pivot_category_create_group() can be used for
77       hierarchies of categories.
78
79       Sometimes it's easier to create categories in tandem with inserting data,
80       for example by adding a category for a variable just before inserting the
81       first cell for that variable.  In that case, creating categories and
82       inserting data can be interleaved.
83
84    3. Insert data.  For each cell, supply the category indexes, which are
85       assigned starting from 0 in the order in which the categories were
86       created in step 2, and the value to go in the cell.  If the table has a
87       small, fixed number of dimensions, functions like, e.g.
88       pivot_table_put3() for 3 dimensions, can be used.  The general function
89       pivot_table_put() works for other cases.
90
91    4. Output the table for user consumption.  Use pivot_table_submit(). */
92 \f
93 /* Pivot table display styling. */
94
95 /* Areas of a pivot table for styling purposes. */
96 enum pivot_area
97   {
98     PIVOT_AREA_TITLE,
99     PIVOT_AREA_CAPTION,
100     PIVOT_AREA_FOOTER,          /* Footnotes. */
101     PIVOT_AREA_CORNER,          /* Top-left corner. */
102     PIVOT_AREA_COLUMN_LABELS,
103     PIVOT_AREA_ROW_LABELS,
104     PIVOT_AREA_DATA,
105     PIVOT_AREA_LAYERS,          /* Layer indication. */
106     PIVOT_N_AREAS
107   };
108
109 const char *pivot_area_to_string (enum pivot_area);
110
111 /* Table borders for styling purposes. */
112 enum pivot_border
113   {
114     PIVOT_BORDER_TITLE,
115
116     /* Outer frame. */
117     PIVOT_BORDER_OUTER_LEFT,
118     PIVOT_BORDER_OUTER_TOP,
119     PIVOT_BORDER_OUTER_RIGHT,
120     PIVOT_BORDER_OUTER_BOTTOM,
121
122     /* Inner frame. */
123     PIVOT_BORDER_INNER_LEFT,
124     PIVOT_BORDER_INNER_TOP,
125     PIVOT_BORDER_INNER_RIGHT,
126     PIVOT_BORDER_INNER_BOTTOM,
127
128     /* Data area. */
129     PIVOT_BORDER_DATA_LEFT,
130     PIVOT_BORDER_DATA_TOP,
131
132     /* Dimensions. */
133     PIVOT_BORDER_DIM_ROW_HORZ,
134     PIVOT_BORDER_DIM_ROW_VERT,
135     PIVOT_BORDER_DIM_COL_HORZ,
136     PIVOT_BORDER_DIM_COL_VERT,
137
138     /* Categories. */
139     PIVOT_BORDER_CAT_ROW_HORZ,
140     PIVOT_BORDER_CAT_ROW_VERT,
141     PIVOT_BORDER_CAT_COL_HORZ,
142     PIVOT_BORDER_CAT_COL_VERT,
143
144     PIVOT_N_BORDERS
145   };
146
147 const char *pivot_border_to_string (enum pivot_border);
148
149 /* Sizing for rows or columns of a rendered table.  The comments below talk
150    about columns and their widths but they apply equally to rows and their
151    heights. */
152 struct pivot_table_sizing
153   {
154     /* Specific column widths, in 1/96" units. */
155     int *widths;
156     size_t n_widths;
157
158     /* Specific page breaks: 0-based columns after which a page break must
159        occur, e.g. a value of 1 requests a break after the second column. */
160     size_t *breaks;
161     size_t n_breaks;
162
163     /* Keeps: columns to keep together on a page if possible. */
164     struct pivot_keep *keeps;
165     size_t n_keeps;
166   };
167
168 void pivot_table_sizing_uninit (struct pivot_table_sizing *);
169
170 /* A set of columns to keep together on a page if possible, e.g. ofs=1, n=10
171    requests keeping together the 2nd through 11th columns. */
172 struct pivot_keep
173   {
174     size_t ofs;                 /* 0-based first column. */
175     size_t n;                   /* Number of columns. */
176   };
177 \f
178 /* Axes. */
179
180 enum pivot_axis_type
181   {
182     PIVOT_AXIS_LAYER,
183     PIVOT_AXIS_ROW,
184     PIVOT_AXIS_COLUMN,
185
186     PIVOT_N_AXES
187   };
188
189 const char *pivot_axis_type_to_string (enum pivot_axis_type);
190
191 /* An axis within a pivot table. */
192 struct pivot_axis
193   {
194     /* dimensions[0] is the innermost dimension,
195        dimensions[1] is the next outer dimension,
196        ...
197        dimensions[n_dimensions - 1] is the outermost dimension. */
198     struct pivot_dimension **dimensions;
199     size_t n_dimensions;
200
201     /* The number of rows or columns along the axis,
202        that is, the product of dimension[*]->n_leaves.
203        It is 0 if any dimension has 0 leaves. */
204     size_t extent;
205
206     /* Sum of dimensions[*]->label_depth. */
207     size_t label_depth;
208   };
209
210 /* Successively assigns to INDEXES (which should be a "size_t *") each of the
211    combinations of the categories in AXIS's dimensions, in lexicographic order
212    with the innermost dimension iterating most quickly.
213
214    The value assigned to INDEXES is dynamically allocated.  If the client
215    breaks out of the loop prematurely, it needs to free it with free(). */
216 #define PIVOT_AXIS_FOR_EACH(INDEXES, AXIS)                              \
217   for ((INDEXES) = NULL;                                                \
218        ((INDEXES) = pivot_axis_iterator_next (INDEXES, AXIS)) != NULL;)
219 size_t *pivot_axis_iterator_next (size_t *indexes, const struct pivot_axis *);
220 \f
221 /* Dimensions.
222
223    A pivot_dimension identifies the categories associated with a single
224    dimension within a multidimensional pivot table.
225
226    A dimension contains a collection of categories, which are the leaves in a
227    tree of groups.
228
229    (A dimension or a group can contain zero categories, but this is unusual.
230    If a dimension contains no categories, then its table cannot contain any
231    data.)
232 */
233 struct pivot_dimension
234   {
235     /* table->axes[axis_type]->dimensions[level] == dimension. */
236     struct pivot_table *table;
237     enum pivot_axis_type axis_type;
238     size_t level;               /* 0 for innermost dimension within axis. */
239
240     /* table->dimensions[top_index] == dimension. */
241     size_t top_index;
242
243     /* Hierarchy of categories within the dimension.  The groups and categories
244        are sorted in the order that should be used for display.  This might be
245        different from the original order produced for output if the user
246        adjusted it.
247
248        The root must always be a group, although it is allowed to have no
249        subcategories. */
250     struct pivot_category *root;
251
252     /* All of the leaves reachable via the root.
253
254        The indexing for presentation_leaves is presentation order, thus
255        presentation_leaves[i]->presentation_index == i.  This order is the same
256        as would be produced by an in-order traversal of the groups.  It is the
257        order into which the user reordered or sorted the categories.
258
259        The indexing for data_leaves is that used for idx[] in struct
260        pivot_cell, thus data_leaves[i]->data_index == i.  This might differ
261        from what an in-order traversal of 'root' would yield, if the user
262        reordered categories. */
263     struct pivot_category **data_leaves;
264     struct pivot_category **presentation_leaves;
265     size_t n_leaves, allocated_leaves;
266
267     /* Display. */
268     bool hide_all_labels;
269
270     /* Number of rows or columns needed to express the labels. */
271     int label_depth;
272   };
273
274 struct pivot_dimension *pivot_dimension_create (
275   struct pivot_table *, enum pivot_axis_type, const char *name, ...)
276   SENTINEL (0);
277 #define pivot_dimension_create(...) \
278   pivot_dimension_create(__VA_ARGS__, NULL_SENTINEL)
279 struct pivot_dimension *pivot_dimension_create__ (struct pivot_table *,
280                                                   enum pivot_axis_type,
281                                                   struct pivot_value *name);
282
283 void pivot_dimension_destroy (struct pivot_dimension *);
284
285 void pivot_dimension_dump (const struct pivot_dimension *, int indentation);
286 \f
287 /* A pivot_category is a leaf (a category) or a group:
288
289    - For a leaf, neither index is SIZE_MAX.
290
291    - For a group, both indexes are SIZE_MAX.
292
293    Do not use 'subs' or 'n_subs' to determine whether a category is a group,
294    because a group may (pathologically) have no leaves. */
295 struct pivot_category
296   {
297     struct pivot_value *name;
298     struct pivot_category *parent;
299     struct pivot_dimension *dimension;
300     size_t label_depth, extra_depth;
301
302     /* Groups only.
303
304        If show_label is true, then the group itself has a row (or a column)
305        giving the group's name.  Otherwise, the group's own name is not
306        displayed. */
307     struct pivot_category **subs; /* Child categories or groups. */
308     size_t n_subs, allocated_subs;
309     bool show_label;            /* Display a label for the group itself? */
310     bool show_label_in_corner;
311
312     /* Leaf only. */
313     struct fmt_spec format;
314     size_t group_index;        /* In ->parent->subs[]. */
315     size_t data_index;         /* In ->dimension->data_leaves[]. */
316     size_t presentation_index; /* In ->dimension->presentation_leaves[]. */
317   };
318
319 static inline bool
320 pivot_category_is_group (const struct pivot_category *category)
321 {
322   return category->data_index == SIZE_MAX;
323 }
324
325 static inline bool
326 pivot_category_is_leaf (const struct pivot_category *category)
327 {
328   return !pivot_category_is_group (category);
329 }
330
331 /* Creating leaf categories. */
332 int pivot_category_create_leaves (struct pivot_category *parent, ...)
333   SENTINEL (0);
334 #define pivot_category_create_leaves(...) \
335   pivot_category_create_leaves(__VA_ARGS__, NULL_SENTINEL)
336
337 int pivot_category_create_leaf (
338   struct pivot_category *parent, struct pivot_value *name);
339 int pivot_category_create_leaf_rc (
340   struct pivot_category *parent, struct pivot_value *name, const char *rc);
341
342 /* Creating category groups. */
343 struct pivot_category *pivot_category_create_group (
344   struct pivot_category *parent, const char *name, ...) SENTINEL (0);
345 #define pivot_category_create_group(...) \
346   pivot_category_create_group(__VA_ARGS__, NULL_SENTINEL)
347 struct pivot_category *pivot_category_create_group__ (
348   struct pivot_category *parent, struct pivot_value *name);
349
350 void pivot_category_destroy (struct pivot_category *);
351
352 /* Pivot result classes.
353
354    These are used to mark leaf categories as having particular types of data,
355    to set their numeric formats.  The formats that actually get used for these
356    classes are in the result_classes[] global array in pivot-table.c, except
357    that PIVOT_RC_OTHER comes from settings_get_format() and PIVOT_RC_COUNT
358    should come from the weight variable in the dataset's dictionary. */
359 #define PIVOT_RC_OTHER ("RC_OTHER")
360 #define PIVOT_RC_INTEGER ("RC_INTEGER")
361 #define PIVOT_RC_CORRELATION ("RC_CORRELATIONS")
362 #define PIVOT_RC_SIGNIFICANCE ("RC_SIGNIFICANCE")
363 #define PIVOT_RC_PERCENT ("RC_PERCENT")
364 #define PIVOT_RC_RESIDUAL ("RC_RESIDUAL")
365 #define PIVOT_RC_COUNT ("RC_COUNT")
366
367 bool pivot_result_class_change (const char *, const struct fmt_spec *);
368 \f
369 /* Styling for a pivot table.
370
371    The division between this and the style information in struct pivot_table
372    seems fairly arbitrary.  The ultimate reason for the division is simply
373    because that's how SPSS documentation and file formats do it. */
374 struct pivot_table_look
375   {
376     /* Reference count.  A pivot_table_look may be shared between multiple
377        owners, indicated by a reference count greater than 1.  When this is the
378        case, the pivot_table must not be modified. */
379     int ref_cnt;
380
381     char *name;                 /* May be null. */
382
383     /* General properties. */
384     bool omit_empty;
385     bool row_labels_in_corner;
386     int width_ranges[TABLE_N_AXES][2];      /* In 1/96" units. */
387
388     /* Footnote display settings. */
389     bool show_numeric_markers;
390     bool footnote_marker_superscripts;
391
392     /* Styles. */
393     struct table_area_style areas[PIVOT_N_AREAS];
394     struct table_border_style borders[PIVOT_N_BORDERS];
395
396     /* Print settings. */
397     bool print_all_layers;
398     bool paginate_layers;
399     bool shrink_to_fit[TABLE_N_AXES];
400     bool top_continuation, bottom_continuation;
401     char *continuation;
402     size_t n_orphan_lines;
403   };
404
405 const struct pivot_table_look *pivot_table_look_get_default (void);
406 void pivot_table_look_set_default (const struct pivot_table_look *);
407
408 char *pivot_table_look_read (const char *, struct pivot_table_look **)
409   WARN_UNUSED_RESULT;
410
411 const struct pivot_table_look *pivot_table_look_builtin_default (void);
412 struct pivot_table_look *pivot_table_look_new_builtin_default (void);
413 struct pivot_table_look *pivot_table_look_ref (
414   const struct pivot_table_look *);
415 void pivot_table_look_unref (struct pivot_table_look *);
416 struct pivot_table_look *pivot_table_look_unshare (struct pivot_table_look *);
417 \f
418 /* A pivot table.  See the top of this file for more information. */
419 struct pivot_table
420   {
421     /* Reference count.  A pivot_table may be shared between multiple owners,
422        indicated by a reference count greater than 1.  When this is the case,
423        the pivot_table must not be modified. */
424     int ref_cnt;
425
426     /* Styling. */
427     struct pivot_table_look *look;
428
429     /* Display settings. */
430     bool rotate_inner_column_labels;
431     bool rotate_outer_row_labels;
432     bool show_grid_lines;
433     bool show_caption;
434     size_t *current_layer; /* axis[PIVOT_AXIS_LAYER].n_dimensions elements. */
435     enum settings_value_show show_values;
436     enum settings_value_show show_variables;
437     struct fmt_spec weight_format;
438
439     /* Column and row sizing and page breaks.
440        sizing[TABLE_HORZ] is for columns, sizing[TABLE_VERT] is for rows. */
441     struct pivot_table_sizing sizing[TABLE_N_AXES];
442
443     /* Format settings. */
444     int epoch;
445     char decimal;               /* Usually ',' or '.'. */
446     char grouping;              /* Usually '.' or ','. */
447     char *ccs[5];               /* Custom currency. */
448     double small;
449
450     /* Command information. */
451     char *command_local;        /* May be NULL. */
452     char *command_c;            /* May be NULL. */
453     char *language;             /* May be NULL. */
454     char *locale;               /* May be NULL. */
455
456     /* Source information. */
457     char *dataset;              /* May be NULL. */
458     char *datafile;             /* May be NULL. */
459     time_t date;                /* May be 0 if unknown. */
460
461     /* Footnotes. */
462     struct pivot_footnote **footnotes;
463     size_t n_footnotes, allocated_footnotes;
464
465     /* Titles. */
466     struct pivot_value *title;
467     struct pivot_value *subtype;  /* Same as spv_item's subtype. */
468     struct pivot_value *corner_text;
469     struct pivot_value *caption;
470     char *notes;                /* Shown as tooltip. */
471
472     /* Dimensions. */
473     struct pivot_dimension **dimensions;
474     size_t n_dimensions;
475
476     /* Allocation of dimensions to rows, columns, and layers. */
477     struct pivot_axis axes[PIVOT_N_AXES];
478
479     struct hmap cells;          /* Contains "struct pivot_cell"s. */
480   };
481
482 /* Creating and destroy pivot tables. */
483 struct pivot_table *pivot_table_create (const char *title);
484 struct pivot_table *pivot_table_create__ (struct pivot_value *title,
485                                           const char *subtype);
486 struct pivot_table *pivot_table_create_for_text (struct pivot_value *title,
487                                                  struct pivot_value *content);
488
489 struct pivot_table *pivot_table_ref (const struct pivot_table *);
490 void pivot_table_unref (struct pivot_table *);
491 bool pivot_table_is_shared (const struct pivot_table *);
492
493 /* Styling. */
494 const struct pivot_table_look *pivot_table_get_look (
495   const struct pivot_table *);
496 void pivot_table_set_look (struct pivot_table *,
497                            const struct pivot_table_look *);
498
499 /* Format of PIVOT_RC_COUNT cells. */
500 void pivot_table_set_weight_var (struct pivot_table *,
501                                  const struct variable *);
502 void pivot_table_set_weight_format (struct pivot_table *,
503                                     const struct fmt_spec *);
504
505 /* Query. */
506 bool pivot_table_is_empty (const struct pivot_table *);
507
508 /* Output. */
509 void pivot_table_submit (struct pivot_table *);
510
511 /* Data cells. */
512 void pivot_table_put (struct pivot_table *, const size_t *dindexes, size_t n,
513                       struct pivot_value *);
514 void pivot_table_put1 (struct pivot_table *, size_t idx1,
515                        struct pivot_value *);
516 void pivot_table_put2 (struct pivot_table *, size_t idx1, size_t idx2,
517                        struct pivot_value *);
518 void pivot_table_put3 (struct pivot_table *, size_t idx1, size_t idx2,
519                        size_t idx3, struct pivot_value *);
520 void pivot_table_put4 (struct pivot_table *, size_t idx1, size_t idx2,
521                        size_t idx3, size_t idx4, struct pivot_value *);
522
523 const struct pivot_value *pivot_table_get (const struct pivot_table *,
524                                            const size_t *dindexes);
525
526 struct pivot_value *pivot_table_get_rw (struct pivot_table *,
527                                         const size_t *dindexes);
528
529 /* Footnotes.
530
531    Use pivot_table_create_footnote() to create a footnote.
532    Use pivot_value_add_footnote() to add a reference to a footnote. */
533 struct pivot_footnote
534   {
535     size_t idx;
536     struct pivot_value *content;
537     struct pivot_value *marker;
538     bool show;
539   };
540
541 struct pivot_footnote *pivot_table_create_footnote (
542   struct pivot_table *, struct pivot_value *content);
543 struct pivot_footnote *pivot_table_create_footnote__ (
544   struct pivot_table *, size_t idx,
545   struct pivot_value *marker, struct pivot_value *content);
546
547 void pivot_footnote_destroy (struct pivot_footnote *);
548
549 /* Internals. */
550 void pivot_table_convert_indexes_ptod (const struct pivot_table *,
551                                        const size_t *pindexes[PIVOT_N_AXES],
552                                        size_t *dindexes);
553 size_t *pivot_table_enumerate_axis (const struct pivot_table *,
554                                     enum pivot_axis_type,
555                                     const size_t *layer_indexes,
556                                     bool omit_empty, size_t *n);
557 #define PIVOT_ENUMERATION_FOR_EACH(INDEXES, ENUMERATION, AXIS)  \
558   for ((INDEXES) = (ENUMERATION); *(INDEXES) != SIZE_MAX;       \
559        (INDEXES) += MAX (1, (AXIS)->n_dimensions))
560
561 void pivot_table_assign_label_depth (struct pivot_table *);
562
563 void pivot_table_dump (const struct pivot_table *, int indentation);
564 \f
565 /* pivot_value. */
566
567 enum pivot_value_type
568   {
569     PIVOT_VALUE_NUMERIC,          /* A value of a numeric variable. */
570     PIVOT_VALUE_STRING,           /* A value of a string variable. */
571     PIVOT_VALUE_VARIABLE,         /* Name of a variable. */
572     PIVOT_VALUE_TEXT,             /* Text. */
573     PIVOT_VALUE_TEMPLATE,         /* Templated text. */
574   };
575
576 /* A pivot_value is the content of a single pivot table cell.  A pivot_value is
577    also a pivot table's title, caption, footnote marker and contents, and so
578    on.
579
580    A given pivot_value is one of:
581
582    1. A number resulting from a calculation (PIVOT_VALUE_NUMERIC).  Use
583       pivot_value_new_number() to create such a pivot_value.
584
585       A numeric pivot_value has an associated display format (usually an F or
586       PCT format).  This format can be set directly on the pivot_value, but
587       that is not usually the easiest way.  Instead, it is usually true that
588       all of the values in a single category should have the same format
589       (e.g. all "Significance" values might use format F40.3), so PSPP makes
590       it easy to set the default format for a category while creating the
591       category.  See pivot_dimension_create() for more details.
592
593       For numbers that should be displayed as integers,
594       pivot_value_new_integer() can occasionally be a useful special case.
595
596    2. A numeric or string value obtained from data (PIVOT_VALUE_NUMERIC or
597       PIVOT_VALUE_STRING).  If such a value corresponds to a variable, then the
598       variable's name can be attached to the pivot_value.  If the value has a
599       value label, then that can also be attached.  When a label is present,
600       the user can control whether to show the value or the label or both.
601
602       Use pivot_value_new_var_value() to create pivot_values of these kinds.
603
604    3. A variable name (PIVOT_VALUE_VARIABLE).  The variable label, if any, can
605       be attached too, and again the user can control whether to show the value
606       or the label or both.
607
608    4. A text string (PIVOT_VALUE_TEXT).  The value stores the string in English
609       and translated into the output language (localized).  Use
610       pivot_value_new_text() or pivot_value_new_text_format() for those cases.
611       In some cases, only an English or a localized version is available for
612       one reason or another, although this is regrettable; in those cases, use
613       pivot_value_new_user_text() or pivot_value_new_user_text_nocopy().
614
615    (There is also a PIVOT_VALUE_TEMPLATE but PSPP does not yet create these
616    itself.)
617
618
619    Footnotes
620    =========
621
622    A pivot_value may reference any number of footnotes.  Use
623    pivot_value_add_footnote() to add a footnote reference.  The footnotes being
624    referenced must first be created with pivot_table_create_footnote().
625
626
627    Styling
628    =======
629
630    A pivot_value can have specific font and cell styles.  Only the user should
631    add these.
632 */
633 struct pivot_value
634   {
635     struct font_style *font_style;
636     struct cell_style *cell_style;
637
638     char **subscripts;
639     size_t n_subscripts;
640
641     char *superscript;
642
643     const struct pivot_footnote **footnotes;
644     size_t n_footnotes;
645
646     enum pivot_value_type type;
647     union
648       {
649         /* PIVOT_VALUE_NUMERIC. */
650         struct
651           {
652             double x;                 /* The numeric value. */
653             struct fmt_spec format;   /* Format to display 'x'. */
654             char *var_name;           /* May be NULL. */
655             char *value_label;        /* May be NULL. */
656             enum settings_value_show show; /* Show value or label or both? */
657           }
658         numeric;
659
660         /* PIVOT_VALUE_STRING. */
661         struct
662           {
663             char *s;                  /* The string value. */
664             bool hex;                 /* Display in hex? */
665             char *var_name;           /* May be NULL. */
666             char *value_label;        /* May be NULL. */
667             enum settings_value_show show; /* Show value or label or both? */
668           }
669         string;
670
671         /* PIVOT_VALUE_VARIABLE. */
672         struct
673           {
674             char *var_name;
675             char *var_label;          /* May be NULL. */
676             enum settings_value_show show; /* Show name or label or both? */
677           }
678         variable;
679
680         /* PIVOT_VALUE_TEXT. */
681         struct
682           {
683             char *local;              /* Localized. */
684             char *c;                  /* English. */
685             char *id;                 /* Identifier. */
686             bool user_provided;
687           }
688         text;
689
690         /* PIVOT_VALUE_TEMPLATE. */
691         struct
692           {
693             char *local;              /* Localized. */
694             char *id;                 /* Identifier. */
695             struct pivot_argument *args;
696             size_t n_args;
697           }
698         template;
699       };
700   };
701
702 /* Numbers resulting from calculations. */
703 struct pivot_value *pivot_value_new_number (double);
704 struct pivot_value *pivot_value_new_integer (double);
705
706 /* Values from data. */
707 struct pivot_value *pivot_value_new_var_value (
708   const struct variable *, const union value *);
709 struct pivot_value *pivot_value_new_value (const union value *, int width,
710                                            const struct fmt_spec *,
711                                            const char *encoding);
712
713 /* Values from variable names. */
714 struct pivot_value *pivot_value_new_variable (const struct variable *);
715
716 /* Values from text strings. */
717 struct pivot_value *pivot_value_new_text (const char *);
718 struct pivot_value *pivot_value_new_text_format (const char *, ...)
719 #if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__>= 4) || __GNUC__ > 4)
720   __attribute__((format(gnu_printf, 1, 2)));
721 #else
722   __attribute__((format(__printf__, 1, 2)));
723 #endif
724
725 struct pivot_value *pivot_value_new_user_text (const char *, size_t length);
726 struct pivot_value *pivot_value_new_user_text_nocopy (char *);
727
728 /* Footnotes. */
729 void pivot_value_add_footnote (struct pivot_value *, const struct pivot_footnote *);
730
731 /* Numeric formats. */
732 void pivot_value_set_rc (const struct pivot_table *, struct pivot_value *,
733                          const char *rc);
734
735 /* Converting a pivot_value to a string for display. */
736 char *pivot_value_to_string (const struct pivot_value *,
737                              enum settings_value_show show_values,
738                              enum settings_value_show show_variables);
739 void pivot_value_format (const struct pivot_value *,
740                          enum settings_value_show show_values,
741                          enum settings_value_show show_variables,
742                          struct string *);
743 bool pivot_value_format_body (const struct pivot_value *,
744                               enum settings_value_show show_values,
745                               enum settings_value_show show_variables,
746                               struct string *);
747
748 void pivot_value_destroy (struct pivot_value *);
749
750 /* Styling. */
751 void pivot_value_get_style (struct pivot_value *,
752                             const struct font_style *base_font_style,
753                             const struct cell_style *base_cell_style,
754                             struct table_area_style *);
755 void pivot_value_set_style (struct pivot_value *,
756                             const struct table_area_style *);
757
758 /* Template arguments. */
759 struct pivot_argument
760   {
761     size_t n;
762     struct pivot_value **values;
763   };
764
765 void pivot_argument_uninit (struct pivot_argument *);
766 \f
767 /* One piece of data within a pivot table. */
768 struct pivot_cell
769   {
770     struct hmap_node hmap_node; /* In struct pivot_table's 'cells' hmap. */
771     struct pivot_value *value;
772     unsigned int idx[];         /* One index per table dimension. */
773   };
774
775 #endif /* output/pivot-table.h */