+ /* Table of valid encodings. */
+ struct pivot_table *table = pivot_table_create__ (
+ pivot_value_new_text_format (N_("Usable encodings for %s."),
+ fh_get_name (h)), "Usable Encodings");
+ table->caption = pivot_value_new_text_format (
+ N_("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));
+
+ pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Encodings"),
+ N_("Encodings"));
+ struct pivot_dimension *number = pivot_dimension_create__ (
+ table, PIVOT_AXIS_ROW, pivot_value_new_user_text ("#", -1));
+ number->root->show_label = true;
+
+ for (size_t i = 0; i < n_encodings; i++)
+ {
+ struct string s = DS_EMPTY_INITIALIZER;
+ for (size_t 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 (", "));
+
+ int row = pivot_category_create_leaf (number->root,
+ pivot_value_new_integer (i + 1));
+ pivot_table_put2 (
+ table, 0, row, pivot_value_new_user_text_nocopy (ds_steal_cstr (&s)));
+ }
+ pivot_table_submit (table);
+
+ n_unique_strings = 0;
+ for (size_t i = 0; i < n_strings; i++)
+ if (!all_equal (encodings, n_encodings, i))
+ n_unique_strings++;
+ if (!n_unique_strings)
+ return;
+
+ /* Table of alternative interpretations. */
+ table = pivot_table_create__ (
+ pivot_value_new_text_format (N_("%s Encoded Text Strings"),
+ fh_get_name (h)),
+ "Alternate Encoded Text Strings");
+ table->caption = pivot_value_new_text (
+ N_("Text strings in the file dictionary that the previously listed "
+ "encodings interpret differently, along with the interpretations."));
+
+ pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Text"), N_("Text"));
+
+ number = pivot_dimension_create__ (table, PIVOT_AXIS_ROW,
+ pivot_value_new_user_text ("#", -1));
+ number->root->show_label = true;
+ for (size_t i = 0; i < n_encodings; i++)
+ pivot_category_create_leaf (number->root,
+ pivot_value_new_integer (i + 1));
+
+ struct pivot_dimension *purpose = pivot_dimension_create (
+ table, PIVOT_AXIS_ROW, N_("Purpose"));
+ purpose->root->show_label = true;
+
+ for (size_t 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);
+
+ int purpose_idx = pivot_category_create_leaf (
+ purpose->root, pivot_value_new_user_text (titles[i], -1));
+
+ for (size_t j = 0; j < n_encodings; j++)
+ {
+ const char *s = encodings[j].utf8_strings[i] + prefix;
+
+ 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, "...");
+
+ pivot_table_put3 (table, 0, j, purpose_idx,
+ pivot_value_new_user_text_nocopy (
+ ds_steal_cstr (&entry)));
+ }
+ else
+ pivot_table_put3 (table, 0, j, purpose_idx,
+ pivot_value_new_user_text (s, -1));
+ }
+ }