+ e = &encodings[n_encodings++];
+ e->encodings = UINT64_C (1) << i;
+ e->utf8_strings = utf8_strings;
+ e->hash = hash;
+ }
+ if (!n_encodings)
+ {
+ msg (SW, _("No valid encodings found."));
+ pool_destroy (pool);
+ return;
+ }
+
+ text = text_item_create_format (
+ TEXT_ITEM_PARAGRAPH,
+ _("The following table lists the encodings that can successfully read %s, "
+ "by specifying the encoding name on the GET command's ENCODING "
+ "subcommand. Encodings that yield identical text are listed "
+ "together."), fh_get_name (h));
+ text_item_submit (text);
+
+ t = tab_create (2, n_encodings + 1);
+ tab_title (t, _("Usable encodings for %s."), fh_get_name (h));
+ tab_headers (t, 1, 0, 1, 0);
+ tab_box (t, TAL_1, TAL_1, -1, -1, 0, 0, 1, n_encodings);
+ tab_hline (t, TAL_1, 0, 1, 1);
+ tab_text (t, 0, 0, TAB_RIGHT, "#");
+ tab_text (t, 1, 0, TAB_LEFT, _("Encodings"));
+ for (i = 0; i < n_encodings; i++)
+ {
+ struct string s;
+
+ ds_init_empty (&s);
+ for (j = 0; j < 64; j++)
+ if (encodings[i].encodings & (UINT64_C (1) << j))
+ ds_put_format (&s, "%s, ", encoding_names[j]);
+ ds_chomp (&s, ss_cstr (", "));
+
+ tab_text_format (t, 0, i + 1, TAB_RIGHT, "%d", i + 1);
+ tab_text (t, 1, i + 1, TAB_LEFT, ds_cstr (&s));
+ ds_destroy (&s);
+ }
+ tab_submit (t);
+
+ 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)
+ {
+ pool_destroy (pool);
+ return;
+ }
+
+ text = text_item_create_format (
+ TEXT_ITEM_PARAGRAPH,
+ _("The following table lists text strings in the file dictionary that "
+ "the encodings above interpret differently, along with those "
+ "interpretations."));
+ text_item_submit (text);
+
+ t = tab_create (3, (n_encodings * n_unique_strings) + 1);
+ tab_title (t, _("%s encoded text strings."), fh_get_name (h));
+ 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, "%d", 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);
+
+ pool_destroy (pool);
+}