void pivot_dimension_destroy (struct pivot_dimension *);
-void pivot_dimension_dump (const struct pivot_dimension *, int indentation);
+void pivot_dimension_dump (const struct pivot_dimension *,
+ const struct pivot_table *, int indentation);
\f
/* A pivot_category is a leaf (a category) or a group:
bool show_label_in_corner;
/* Leaf only. */
- struct fmt_spec format;
size_t group_index; /* In ->parent->subs[]. */
size_t data_index; /* In ->dimension->data_leaves[]. */
size_t presentation_index; /* In ->dimension->presentation_leaves[]. */
+ struct fmt_spec format; /* Default format for values in this category. */
+ bool honor_small; /* Honor pivot_table 'small' setting? */
};
static inline bool
struct pivot_table_sizing sizing[TABLE_N_AXES];
/* Format settings. */
- int epoch;
- char decimal; /* Usually ',' or '.'. */
+ struct fmt_settings settings;
char grouping; /* Usually '.' or ','. */
- char *ccs[5]; /* Custom currency. */
double small;
/* Command information. */
void pivot_table_unref (struct pivot_table *);
bool pivot_table_is_shared (const struct pivot_table *);
+/* Titles. */
+void pivot_table_set_title (struct pivot_table *, struct pivot_value *);
+void pivot_table_set_subtype (struct pivot_table *, struct pivot_value *);
+void pivot_table_set_corner_text (struct pivot_table *, struct pivot_value *);
+void pivot_table_set_caption (struct pivot_table *, struct pivot_value *);
+
/* Axes. */
void pivot_table_swap_axes (struct pivot_table *,
enum pivot_axis_type, enum pivot_axis_type);
struct pivot_table *, size_t idx,
struct pivot_value *marker, struct pivot_value *content);
+void pivot_footnote_format_marker (const struct pivot_footnote *,
+ const struct pivot_table *,
+ struct string *);
+char *pivot_footnote_marker_string (const struct pivot_footnote *,
+ const struct pivot_table *);
+
void pivot_footnote_destroy (struct pivot_footnote *);
/* Internals. */
\f
/* pivot_value. */
-enum pivot_value_type
+enum ATTRIBUTE ((packed)) pivot_value_type
{
PIVOT_VALUE_NUMERIC, /* A value of a numeric variable. */
PIVOT_VALUE_STRING, /* A value of a string variable. */
*/
struct pivot_value
{
- struct font_style *font_style;
- struct cell_style *cell_style;
-
- char **subscripts;
- size_t n_subscripts;
-
- size_t *footnote_indexes;
- size_t n_footnotes;
-
- enum pivot_value_type type;
+ struct pivot_value_ex *ex;
union
{
+ enum pivot_value_type type;
+
/* PIVOT_VALUE_NUMERIC. */
struct
{
- double x; /* The numeric value. */
+ enum pivot_value_type type;
+ enum settings_value_show show; /* Show value or label or both? */
struct fmt_spec format; /* Format to display 'x'. */
+ bool honor_small; /* Honor value of pivot table 'small'? */
+ double x; /* The numeric value. */
char *var_name; /* May be NULL. */
char *value_label; /* May be NULL. */
- enum settings_value_show show; /* Show value or label or both? */
}
numeric;
/* PIVOT_VALUE_STRING. */
struct
{
- char *s; /* The string value. */
+ enum pivot_value_type type;
+ enum settings_value_show show; /* Show value or label or both? */
bool hex; /* Display in hex? */
+ char *s; /* The string value. */
char *var_name; /* May be NULL. */
char *value_label; /* May be NULL. */
- enum settings_value_show show; /* Show value or label or both? */
}
string;
/* PIVOT_VALUE_VARIABLE. */
struct
{
+ enum pivot_value_type type;
+ enum settings_value_show show; /* Show name or label or both? */
char *var_name;
char *var_label; /* May be NULL. */
- enum settings_value_show show; /* Show name or label or both? */
}
variable;
/* PIVOT_VALUE_TEXT. */
struct
{
+ enum pivot_value_type type;
+
+ /* 'local', 'c', and 'id' must all be nonnull, but they are allowed
+ to be the same pointer. */
+ bool user_provided;
char *local; /* Localized. */
char *c; /* English. */
char *id; /* Identifier. */
- bool user_provided;
}
text;
/* PIVOT_VALUE_TEMPLATE. */
struct
{
+ enum pivot_value_type type;
+
+ /* Arguments.
+
+ The odd ordering in this struct reduces the overall size
+ of struct pivot_value. */
+ unsigned int n_args;
+ struct pivot_argument *args;
+
+ /* Both 'local' and 'id' must be nonnull, but they are allowed to
+ be the same pointer. */
char *local; /* Localized. */
char *id; /* Identifier. */
- struct pivot_argument *args;
- size_t n_args;
}
template;
};
/* Values from variable names. */
struct pivot_value *pivot_value_new_variable (const struct variable *);
+struct pivot_value *pivot_value_new_variable__ (const char *name,
+ const char *label);
/* Values from text strings. */
struct pivot_value *pivot_value_new_text (const char *);
/* Footnotes. */
void pivot_value_add_footnote (struct pivot_value *, const struct pivot_footnote *);
+void pivot_value_sort_footnotes (struct pivot_value *);
/* Numeric formats. */
void pivot_value_set_rc (const struct pivot_table *, struct pivot_value *,
char *pivot_value_to_string (const struct pivot_value *,
const struct pivot_table *);
char *pivot_value_to_string_defaults (const struct pivot_value *);
-void pivot_value_format (const struct pivot_value *,
+bool pivot_value_format (const struct pivot_value *,
const struct pivot_table *, struct string *);
bool pivot_value_format_body (const struct pivot_value *,
const struct pivot_table *,
void pivot_argument_copy (struct pivot_argument *,
const struct pivot_argument *);
\f
+/* Extra styling for a pivot_value.
+
+ This is logically part of pivot_value itself. It is broken into a separate
+ structure to save memory because it is rarely used. */
+struct pivot_value_ex
+ {
+ struct font_style *font_style;
+ struct cell_style *cell_style;
+
+ char **subscripts;
+ size_t n_subscripts;
+
+ size_t *footnote_indexes;
+ size_t n_footnotes;
+ };
+
+static inline const struct pivot_value_ex *
+pivot_value_ex (const struct pivot_value *value)
+{
+ static const struct pivot_value_ex empty_ex = { .font_style = NULL };
+ return value->ex ? value->ex : &empty_ex;
+}
+
+struct pivot_value_ex *pivot_value_ex_rw (struct pivot_value *);
+struct pivot_value_ex *pivot_value_ex_clone (const struct pivot_value_ex *);
+void pivot_value_ex_destroy (struct pivot_value_ex *);
+\f
/* One piece of data within a pivot table. */
struct pivot_cell
{