+ n_unique_strings = 0;
+ for (i = 0; i < n_strings; i++)
+ if (!all_equal (encodings, n_encodings, i))
+ n_unique_strings++;
+ if (!n_unique_strings)
+ return;
+
+ t = tab_create (3, (n_encodings * n_unique_strings) + 1);
+ tab_title (t, _("%s encoded text strings."), fh_get_name (h));
+ tab_caption (t, _("Text strings in the file dictionary that the previously "
+ "listed encodings interpret differently, along with the "
+ "interpretations."));
+ tab_headers (t, 1, 0, 1, 0);
+ tab_box (t, TAL_1, TAL_1, -1, -1, 0, 0, 2, n_encodings * n_unique_strings);
+ tab_hline (t, TAL_1, 0, 2, 1);
+
+ tab_text (t, 0, 0, TAB_LEFT, _("Purpose"));
+ tab_text (t, 1, 0, TAB_RIGHT, "#");
+ tab_text (t, 2, 0, TAB_LEFT, _("Text"));
+
+ row = 1;
+ for (i = 0; i < n_strings; i++)
+ if (!all_equal (encodings, n_encodings, i))
+ {
+ int prefix = equal_prefix (encodings, n_encodings, i);
+ int suffix = equal_suffix (encodings, n_encodings, i);
+
+ tab_joint_text (t, 0, row, 0, row + n_encodings - 1,
+ TAB_LEFT, titles[i]);
+ tab_hline (t, TAL_1, 0, 2, row);
+ for (j = 0; j < n_encodings; j++)
+ {
+ const char *s = encodings[j].utf8_strings[i] + prefix;
+
+ tab_text_format (t, 1, row, TAB_RIGHT, "%zu", j + 1);
+ if (prefix || suffix)
+ {
+ size_t len = strlen (s) - suffix;
+ struct string entry;
+
+ ds_init_empty (&entry);
+ if (prefix)
+ ds_put_cstr (&entry, "...");
+ ds_put_substring (&entry, ss_buffer (s, len));
+ if (suffix)
+ ds_put_cstr (&entry, "...");
+ tab_text (t, 2, row, TAB_LEFT, ds_cstr (&entry));
+ }
+ else
+ tab_text (t, 2, row, TAB_LEFT, s);
+ row++;
+ }
+ }
+ tab_submit (t);
+}