+static void
+output_categories (const struct lr_spec *cmd, const struct lr_result *res)
+{
+ const struct fmt_spec *wfmt =
+ cmd->wv ? var_get_print_format (cmd->wv) : &F_8_0;
+
+ int cumulative_df;
+ int i = 0;
+ const int heading_columns = 2;
+ const int heading_rows = 2;
+ struct tab_table *t;
+
+ int nc ;
+ int nr ;
+
+ int v;
+ int r = 0;
+
+ int max_df = 0;
+ int total_cats = 0;
+ for (i = 0; i < cmd->n_cat_predictors; ++i)
+ {
+ size_t n = categoricals_n_count (res->cats, i);
+ size_t df = categoricals_df (res->cats, i);
+ if (max_df < df)
+ max_df = df;
+ total_cats += n;
+ }
+
+ nc = heading_columns + 1 + max_df;
+ nr = heading_rows + total_cats;
+
+ t = tab_create (nc, nr);
+ tab_title (t, _("Categorical Variables' Codings"));
+
+ tab_headers (t, heading_columns, 0, heading_rows, 0);
+
+ tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, nc - 1, nr - 1);
+
+ tab_hline (t, TAL_2, 0, nc - 1, heading_rows);
+ tab_vline (t, TAL_2, heading_columns, 0, nr - 1);
+
+
+ tab_text (t, heading_columns, 1, TAB_CENTER | TAT_TITLE, _("Frequency"));
+
+ tab_joint_text_format (t, heading_columns + 1, 0, nc - 1, 0,
+ TAB_CENTER | TAT_TITLE, _("Parameter coding"));
+
+
+ for (i = 0; i < max_df; ++i)
+ {
+ int c = heading_columns + 1 + i;
+ tab_text_format (t, c, 1, TAB_CENTER | TAT_TITLE, _("(%d)"), i + 1);
+ }
+
+ cumulative_df = 0;
+ for (v = 0; v < cmd->n_cat_predictors; ++v)
+ {
+ int cat;
+ const struct interaction *cat_predictors = cmd->cat_predictors[v];
+ int df = categoricals_df (res->cats, v);
+ struct string str;
+ ds_init_empty (&str);
+
+ interaction_to_string (cat_predictors, &str);
+
+ tab_text (t, 0, heading_rows + r, TAB_LEFT | TAT_TITLE, ds_cstr (&str) );
+
+ ds_destroy (&str);
+
+ for (cat = 0; cat < categoricals_n_count (res->cats, v) ; ++cat)
+ {
+ struct string str;
+ const struct ccase *c = categoricals_get_case_by_category_real (res->cats, v, cat);
+ const double *freq = categoricals_get_user_data_by_category_real (res->cats, v, cat);
+
+ int x;
+ ds_init_empty (&str);
+
+ for (x = 0; x < cat_predictors->n_vars; ++x)
+ {
+ const union value *val = case_data (c, cat_predictors->vars[x]);
+ var_append_value_name (cat_predictors->vars[x], val, &str);
+
+ if (x < cat_predictors->n_vars - 1)
+ ds_put_cstr (&str, " ");
+ }
+
+ tab_text (t, 1, heading_rows + r, 0, ds_cstr (&str));
+ ds_destroy (&str);
+ tab_double (t, 2, heading_rows + r, 0, *freq, wfmt);
+
+ for (x = 0; x < df; ++x)
+ {
+ tab_double (t, heading_columns + 1 + x, heading_rows + r, 0, (cat == x), &F_8_0);
+ }
+ ++r;
+ }
+ cumulative_df += df;
+ }
+
+ tab_submit (t);
+
+}