texinfo-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[no subject]


From: Patrice Dumas
Date: Thu, 6 Jun 2024 11:22:18 -0400 (EDT)

branch: master
commit f4651bf2ace7e259a261ef4db4eacd94fe3f41d3
Author: Patrice Dumas <pertusus@free.fr>
AuthorDate: Thu Jun 6 11:02:21 2024 +0200

    Do not use unnamed union for OPTION
    
    * tp/Texinfo/XS/main/option_types.h: name the main union as o.  Update
    codes using the corresponding union fields.
---
 ChangeLog                                       |   7 +
 tp/Texinfo/XS/convert/ConvertXS.xs              |  10 +-
 tp/Texinfo/XS/convert/convert_html.c            | 795 ++++++++++++------------
 tp/Texinfo/XS/convert/converter.c               |  81 +--
 tp/Texinfo/XS/main/convert_to_text.c            |  24 +-
 tp/Texinfo/XS/main/convert_utils.c              |  44 +-
 tp/Texinfo/XS/main/errors.c                     |  18 +-
 tp/Texinfo/XS/main/get_perl_info.c              |   2 +-
 tp/Texinfo/XS/main/option_types.h               |   2 +-
 tp/Texinfo/XS/main/utils.c                      |  50 +-
 tp/Texinfo/XS/structuring_transfo/structuring.c |  34 +-
 tp/maintain/regenerate_C_options_info.pl        |  48 +-
 12 files changed, 567 insertions(+), 548 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 7c80cdb1af..c87a74f565 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2024-06-06  Patrice Dumas  <pertusus@free.fr>
+
+       Do not use unnamed union for OPTION
+
+       * tp/Texinfo/XS/main/option_types.h: name the main union as o.  Update
+       codes using the corresponding union fields.
+
 2024-06-06  Patrice Dumas  <pertusus@free.fr>
 
        Do not use unnamed union for KEY_PAIR and BUTTON_SPECIFICATION*
diff --git a/tp/Texinfo/XS/convert/ConvertXS.xs 
b/tp/Texinfo/XS/convert/ConvertXS.xs
index b56d1f4b24..b320592926 100644
--- a/tp/Texinfo/XS/convert/ConvertXS.xs
+++ b/tp/Texinfo/XS/convert/ConvertXS.xs
@@ -1927,20 +1927,20 @@ html_prepare_conversion_units (SV *converter_in, ...)
          self = get_sv_converter (converter_in,
                                   "html_prepare_conversion_units");
 
-         if (self->conf->OUTPUT_CHARACTERS.integer > 0
-             && self->conf->OUTPUT_ENCODING_NAME.string
+         if (self->conf->OUTPUT_CHARACTERS.o.integer > 0
+             && self->conf->OUTPUT_ENCODING_NAME.o.string
              /* not sure if strcasecmp is needed or not */
-             && !strcasecmp (self->conf->OUTPUT_ENCODING_NAME.string, "utf-8"))
+             && !strcasecmp (self->conf->OUTPUT_ENCODING_NAME.o.string, 
"utf-8"))
            self->use_unicode_text = 1;
 
          html_prepare_conversion_units (self);
          converter_hv = (HV *) SvRV (converter_in);
 
          /* internal links code is in Perl */
-         if (self->conf->INTERNAL_LINKS.string)
+         if (self->conf->INTERNAL_LINKS.o.string)
            self->external_references_number++;
          /* Conversion to LaTeX is in Perl */
-         if (self->conf->CONVERT_TO_LATEX_IN_MATH.integer > 0)
+         if (self->conf->CONVERT_TO_LATEX_IN_MATH.o.integer > 0)
            self->external_references_number++;
 
          if (self->external_references_number > 0)
diff --git a/tp/Texinfo/XS/convert/convert_html.c 
b/tp/Texinfo/XS/convert/convert_html.c
index 00efca9d3c..4a8f6395e1 100644
--- a/tp/Texinfo/XS/convert/convert_html.c
+++ b/tp/Texinfo/XS/convert/convert_html.c
@@ -398,8 +398,8 @@ html_get_tree_root_element (CONVERTER *self, const ELEMENT 
*command,
                 }
             }
           else if (data_cmd == CM_titlepage
-                   && self->conf->USE_TITLEPAGE_FOR_TITLE.integer > 0
-                   && self->conf->SHOW_TITLE.integer > 0)
+                   && self->conf->USE_TITLEPAGE_FOR_TITLE.o.integer > 0
+                   && self->conf->SHOW_TITLE.o.integer > 0)
             {
               ROOT_AND_UNIT *result = malloc (sizeof (ROOT_AND_UNIT));
               result->output_unit = output_units->list[0];
@@ -471,7 +471,7 @@ get_element_root_command_element (CONVERTER *self, const 
ELEMENT *command)
   if (root_unit && root_unit->root)
     {
       const ELEMENT *root_command = root_unit->root;
-      if (self->conf->USE_NODES.integer > 0)
+      if (self->conf->USE_NODES.o.integer > 0)
         {
           if (root_command->cmd != CM_node)
             {
@@ -630,8 +630,8 @@ html_gdt (const char *string, CONVERTER *self, const char 
*lang,
   char *translated_string = html_translate_string (self, string, lang,
                                                    translation_context);
 
-  if (options && options->DEBUG.integer >= 0)
-    debug_level = options->DEBUG.integer;
+  if (options && options->DEBUG.o.integer >= 0)
+    debug_level = options->DEBUG.o.integer;
 
   document_descriptor  = replace_convert_substrings (translated_string,
                                   replaced_substrings, debug_level);
@@ -662,7 +662,7 @@ html_cdt_tree (const char *string, CONVERTER *self,
                NAMED_STRING_ELEMENT_LIST *replaced_substrings,
                const char *translation_context)
 {
-  const char *lang = self->conf->documentlanguage.string;
+  const char *lang = self->conf->documentlanguage.o.string;
 
   return html_gdt_tree (string, self, lang,
                         replaced_substrings, translation_context);
@@ -675,7 +675,7 @@ html_cdt_string (const char *string, CONVERTER *self,
 {
   char *translated_string;
   char *result;
-  const char *lang = self->conf->documentlanguage.string;
+  const char *lang = self->conf->documentlanguage.o.string;
 
   translated_string = html_translate_string (self, string, lang,
                                              translation_context);
@@ -1489,14 +1489,14 @@ prepare_special_units (CONVERTER *self, int 
output_units_descriptor)
           int contents_set = 0;
           enum command_id cmd = contents_cmds[i];
           OPTION *contents_option_ref = get_command_option (self->conf, cmd);
-          if (contents_option_ref->integer > 0)
+          if (contents_option_ref->o.integer > 0)
             contents_set = 1;
           if (contents_set)
             {
               int j;
               char *special_unit_variety = 0;
               char *contents_location
-                = self->conf->CONTENTS_OUTPUT_LOCATION.string;
+                = self->conf->CONTENTS_OUTPUT_LOCATION.o.string;
 
               for (j = 0; command_special_unit_variety[j].cmd; j++)
                 {
@@ -1573,16 +1573,16 @@ prepare_special_units (CONVERTER *self, int 
output_units_descriptor)
     }
 
   if (self->document->global_commands.footnotes.number > 0
-      && self->conf->footnotestyle.string
-      && !strcmp (self->conf->footnotestyle.string, "separate")
+      && self->conf->footnotestyle.o.string
+      && !strcmp (self->conf->footnotestyle.o.string, "separate")
       && output_units->number > 1)
     add_string ("footnotes", do_special);
 
-  if ((self->conf->DO_ABOUT.integer < 0
+  if ((self->conf->DO_ABOUT.o.integer < 0
        && output_units->number > 1
-       && ((self->conf->SPLIT.string && strlen (self->conf->SPLIT.string))
-           || self->conf->HEADERS.integer > 0))
-      || self->conf->DO_ABOUT.integer > 0)
+       && ((self->conf->SPLIT.o.string && strlen (self->conf->SPLIT.o.string))
+           || self->conf->HEADERS.o.integer > 0))
+      || self->conf->DO_ABOUT.o.integer > 0)
     add_string ("about", do_special);
 
   special_units_order = (SPECIAL_UNIT_ORDER *)
@@ -1718,7 +1718,7 @@ html_prepare_conversion_units (CONVERTER *self)
 {
   int output_units_descriptor;
 
-  if (self->conf->USE_NODES.integer > 0)
+  if (self->conf->USE_NODES.o.integer > 0)
     output_units_descriptor = split_by_node (self->document);
   else
     output_units_descriptor = split_by_section (self->document);
@@ -1751,8 +1751,8 @@ set_special_units_targets_files (CONVERTER *self, const 
char *document_name)
     (self->output_units_descriptors[OUDT_special_units]);
 
   char *extension = "";
-  if (self->conf->EXTENSION.string)
-    extension = self->conf->EXTENSION.string;
+  if (self->conf->EXTENSION.o.string)
+    extension = self->conf->EXTENSION.o.string;
 
   for (i = 0; i < special_units->number; i++)
     {
@@ -1769,8 +1769,8 @@ set_special_units_targets_files (CONVERTER *self, const 
char *document_name)
       if (!target)
         continue;
 
-      if (((self->conf->SPLIT.string && strlen (self->conf->SPLIT.string))
-           || self->conf->MONOLITHIC.string <= 0)
+      if (((self->conf->SPLIT.o.string && strlen (self->conf->SPLIT.o.string))
+           || self->conf->MONOLITHIC.o.string <= 0)
     /* in general document_name not defined means called through convert */
           && document_name)
         {
@@ -1808,7 +1808,7 @@ set_special_units_targets_files (CONVERTER *self, const 
char *document_name)
       else
         filename = default_filename;
 
-      if (self->conf->DEBUG.integer > 0)
+      if (self->conf->DEBUG.o.integer > 0)
         {
           const char *fileout = filename;
           if (!fileout)
@@ -1863,7 +1863,7 @@ prepare_associated_special_units_targets (CONVERTER *self)
                 filename = target_filename->filename;
             }
 
-          if (self->conf->DEBUG.integer > 0)
+          if (self->conf->DEBUG.o.integer > 0)
             {
               const char *str_filename;
               const char *str_target;
@@ -2052,7 +2052,7 @@ new_sectioning_command_target (CONVERTER *self, const 
ELEMENT *command)
       free (target_contents_filename);
     }
 
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     {
       const char *command_name = element_command_name (command);
       fprintf (stderr, "XS|Register %s %s\n", command_name, target);
@@ -2104,8 +2104,8 @@ set_root_commands_targets_node_files (CONVERTER *self)
     {
       const char *extension = 0;
 
-      if (self->conf->EXTENSION.string)
-        extension = self->conf->EXTENSION.string;
+      if (self->conf->EXTENSION.o.string)
+        extension = self->conf->EXTENSION.o.string;
       /* use labels_list and not identifiers_target to process in the
          document order */
       const LABEL_LIST *label_targets = &self->document->labels_list;
@@ -2152,13 +2152,13 @@ set_root_commands_targets_node_files (CONVERTER *self)
             }
           else if (called)
             {
-              if (self->conf->VERBOSE.integer > 0)
+              if (self->conf->VERBOSE.o.integer > 0)
                 {
                   message_list_document_warn (&self->error_messages, 
self->conf,
                              0, "user-defined node file name not set for `%s'",
                              node_filename);
                 }
-              else if (self->conf->DEBUG.integer > 0)
+              else if (self->conf->DEBUG.o.integer > 0)
                 {
                   fprintf (stderr,
                      "user-defined node file name undef for `%s'\n",
@@ -2166,7 +2166,7 @@ set_root_commands_targets_node_files (CONVERTER *self)
                 }
             }
 
-          if (self->conf->DEBUG.integer > 0)
+          if (self->conf->DEBUG.o.integer > 0)
             {
               const char *command_name = element_command_name (target_element);
               fprintf (stderr, "Label @%s %s, %s\n", command_name, target,
@@ -2490,11 +2490,11 @@ html_css_string_convert_text (CONVERTER *self, const 
enum element_type type,
         OTXI_CONVERT_TEXT("-`'" additional_delim, \
           OTXI_UNICODE_TEXT_CASES(p) \
           other_cases) \
-      else if (self->conf->USE_NUMERIC_ENTITY.integer > 0) \
+      else if (self->conf->USE_NUMERIC_ENTITY.o.integer > 0) \
         OTXI_CONVERT_TEXT("-`'" additional_delim, \
           OTXI_NUMERIC_ENTITY_TEXT_CASES(p) \
           other_cases) \
-      else if (self->conf->USE_ISO.integer > 0) \
+      else if (self->conf->USE_ISO.o.integer > 0) \
         OTXI_CONVERT_TEXT("-`'" additional_delim, \
           OTXI_ISO_ENTITY_TEXT_CASES(p) \
           other_cases) \
@@ -2830,7 +2830,7 @@ convert_tree_new_formatting_context (CONVERTER *self, 
const ELEMENT *tree,
       multiple_pass_str = "|M";
     }
 
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     fprintf (stderr, "XS|new_fmt_ctx %s%s\n", context_string_str,
                                               multiple_pass_str);
 
@@ -3086,15 +3086,15 @@ external_node_href (CONVERTER *self, const ELEMENT 
*external_node,
     normalized_label_id_file (self, normalized, node_contents);
 
   /* always undef if conversion is called through convert() */
-  if (self->conf->EXTERNAL_CROSSREF_SPLIT.string
-      && strlen (self->conf->EXTERNAL_CROSSREF_SPLIT.string))
+  if (self->conf->EXTERNAL_CROSSREF_SPLIT.o.string
+      && strlen (self->conf->EXTERNAL_CROSSREF_SPLIT.o.string))
     /* initialize to EXTERNAL_CROSSREF_SPLIT */
     target_split = 1;
 
-  if (self->conf->EXTERNAL_CROSSREF_EXTENSION.string)
-    extension = self->conf->EXTERNAL_CROSSREF_EXTENSION.string;
-  else if (self->conf->EXTENSION.string)
-    extension = self->conf->EXTENSION.string;
+  if (self->conf->EXTERNAL_CROSSREF_EXTENSION.o.string)
+    extension = self->conf->EXTERNAL_CROSSREF_EXTENSION.o.string;
+  else if (self->conf->EXTENSION.o.string)
+    extension = self->conf->EXTENSION.o.string;
 
   /* both to be freed before return */
   target = target_filename->target;
@@ -3115,9 +3115,10 @@ external_node_href (CONVERTER *self, const ELEMENT 
*external_node,
                                      self->convert_text_options);
       self->convert_text_options->code_state--;
 
-      if (self->conf->IGNORE_REF_TO_TOP_NODE_UP.integer > 0 && !strlen 
(target))
+      if (self->conf->IGNORE_REF_TO_TOP_NODE_UP.o.integer > 0
+          && !strlen (target))
         {
-          char *top_node_up = self->conf->TOP_NODE_UP.string;
+          char *top_node_up = self->conf->TOP_NODE_UP.o.string;
           if (top_node_up)
             {
               char *parentheses_manual_name;
@@ -3169,7 +3170,7 @@ external_node_href (CONVERTER *self, const ELEMENT 
*external_node,
         }
       else
         { /* nothing specified for that manual, use default */
-          if (self->conf->CHECK_HTMLXREF.integer > 0)
+          if (self->conf->CHECK_HTMLXREF.o.integer > 0)
             {
               if ((source_command != 0) &&
                   (source_command->source_info.line_nr != 0))
@@ -3211,13 +3212,13 @@ external_node_href (CONVERTER *self, const ELEMENT 
*external_node,
               char *url_encoded_path;
               text_init (&dir_path);
 
-              if (self->conf->EXTERNAL_DIR.string)
+              if (self->conf->EXTERNAL_DIR.o.string)
                 {
                   text_printf (&dir_path, "%s/%s",
-                               self->conf->EXTERNAL_DIR.string, manual_base);
+                               self->conf->EXTERNAL_DIR.o.string, manual_base);
                 }
-              else if (self->conf->SPLIT.string
-                       && strlen (self->conf->SPLIT.string))
+              else if (self->conf->SPLIT.o.string
+                       && strlen (self->conf->SPLIT.o.string))
                 {
                   text_append_n (&dir_path, "../", 3);
                   text_append (&dir_path, manual_base);
@@ -3245,13 +3246,13 @@ external_node_href (CONVERTER *self, const ELEMENT 
*external_node,
               TEXT file_path;
               text_init (&file_path);
 
-              if (self->conf->EXTERNAL_DIR.string)
+              if (self->conf->EXTERNAL_DIR.o.string)
                 {
                   text_printf (&file_path, "%s/%s",
-                               self->conf->EXTERNAL_DIR.string, manual_base);
+                               self->conf->EXTERNAL_DIR.o.string, manual_base);
                 }
-              else if (self->conf->SPLIT.string
-                       && strlen (self->conf->SPLIT.string))
+              else if (self->conf->SPLIT.o.string
+                       && strlen (self->conf->SPLIT.o.string))
                 {
                   text_append_n (&file_path, "../", 3);
                   text_append (&file_path, manual_base);
@@ -3277,9 +3278,9 @@ external_node_href (CONVERTER *self, const ELEMENT 
*external_node,
       TARGET_DIRECTORY_FILENAME *target_dir_filename;
 
       if ((!strcmp (target, "Top") || !strlen (target))
-          && self->conf->TOP_NODE_FILE_TARGET.string)
+          && self->conf->TOP_NODE_FILE_TARGET.o.string)
         {
-          file_name = strdup (self->conf->TOP_NODE_FILE_TARGET.string);
+          file_name = strdup (self->conf->TOP_NODE_FILE_TARGET.o.string);
         }
       else
         {
@@ -3831,7 +3832,7 @@ html_internal_command_tree (CONVERTER *self, const 
ELEMENT *command,
             {
               const char *section_number
                 = lookup_extra_string (command, "section_number");
-              if (section_number && !self->conf->NUMBER_SECTIONS.integer == 0)
+              if (section_number && !self->conf->NUMBER_SECTIONS.o.integer == 
0)
                 {
                   NAMED_STRING_ELEMENT_LIST *replaced_substrings
                     = new_named_string_element_list ();
@@ -4111,16 +4112,16 @@ from_element_direction (CONVERTER *self, int direction,
        = self->global_units_directions
            [D_direction_Last + direction - NON_SPECIAL_DIRECTIONS_NR +1];
   else if ((!source_unit || unit_is_top_output_unit (self, source_unit))
-           && self->conf->TOP_NODE_UP_URL.string
+           && self->conf->TOP_NODE_UP_URL.o.string
            && (direction == D_direction_Up || direction == D_direction_NodeUp))
     {
       if (type == HTT_href)
-        return strdup (self->conf->TOP_NODE_UP_URL.string);
+        return strdup (self->conf->TOP_NODE_UP_URL.o.string);
       else if (type == HTT_text || type == HTT_node
                || type == HTT_string || type == HTT_section)
         {
-          if (self->conf->TOP_NODE_UP.string)
-            return strdup (self->conf->TOP_NODE_UP.string);
+          if (self->conf->TOP_NODE_UP.o.string)
+            return strdup (self->conf->TOP_NODE_UP.o.string);
           else
             return 0;
         }
@@ -4429,7 +4430,7 @@ html_get_css_elements_classes (CONVERTER *self, const 
char *filename)
                 similar command is in general done in global context
                 so no file is added */
               /* This debug message is C specific
-              if (self->conf->DEBUG.integer > 0)
+              if (self->conf->DEBUG.o.integer > 0)
                 {
                   fprintf (stderr, "XS|css: REMARK: %s: get_css no page 
found\n",
                                     filename);
@@ -4556,7 +4557,7 @@ html_css_get_info (CONVERTER *self, enum css_info_type 
type)
 void
 close_html_lone_element (const CONVERTER *self, TEXT *result)
 {
-  if (self->conf->USE_XML_SYNTAX.integer > 0)
+  if (self->conf->USE_XML_SYNTAX.o.integer > 0)
     text_append_n (result, "/>", 2);
   else
     text_append_n (result, ">", 1);
@@ -4606,7 +4607,7 @@ html_attribute_class (CONVERTER *self, const char 
*element,
   int i;
   int class_nr = 0;
   if (!classes  || classes->number <= 0
-      || self->conf->NO_CSS.integer > 0)
+      || self->conf->NO_CSS.o.integer > 0)
     {
       if (!strcmp (element, "span"))
         return strdup ("");
@@ -4618,7 +4619,7 @@ html_attribute_class (CONVERTER *self, const char 
*element,
         }
     }
 
-  if (self->conf->INLINE_CSS_STYLE.integer > 0)
+  if (self->conf->INLINE_CSS_STYLE.o.integer > 0)
     {
       int i;
       TEXT inline_styles;
@@ -4691,7 +4692,7 @@ static const STRING_LIST copiable_link_classes = 
{copiable_link_array, 1, 1};
 static char *
 get_copiable_anchor (CONVERTER *self, const char *id)
 {
-  if (id && strlen (id) && self->conf->COPIABLE_LINKS.integer > 0)
+  if (id && strlen (id) && self->conf->COPIABLE_LINKS.o.integer > 0)
     {
       TEXT result;
       char *attribute_class = html_attribute_class (self, "a",
@@ -4781,7 +4782,7 @@ prepare_index_entries_targets (CONVERTER *self)
                 }
               normalized_index
                 = normalize_transliterate_texinfo (normalize_index_element,
-                                            (self->conf->TEST.integer > 0));
+                                            (self->conf->TEST.o.integer > 0));
 
               destroy_element (normalize_index_element);
               if (subentries_tree)
@@ -4896,7 +4897,7 @@ prepare_footnotes_targets (CONVERTER *self)
           add_special_target (self, ST_footnote_location, footnote,
                               docid.text);
 
-          if (self->conf->DEBUG.integer > 0)
+          if (self->conf->DEBUG.o.integer > 0)
             {
               char *footnote_txi = convert_to_texinfo (footnote);
               fprintf (stderr, "Enter footnote: target %s, nr %d\n%s\n",
@@ -5122,7 +5123,7 @@ html_prepare_output_units_global_targets (CONVERTER *self)
       free (root_unit);
     }
 
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     {
       int i;
       fprintf (stderr, "GLOBAL DIRECTIONS:\n");
@@ -5300,7 +5301,7 @@ html_set_pages_files (CONVERTER *self, const 
OUTPUT_UNIT_LIST *output_units,
   memset (unit_file_name_paths, 0,
           output_units->number * sizeof (char *));
 
-  if (!self->conf->SPLIT.string || !strlen (self->conf->SPLIT.string))
+  if (!self->conf->SPLIT.o.string || !strlen (self->conf->SPLIT.o.string))
     {
       int i;
       add_to_files_source_info (files_source_info, output_filename,
@@ -5343,8 +5344,9 @@ html_set_pages_files (CONVERTER *self, const 
OUTPUT_UNIT_LIST *output_units,
                                        node_top_output_unit);
         }
 
-      if (self->conf->EXTENSION.string && strlen 
(self->conf->EXTENSION.string))
-        extension = self->conf->EXTENSION.string;
+      if (self->conf->EXTENSION.o.string
+          && strlen (self->conf->EXTENSION.o.string))
+        extension = self->conf->EXTENSION.o.string;
 
       for (i = 0; i < output_units->number; i++)
         {
@@ -5637,7 +5639,7 @@ html_set_pages_files (CONVERTER *self, const 
OUTPUT_UNIT_LIST *output_units,
         = set_output_unit_file (self, output_unit, filename, 1);
       self->output_unit_file_indices[i] = output_unit_file_idx;
       output_unit_file = &self->output_unit_files.list[output_unit_file_idx];
-      if (self->conf->DEBUG.integer > 0)
+      if (self->conf->DEBUG.o.integer > 0)
         {
           char *output_unit_text = output_unit_texi (output_unit);
           fprintf (stderr, "Page %s: %s(%d)\n", output_unit_text,
@@ -5693,7 +5695,7 @@ html_set_pages_files (CONVERTER *self, const 
OUTPUT_UNIT_LIST *output_units,
           self->special_unit_file_indices[i] = special_unit_file_idx;
           special_unit_file
              = &self->output_unit_files.list[special_unit_file_idx];
-          if (self->conf->DEBUG.integer > 0)
+          if (self->conf->DEBUG.o.integer > 0)
             fprintf (stderr, "Special page: %s(%d)\n", filename,
                              special_unit_file->counter);
         }
@@ -5820,7 +5822,7 @@ html_prepare_units_directions_files (CONVERTER *self,
 
   html_prepare_output_units_global_targets (self);
 
-  split_pages (output_units, self->conf->SPLIT.string);
+  split_pages (output_units, self->conf->SPLIT.o.string);
 
   if (strlen (output_file))
     {
@@ -5834,7 +5836,7 @@ html_prepare_units_directions_files (CONVERTER *self,
 
 
   units_directions (&self->document->identifiers_target, output_units,
-                    self->conf->DEBUG.integer);
+                    self->conf->DEBUG.o.integer);
 
   prepare_special_units_directions (self, special_units);
 
@@ -5963,7 +5965,7 @@ format_separate_anchor (CONVERTER *self, const char *id,
 static void
 direction_href_attributes (CONVERTER *self, int direction, TEXT *result)
 {
-  if (self->conf->USE_ACCESSKEY.integer > 0)
+  if (self->conf->USE_ACCESSKEY.o.integer > 0)
     {
       const char *accesskey
         = direction_string (self, direction, TDS_type_accesskey,
@@ -5972,7 +5974,7 @@ direction_href_attributes (CONVERTER *self, int 
direction, TEXT *result)
         text_printf (result, " accesskey=\"%s\"", accesskey);
     }
 
-  if (self->conf->USE_REL_REV.integer > 0)
+  if (self->conf->USE_REL_REV.o.integer > 0)
     {
       const char *button_rel
         = direction_string (self, direction, TDS_type_rel,
@@ -6027,9 +6029,9 @@ html_default_format_heading_text (CONVERTER *self, const 
enum command_id cmd,
       /* TODO if defaults of converter options become more used in C code,
          setup a structure with options defaults instead of hardcoding */
       int max_header_level = 4;
-      if (self->conf->MAX_HEADER_LEVEL.integer >= 1)
-        max_header_level = self->conf->MAX_HEADER_LEVEL.integer;
-      else if (self->conf->MAX_HEADER_LEVEL.integer == 0)
+      if (self->conf->MAX_HEADER_LEVEL.o.integer >= 1)
+        max_header_level = self->conf->MAX_HEADER_LEVEL.o.integer;
+      else if (self->conf->MAX_HEADER_LEVEL.o.integer == 0)
         max_header_level = 1;
 
       if (level > max_header_level)
@@ -6075,10 +6077,10 @@ html_default_format_heading_text (CONVERTER *self, 
const enum command_id cmd,
   text_printf (result, "</h%d>", heading_level);
   if (cmd != CM_titlefont)
     text_append_n (result, "\n", 1);
-  if (cmd == CM_part && self->conf->DEFAULT_RULE.string
-      && strlen (self->conf->DEFAULT_RULE.string))
+  if (cmd == CM_part && self->conf->DEFAULT_RULE.o.string
+      && strlen (self->conf->DEFAULT_RULE.o.string))
     {
-      text_append (result, self->conf->DEFAULT_RULE.string);
+      text_append (result, self->conf->DEFAULT_RULE.o.string);
       text_append_n (result, "\n", 1);
     }
 }
@@ -6151,8 +6153,8 @@ html_default_format_contents (CONVERTER *self, const enum 
command_id cmd,
                                                      min_root_level);
    */
 
-  if ((is_contents && !self->conf->BEFORE_TOC_LINES.string)
-      || (!is_contents && !self->conf->BEFORE_SHORT_TOC_LINES.string))
+  if ((is_contents && !self->conf->BEFORE_TOC_LINES.o.string)
+      || (!is_contents && !self->conf->BEFORE_SHORT_TOC_LINES.o.string))
     {
       char *attribute_class;
 
@@ -6166,11 +6168,11 @@ html_default_format_contents (CONVERTER *self, const 
enum command_id cmd,
       text_append_n (&result, ">\n", 2);
     }
   else if (is_contents)
-    text_append (&result, self->conf->BEFORE_TOC_LINES.string);
+    text_append (&result, self->conf->BEFORE_TOC_LINES.o.string);
   else
-    text_append (&result, self->conf->BEFORE_SHORT_TOC_LINES.string);
+    text_append (&result, self->conf->BEFORE_SHORT_TOC_LINES.o.string);
 
-  if (self->conf->NUMBER_SECTIONS.integer > 0)
+  if (self->conf->NUMBER_SECTIONS.o.integer > 0)
     toc_ul_classes = &toc_numbered_mark_classes;
   if (root_children->number > 1)
     {
@@ -6182,10 +6184,10 @@ html_default_format_contents (CONVERTER *self, const 
enum command_id cmd,
       has_toplevel_contents = 1;
     }
 
-  link_to_toc = (!is_contents && self->conf->SHORT_TOC_LINK_TO_TOC.integer > 0
-                 && self->conf->contents.integer > 0
-                 && (!self->conf->CONTENTS_OUTPUT_LOCATION.string
-                     || strcmp (self->conf->CONTENTS_OUTPUT_LOCATION.string,
+  link_to_toc = (!is_contents && self->conf->SHORT_TOC_LINK_TO_TOC.o.integer > 0
+                 && self->conf->contents.o.integer > 0
+                 && (!self->conf->CONTENTS_OUTPUT_LOCATION.o.string
+                     || strcmp (self->conf->CONTENTS_OUTPUT_LOCATION.o.string,
                                 "inline")
                      || self->document->global_commands.contents.number > 0
                 || self->document->global_commands.shortcontents.number > 0));
@@ -6349,13 +6351,13 @@ html_default_format_contents (CONVERTER *self, const 
enum command_id cmd,
   if (root_children->number > 1)
     text_append_n (&result, "\n</ul>", 6);
 
-  if ((is_contents && !self->conf->AFTER_TOC_LINES.string)
-      || (!is_contents && !self->conf->AFTER_SHORT_TOC_LINES.string))
+  if ((is_contents && !self->conf->AFTER_TOC_LINES.o.string)
+      || (!is_contents && !self->conf->AFTER_SHORT_TOC_LINES.o.string))
     text_append_n (&result, "\n</div>\n", 8);
   else if (is_contents)
-    text_append (&result, self->conf->AFTER_TOC_LINES.string);
+    text_append (&result, self->conf->AFTER_TOC_LINES.o.string);
   else
-    text_append (&result, self->conf->AFTER_SHORT_TOC_LINES.string);
+    text_append (&result, self->conf->AFTER_SHORT_TOC_LINES.o.string);
 
   return result.text;
 }
@@ -6464,11 +6466,11 @@ html_default_format_footnotes_sequence (CONVERTER 
*self, TEXT *result)
           else
             footnote_text_with_eol = footnote_text;
 
-          if (self->conf->NUMBER_FOOTNOTES.integer > 0)
+          if (self->conf->NUMBER_FOOTNOTES.o.integer > 0)
             xasprintf (&footnote_mark, "%d", number_in_doc);
-          else if (self->conf->NO_NUMBER_FOOTNOTE_SYMBOL.string)
+          else if (self->conf->NO_NUMBER_FOOTNOTE_SYMBOL.o.string)
             footnote_mark
-              = strdup (self->conf->NO_NUMBER_FOOTNOTE_SYMBOL.string);
+              = strdup (self->conf->NO_NUMBER_FOOTNOTE_SYMBOL.o.string);
           else
             footnote_mark = strdup ("");
 
@@ -6546,10 +6548,10 @@ default_format_footnotes_segment (CONVERTER *self, TEXT 
*result)
 
   text_append_n (result, ">\n", 2);
 
-  if (self->conf->DEFAULT_RULE.string
-      && strlen (self->conf->DEFAULT_RULE.string))
+  if (self->conf->DEFAULT_RULE.o.string
+      && strlen (self->conf->DEFAULT_RULE.o.string))
     {
-      text_append (result, self->conf->DEFAULT_RULE.string);
+      text_append (result, self->conf->DEFAULT_RULE.o.string);
       text_append_n (result, "\n", 1);
     }
 
@@ -6565,7 +6567,7 @@ default_format_footnotes_segment (CONVERTER *self, TEXT 
*result)
       footnote_heading = "";
     }
 
-  level = self->conf->FOOTNOTE_END_HEADER_LEVEL.integer;
+  level = self->conf->FOOTNOTE_END_HEADER_LEVEL.o.integer;
 
   xasprintf (&class, "%s-heading", class_base);
 
@@ -6612,16 +6614,16 @@ html_default_format_program_string (CONVERTER *self, 
TEXT *result)
 {
   ELEMENT *tree;
   const char *explanation;
-  if (self->conf->PROGRAM.string && strlen (self->conf->PROGRAM.string)
-      && self->conf->PACKAGE_URL.string)
+  if (self->conf->PROGRAM.o.string && strlen (self->conf->PROGRAM.o.string)
+      && self->conf->PACKAGE_URL.o.string)
     {
       ELEMENT *program_homepage = new_element (ET_NONE);
       ELEMENT *program = new_element (ET_NONE);
       NAMED_STRING_ELEMENT_LIST *substrings
                                    = new_named_string_element_list ();
 
-      text_append (&program_homepage->text, self->conf->PACKAGE_URL.string);
-      text_append (&program->text, self->conf->PROGRAM.string);
+      text_append (&program_homepage->text, self->conf->PACKAGE_URL.o.string);
+      text_append (&program->text, self->conf->PROGRAM.o.string);
 
       add_element_to_named_string_element_list (substrings,
                                     "program_homepage", program_homepage);
@@ -6680,7 +6682,7 @@ html_default_format_end_file (CONVERTER *self, const char 
*filename,
   text_init (&result);
   text_append (&result, "");
 
-  if (self->conf->PROGRAM_NAME_IN_FOOTER.integer > 0)
+  if (self->conf->PROGRAM_NAME_IN_FOOTER.o.integer > 0)
     {
       char *open;
       size_t open_len;
@@ -6702,8 +6704,8 @@ html_default_format_end_file (CONVERTER *self, const char 
*filename,
     }
   text_append_n (&result, "\n\n", 2);
 
-  if (self->conf->PRE_BODY_CLOSE.string)
-    text_append (&result, self->conf->PRE_BODY_CLOSE.string);
+  if (self->conf->PRE_BODY_CLOSE.o.string)
+    text_append (&result, self->conf->PRE_BODY_CLOSE.o.string);
 
   if (self->jslicenses.number)
     {
@@ -6723,18 +6725,18 @@ html_default_format_end_file (CONVERTER *self, const 
char *filename,
       if (infojs_jslicenses_file_nr > 0
           || ((html_get_file_information (self, "mathjax",
                                           filename, &status) > 0
-               || (!self->conf->SPLIT.string
-                   || !strlen (self->conf->SPLIT.string)))
+               || (!self->conf->SPLIT.o.string
+                   || !strlen (self->conf->SPLIT.o.string)))
               && mathjax_jslicenses_file_nr > 0))
         {
-          if (self->conf->JS_WEBLABELS_FILE.string
-              && self->conf->JS_WEBLABELS.string
-              && (!strcmp (self->conf->JS_WEBLABELS.string, "generate")
-                  || !strcmp (self->conf->JS_WEBLABELS.string, "reference")))
+          if (self->conf->JS_WEBLABELS_FILE.o.string
+              && self->conf->JS_WEBLABELS.o.string
+              && (!strcmp (self->conf->JS_WEBLABELS.o.string, "generate")
+                  || !strcmp (self->conf->JS_WEBLABELS.o.string, "reference")))
             {
               ELEMENT *tree;
               char *js_path = url_protect_url_text (self,
-                                          
self->conf->JS_WEBLABELS_FILE.string);
+                                     self->conf->JS_WEBLABELS_FILE.o.string);
               text_append_n (&result, "<a href=\"", 9);
               text_append (&result, js_path);
               free (js_path);
@@ -6831,10 +6833,10 @@ html_default_format_css_lines (CONVERTER *self, const 
char *filename,
   STRING_LIST *css_element_classes;
   size_t i;
 
-  if (self->conf->NO_CSS.integer > 0)
+  if (self->conf->NO_CSS.o.integer > 0)
     return;
 
-  css_refs = self->conf->CSS_REFS.strlist;
+  css_refs = self->conf->CSS_REFS.o.strlist;
   css_element_classes = html_get_css_elements_classes (self, filename);
   css_import_lines = html_css_get_info (self, CI_css_info_imports);
   css_rule_lines = html_css_get_info (self, CI_css_info_rules);
@@ -6926,12 +6928,12 @@ format_css_lines (CONVERTER *self, const char 
*filename, TEXT *result)
 static
 char *root_html_element_attributes_string (CONVERTER *self)
 {
-  if (self->conf->HTML_ROOT_ELEMENT_ATTRIBUTES.string
-      && strlen (self->conf->HTML_ROOT_ELEMENT_ATTRIBUTES.string))
+  if (self->conf->HTML_ROOT_ELEMENT_ATTRIBUTES.o.string
+      && strlen (self->conf->HTML_ROOT_ELEMENT_ATTRIBUTES.o.string))
     {
       char *result;
       xasprintf (&result, " %s",
-                 self->conf->HTML_ROOT_ELEMENT_ATTRIBUTES.string);
+                 self->conf->HTML_ROOT_ELEMENT_ATTRIBUTES.o.string);
       return result;
     }
   return 0;
@@ -6973,7 +6975,7 @@ file_header_information (CONVERTER *self, const ELEMENT 
*command,
           ELEMENT *title_tree;
           ELEMENT *command_tree = 0;
 
-          if (self->conf->SECTION_NAME_IN_TITLE.integer > 0)
+          if (self->conf->SECTION_NAME_IN_TITLE.o.integer > 0)
             {
               ELEMENT *associated_section
                 = lookup_extra_element (command, "associated_section");
@@ -7042,12 +7044,12 @@ file_header_information (CONVERTER *self, const ELEMENT 
*command,
     }
 
   text_reset (&text);
-  if (self->conf->OUTPUT_ENCODING_NAME.string
-      && strlen (self->conf->OUTPUT_ENCODING_NAME.string))
+  if (self->conf->OUTPUT_ENCODING_NAME.o.string
+      && strlen (self->conf->OUTPUT_ENCODING_NAME.o.string))
     {
       text_printf (&text,
         "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"",
-                   self->conf->OUTPUT_ENCODING_NAME.string);
+                   self->conf->OUTPUT_ENCODING_NAME.o.string);
       close_html_lone_element (self, &text);
       begin_info->encoding = strdup (text.text);
     }
@@ -7066,10 +7068,10 @@ file_header_information (CONVERTER *self, const ELEMENT 
*command,
     begin_info->root_html_element_attributes = strdup ("");
 
   text_reset (&text);
-  if (self->conf->BODY_ELEMENT_ATTRIBUTES.string)
-    text_append (&text, self->conf->BODY_ELEMENT_ATTRIBUTES.string);
-  if (self->conf->HTML_MATH.string
-      && !strcmp (self->conf->HTML_MATH.string, "mathjax")
+  if (self->conf->BODY_ELEMENT_ATTRIBUTES.o.string)
+    text_append (&text, self->conf->BODY_ELEMENT_ATTRIBUTES.o.string);
+  if (self->conf->HTML_MATH.o.string
+      && !strcmp (self->conf->HTML_MATH.o.string, "mathjax")
       && html_get_file_information (self, "mathjax", filename, &status) > 0)
     {
       text_append_n (&text, " class=\"tex2jax_ignore\"", 23);
@@ -7078,21 +7080,21 @@ file_header_information (CONVERTER *self, const ELEMENT 
*command,
   begin_info->body_attributes = strdup (text.text);
 
   text_reset (&text);
-  if (self->conf->PROGRAM.string && strlen (self->conf->PROGRAM.string))
+  if (self->conf->PROGRAM.o.string && strlen (self->conf->PROGRAM.o.string))
     {
       text_printf (&text, "<meta name=\"Generator\" content=\"%s\"",
-                   self->conf->PROGRAM.string);
+                   self->conf->PROGRAM.o.string);
       close_html_lone_element (self, &text);
       text_append_n (&text, "\n", 1);
       begin_info->generator = strdup (text.text);
       text_reset (&text);
     }
 
-  if (self->conf->EXTRA_HEAD.string)
-    text_append (&text, self->conf->EXTRA_HEAD.string);
-  if (self->conf->INFO_JS_DIR.string)
+  if (self->conf->EXTRA_HEAD.o.string)
+    text_append (&text, self->conf->EXTRA_HEAD.o.string);
+  if (self->conf->INFO_JS_DIR.o.string)
     {
-      if (!self->conf->SPLIT.string || !strlen (self->conf->SPLIT.string))
+      if (!self->conf->SPLIT.o.string || !strlen (self->conf->SPLIT.o.string))
         {
           message_list_document_error (&self->error_messages, self->conf, 0,
                      "%s not meaningful for non-split output", "INFO_JS_DIR");
@@ -7101,12 +7103,12 @@ file_header_information (CONVERTER *self, const ELEMENT 
*command,
         {
           char *jsdir;
           char *protected_jsdir;
-          if (!strcmp (self->conf->INFO_JS_DIR.string, "."))
+          if (!strcmp (self->conf->INFO_JS_DIR.o.string, "."))
             jsdir = strdup ("");
           else
             {
               size_t len;
-              jsdir = strdup (self->conf->INFO_JS_DIR.string);
+              jsdir = strdup (self->conf->INFO_JS_DIR.o.string);
               len = strlen (jsdir);
               if (len > 0)
                 {
@@ -7141,13 +7143,13 @@ file_header_information (CONVERTER *self, const ELEMENT 
*command,
           free (protected_jsdir);
         }
     }
-  if (self->conf->HTML_MATH.string
-      && !strcmp (self->conf->HTML_MATH.string, "mathjax")
+  if (self->conf->HTML_MATH.o.string
+      && !strcmp (self->conf->HTML_MATH.o.string, "mathjax")
       && (html_get_file_information (self, "mathjax", filename, &status) > 0
-          || (self->conf->SPLIT.string && strlen (self->conf->SPLIT.string))))
+          || (self->conf->SPLIT.o.string && strlen 
(self->conf->SPLIT.o.string))))
     {
       char *mathjax_script = url_protect_url_text (self,
-                                self->conf->MATHJAX_SCRIPT.string);
+                                self->conf->MATHJAX_SCRIPT.o.string);
       text_printf (&text, "<script type='text/javascript'>\n"
 "MathJax = {\n"
 "  options: {\n"
@@ -7170,11 +7172,12 @@ get_links (CONVERTER* self, const char *filename,
            const OUTPUT_UNIT *output_unit,
            const ELEMENT *node_command, TEXT *result)
 {
-  if (self->conf->USE_LINKS.integer > 0 && self->conf->LINKS_BUTTONS.buttons)
+  if (self->conf->USE_LINKS.o.integer > 0
+      && self->conf->LINKS_BUTTONS.o.buttons)
     {
       int i;
       const BUTTON_SPECIFICATION_LIST *link_buttons
-          = self->conf->LINKS_BUTTONS.buttons;
+          = self->conf->LINKS_BUTTONS.o.buttons;
       for (i = 0; i < link_buttons->number; i++)
         {
           const BUTTON_SPECIFICATION *link = &link_buttons->list[i];
@@ -7233,7 +7236,7 @@ html_default_format_begin_file (CONVERTER *self, const 
char *filename,
       if (!node_command)
         node_command = element_command;
 
-      if (self->conf->SPLIT.string && strlen (self->conf->SPLIT.string)
+      if (self->conf->SPLIT.o.string && strlen (self->conf->SPLIT.o.string)
           && element_command)
         command_for_title = element_command;
     }
@@ -7242,16 +7245,16 @@ html_default_format_begin_file (CONVERTER *self, const 
char *filename,
 
   text_init (&result);
 
-  if (self->conf->DOCTYPE.string)
-    text_append (&result, self->conf->DOCTYPE.string);
+  if (self->conf->DOCTYPE.o.string)
+    text_append (&result, self->conf->DOCTYPE.o.string);
   text_append_n (&result, "\n", 1);
   text_printf (&result, "<html%s>\n", 
begin_info->root_html_element_attributes);
-  if (self->conf->PACKAGE_AND_VERSION.string)
-    package_and_version = self->conf->PACKAGE_AND_VERSION.string;
+  if (self->conf->PACKAGE_AND_VERSION.o.string)
+    package_and_version = self->conf->PACKAGE_AND_VERSION.o.string;
   else
     package_and_version = "";
-  if (self->conf->PACKAGE_URL.string)
-    package_url = self->conf->PACKAGE_URL.string;
+  if (self->conf->PACKAGE_URL.o.string)
+    package_url = self->conf->PACKAGE_URL.o.string;
   else
     package_url = "";
   text_printf (&result, "<!-- Created by %s, %s -->\n<head>\n",
@@ -7292,8 +7295,8 @@ html_default_format_begin_file (CONVERTER *self, const 
char *filename,
     text_append (&result, begin_info->extra_head);
   text_append_n (&result, "\n</head>\n\n", 10);
   text_printf (&result, "<body %s>\n", begin_info->body_attributes);
-  if (self->conf->AFTER_BODY_OPEN.string)
-    text_append (&result, self->conf->AFTER_BODY_OPEN.string);
+  if (self->conf->AFTER_BODY_OPEN.o.string)
+    text_append (&result, self->conf->AFTER_BODY_OPEN.o.string);
 
   destroy_begin_file_information (begin_info);
 
@@ -7393,9 +7396,9 @@ default_panel_button_dynamic_direction_internal 
(CONVERTER *self,
 
   formatted_button->need_delimiter = 1;
 
-  if (self->conf->USE_NODE_DIRECTIONS.integer > 0
-      || (self->conf->USE_NODE_DIRECTIONS.integer < 0
-          && self->conf->USE_NODES.integer > 0))
+  if (self->conf->USE_NODE_DIRECTIONS.o.integer > 0
+      || (self->conf->USE_NODE_DIRECTIONS.o.integer < 0
+          && self->conf->USE_NODES.o.integer > 0))
     direction += NODE_DIRECTIONS_OFFSET;
 
   if (use_first_element_in_file_directions)
@@ -7403,8 +7406,8 @@ default_panel_button_dynamic_direction_internal 
(CONVERTER *self,
 
   href = from_element_direction (self, direction, HTT_href, 0, 0, element);
 
-  if (self->conf->xrefautomaticsectiontitle.string
-      && !strcmp (self->conf->xrefautomaticsectiontitle.string, "on"))
+  if (self->conf->xrefautomaticsectiontitle.o.string
+      && !strcmp (self->conf->xrefautomaticsectiontitle.o.string, "on"))
     node = from_element_direction (self, direction, HTT_section, 0, 0, 0);
 
   if (!node)
@@ -7571,18 +7574,18 @@ html_default_format_button (CONVERTER *self,
       else if (button->b.direction == D_direction_Space)
         {
           /* handle space button */
-          if (self->conf->ICONS.integer > 0
-              && self->conf->ACTIVE_ICONS.icons->number > 0
-              && self->conf->ACTIVE_ICONS.icons->list[button->b.direction]
+          if (self->conf->ICONS.o.integer > 0
+              && self->conf->ACTIVE_ICONS.o.icons->number > 0
+              && self->conf->ACTIVE_ICONS.o.icons->list[button->b.direction]
               && strlen
-                  (self->conf->ACTIVE_ICONS.icons->list[button->b.direction]))
+                  
(self->conf->ACTIVE_ICONS.o.icons->list[button->b.direction]))
             {
               const char *button_name_string = direction_string (self,
                                      button->b.direction, TDS_type_button,
                                                       TDS_context_string);
               formatted_button->active
                 = format_button_icon_img (self, button_name_string,
-                 self->conf->ACTIVE_ICONS.icons->list[button->b.direction], 0);
+                 self->conf->ACTIVE_ICONS.o.icons->list[button->b.direction], 
0);
             }
           else
             {
@@ -7607,13 +7610,13 @@ html_default_format_button (CONVERTER *self,
                = direction_string (self, button->b.direction,
                                    TDS_type_description, TDS_context_string);
 
-              if (self->conf->ICONS.integer > 0
-                  && self->conf->ACTIVE_ICONS.icons->number > 0
-                  && self->conf->ACTIVE_ICONS.icons->list[button->b.direction]
-                  && strlen (self->conf->ACTIVE_ICONS.icons
+              if (self->conf->ICONS.o.integer > 0
+                  && self->conf->ACTIVE_ICONS.o.icons->number > 0
+                  && 
self->conf->ACTIVE_ICONS.o.icons->list[button->b.direction]
+                  && strlen (self->conf->ACTIVE_ICONS.o.icons
                                              ->list[button->b.direction]))
                 {
-                  active_icon = self->conf->ACTIVE_ICONS.icons
+                  active_icon = self->conf->ACTIVE_ICONS.o.icons
                                                ->list[button->b.direction];
                 }
 
@@ -7623,7 +7626,7 @@ html_default_format_button (CONVERTER *self,
               text_printf (&active_text, "<a href=\"%s\"", href);
               if (description)
                 text_printf (&active_text, " title=\"%s\"", description);
-              if (self->conf->USE_ACCESSKEY.integer > 0)
+              if (self->conf->USE_ACCESSKEY.o.integer > 0)
                 {
                   const char *accesskey
                     = direction_string (self, button->b.direction,
@@ -7631,7 +7634,7 @@ html_default_format_button (CONVERTER *self,
                   if (accesskey && strlen (accesskey))
                     text_printf (&active_text, " accesskey=\"%s\"", accesskey);
                 }
-              if (self->conf->USE_REL_REV.integer > 0)
+              if (self->conf->USE_REL_REV.o.integer > 0)
                 {
                   const char *button_rel
                     = direction_string (self, button->b.direction,
@@ -7680,14 +7683,14 @@ html_default_format_button (CONVERTER *self,
 
               text_init (&passive_text);
 
-              if (self->conf->ICONS.integer > 0
-                  && self->conf->PASSIVE_ICONS.icons->number > 0
-                  && self->conf->PASSIVE_ICONS.icons->list[button->b.direction]
-                  && strlen (self->conf->PASSIVE_ICONS.icons
+              if (self->conf->ICONS.o.integer > 0
+                  && self->conf->PASSIVE_ICONS.o.icons->number > 0
+                  && 
self->conf->PASSIVE_ICONS.o.icons->list[button->b.direction]
+                  && strlen (self->conf->PASSIVE_ICONS.o.icons
                                               ->list[button->b.direction]))
                 {
                   passive_icon
-                    = 
self->conf->PASSIVE_ICONS.icons->list[button->b.direction];
+                    = 
self->conf->PASSIVE_ICONS.o.icons->list[button->b.direction];
                 }
               if (passive_icon)
                 {
@@ -7792,7 +7795,7 @@ html_default_format_navigation_panel (CONVERTER *self,
           free (button_info);
         }
 
-      if (self->conf->HEADER_IN_TABLE.integer > 0)
+      if (self->conf->HEADER_IN_TABLE.o.integer > 0)
         {
           if (vertical)
             text_append_n (&result_buttons, "<tr>\n", 5);
@@ -7829,7 +7832,7 @@ html_default_format_navigation_panel (CONVERTER *self,
       return;
     }
 
-  if (self->conf->HEADER_IN_TABLE.integer > 0)
+  if (self->conf->HEADER_IN_TABLE.o.integer > 0)
     {
       attribute_class = html_attribute_class (self, "table",
                                               &nav_panel_classes);
@@ -7853,7 +7856,7 @@ html_default_format_navigation_panel (CONVERTER *self,
 
   text_append (result, result_buttons.text);
 
-  if (self->conf->HEADER_IN_TABLE.integer > 0)
+  if (self->conf->HEADER_IN_TABLE.o.integer > 0)
     {
       if (!vertical)
         text_append_n (result, "</tr>", 5);
@@ -7899,7 +7902,7 @@ html_default_format_navigation_header (CONVERTER *self,
 {
   int vertical = 0;
   size_t result_text_index;
-  if (self->conf->VERTICAL_HEAD_NAVIGATION.integer > 0)
+  if (self->conf->VERTICAL_HEAD_NAVIGATION.o.integer > 0)
     vertical = 1;
   if (vertical)
     text_append (result,
@@ -7913,12 +7916,12 @@ html_default_format_navigation_header (CONVERTER *self,
 
   if (vertical)
     text_append (result, "</td>\n<td>\n");
-  else if (self->conf->SPLIT.string
-           && !strcmp (self->conf->SPLIT.string, "node")
-           && self->conf->DEFAULT_RULE.string
+  else if (self->conf->SPLIT.o.string
+           && !strcmp (self->conf->SPLIT.o.string, "node")
+           && self->conf->DEFAULT_RULE.o.string
            && result->end > result_text_index)
     {
-      text_append (result, self->conf->DEFAULT_RULE.string);
+      text_append (result, self->conf->DEFAULT_RULE.o.string);
       text_append_n (result, "\n", 1);
     }
 }
@@ -7952,7 +7955,7 @@ html_default_format_element_header (CONVERTER *self,
                                const char *cmdname, const ELEMENT *command,
                                const OUTPUT_UNIT *output_unit, TEXT *result)
 {
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     {
       int i;
       TEXT debug_txt;
@@ -8003,7 +8006,7 @@ html_default_format_element_header (CONVERTER *self,
                                output_unit->tree_unit_directions[D_prev]))
         previous_is_top = 1;
 
-      if (self->conf->DEBUG.integer > 0)
+      if (self->conf->DEBUG.o.integer > 0)
         {
           char *root_heading_texi = root_heading_command_to_texinfo (command);
           fprintf (stderr, "Header (%d, %d, %d): %s\n", previous_is_top,
@@ -8014,50 +8017,51 @@ html_default_format_element_header (CONVERTER *self,
       if (is_top)
        /* use TOP_BUTTONS for top. */
         {
-          if ((self->conf->SPLIT.string && strlen (self->conf->SPLIT.string))
-              || self->conf->HEADERS.integer > 0)
-            format_navigation_header (self, self->conf->TOP_BUTTONS.buttons,
+          if ((self->conf->SPLIT.o.string && strlen 
(self->conf->SPLIT.o.string))
+              || self->conf->HEADERS.o.integer > 0)
+            format_navigation_header (self, self->conf->TOP_BUTTONS.o.buttons,
                                       cmdname, command, result);
         }
       else
         {
-          if (first_in_page && self->conf->HEADERS.integer <= 0)
+          if (first_in_page && self->conf->HEADERS.o.integer <= 0)
             {
-              if (self->conf->SPLIT.string
-                  && !strcmp (self->conf->SPLIT.string, "chapter"))
+              if (self->conf->SPLIT.o.string
+                  && !strcmp (self->conf->SPLIT.o.string, "chapter"))
                 {
                   format_navigation_header (self,
-                     self->conf->CHAPTER_BUTTONS.buttons, cmdname, command,
+                     self->conf->CHAPTER_BUTTONS.o.buttons, cmdname, command,
                      result);
-                  if (self->conf->DEFAULT_RULE.string
-                      && self->conf->VERTICAL_HEAD_NAVIGATION.integer <= 0)
+                  if (self->conf->DEFAULT_RULE.o.string
+                      && self->conf->VERTICAL_HEAD_NAVIGATION.o.integer <= 0)
                     {
-                      text_append (result, self->conf->DEFAULT_RULE.string);
+                      text_append (result, self->conf->DEFAULT_RULE.o.string);
                       text_append_n (result, "\n", 1);
                     }
                 }
-              else if (self->conf->SPLIT.string
-                       && !strcmp (self->conf->SPLIT.string, "section"))
+              else if (self->conf->SPLIT.o.string
+                       && !strcmp (self->conf->SPLIT.o.string, "section"))
                 {
                   format_navigation_header (self,
-                     self->conf->SECTION_BUTTONS.buttons, cmdname, command,
+                     self->conf->SECTION_BUTTONS.o.buttons, cmdname, command,
                      result);
                 }
             }
           if ((first_in_page || previous_is_top)
-              && self->conf->HEADERS.integer > 0)
+              && self->conf->HEADERS.o.integer > 0)
             {
               format_navigation_header (self,
-                 self->conf->SECTION_BUTTONS.buttons, cmdname, command,
+                 self->conf->SECTION_BUTTONS.o.buttons, cmdname, command,
                  result);
             }
-          else if (self->conf->HEADERS.integer > 0
-                   || (self->conf->SPLIT.string
-                       && !strcmp (self->conf->SPLIT.string, "node")))
+          else if (self->conf->HEADERS.o.integer > 0
+                   || (self->conf->SPLIT.o.string
+                       && !strcmp (self->conf->SPLIT.o.string, "node")))
             {
           /* got to do this here, as it isn't done otherwise since
              navigation_header is not called */
-               format_navigation_panel (self, 
self->conf->SECTION_BUTTONS.buttons,
+               format_navigation_panel (self,
+                                     self->conf->SECTION_BUTTONS.o.buttons,
                                         cmdname, command, 0, result);
             }
         }
@@ -8167,10 +8171,10 @@ html_default_format_element_footer (CONVERTER *self,
     }
 
   if ((end_page || next_is_top || next_is_special || is_top)
-      && self->conf->VERTICAL_HEAD_NAVIGATION.integer > 0
-      && (!self->conf->SPLIT.string || !strlen (self->conf->SPLIT.string)
-          || strcmp (self->conf->SPLIT.string, "node")
-          || self->conf->HEADERS.integer > 0 || unit_type == OU_special_unit
+      && self->conf->VERTICAL_HEAD_NAVIGATION.o.integer > 0
+      && (!self->conf->SPLIT.o.string || !strlen (self->conf->SPLIT.o.string)
+          || strcmp (self->conf->SPLIT.o.string, "node")
+          || self->conf->HEADERS.o.integer > 0 || unit_type == OU_special_unit
           || is_top))
     {
       text_append_n (result, "</td>\n</tr>\n</table>\n", 21);
@@ -8195,42 +8199,42 @@ html_default_format_element_footer (CONVERTER *self,
 
       /* setup buttons for navigation footer */
       if ((is_top || unit_type == OU_special_unit)
-           && ((self->conf->SPLIT.string
-                && strcmp (self->conf->SPLIT.string, ""))
-               || self->conf->MONOLITHIC.integer <= 0)
-           && (self->conf->HEADERS.integer > 0
-               || (self->conf->SPLIT.string
-                   && strcmp (self->conf->SPLIT.string, "")
-                   && strcmp (self->conf->SPLIT.string, "node"))))
+           && ((self->conf->SPLIT.o.string
+                && strcmp (self->conf->SPLIT.o.string, ""))
+               || self->conf->MONOLITHIC.o.integer <= 0)
+           && (self->conf->HEADERS.o.integer > 0
+               || (self->conf->SPLIT.o.string
+                   && strcmp (self->conf->SPLIT.o.string, "")
+                   && strcmp (self->conf->SPLIT.o.string, "node"))))
          {
            if (is_top)
-             buttons = self->conf->TOP_FOOTER_BUTTONS.buttons;
+             buttons = self->conf->TOP_FOOTER_BUTTONS.o.buttons;
            else
-             buttons = self->conf->MISC_BUTTONS.buttons;
+             buttons = self->conf->MISC_BUTTONS.o.buttons;
          }
-      else if (self->conf->SPLIT.string
-                && !strcmp (self->conf->SPLIT.string, "section"))
-        buttons = self->conf->SECTION_FOOTER_BUTTONS.buttons;
-      else if (self->conf->SPLIT.string
-                && !strcmp (self->conf->SPLIT.string, "chapter"))
-        buttons = self->conf->CHAPTER_FOOTER_BUTTONS.buttons;
-      else if (self->conf->SPLIT.string
-                && !strcmp (self->conf->SPLIT.string, "node"))
-        {
-          if (self->conf->HEADERS.integer > 0)
+      else if (self->conf->SPLIT.o.string
+                && !strcmp (self->conf->SPLIT.o.string, "section"))
+        buttons = self->conf->SECTION_FOOTER_BUTTONS.o.buttons;
+      else if (self->conf->SPLIT.o.string
+                && !strcmp (self->conf->SPLIT.o.string, "chapter"))
+        buttons = self->conf->CHAPTER_FOOTER_BUTTONS.o.buttons;
+      else if (self->conf->SPLIT.o.string
+                && !strcmp (self->conf->SPLIT.o.string, "node"))
+        {
+          if (self->conf->HEADERS.o.integer > 0)
             {
-              if (self->conf->WORDS_IN_PAGE.integer > 0)
+              if (self->conf->WORDS_IN_PAGE.o.integer > 0)
                 {
                   int count;
                   int more_than_level = word_number_more_than_level (content,
-                                    self->conf->WORDS_IN_PAGE.integer, &count);
+                                    self->conf->WORDS_IN_PAGE.o.integer, 
&count);
                   if (content && more_than_level)
                     {
-                      buttons = self->conf->NODE_FOOTER_BUTTONS.buttons;
+                      buttons = self->conf->NODE_FOOTER_BUTTONS.o.buttons;
                     }
                 }
               else
-                buttons = self->conf->NODE_FOOTER_BUTTONS.buttons;
+                buttons = self->conf->NODE_FOOTER_BUTTONS.o.buttons;
             }
         }
     }
@@ -8239,30 +8243,30 @@ html_default_format_element_footer (CONVERTER *self,
        || (output_unit->unit_filename
            && strcmp (output_unit->unit_filename,
               output_unit->tree_unit_directions[D_next]->unit_filename)))
-      && (!self->conf->footnotestyle.string
-          || strcmp (self->conf->footnotestyle.string, "separate")))
+      && (!self->conf->footnotestyle.o.string
+          || strcmp (self->conf->footnotestyle.o.string, "separate")))
     {
       format_footnotes_segment (self, result);
     }
 
-  if (buttons || !end_page || self->conf->PROGRAM_NAME_IN_FOOTER.integer > 0)
+  if (buttons || !end_page || self->conf->PROGRAM_NAME_IN_FOOTER.o.integer > 0)
     {
       const char *rule = 0;
 
       if (!end_page && (is_top || next_is_top || (next_is_special
                                        && unit_type != OU_special_unit)))
         {
-          rule = self->conf->BIG_RULE.string;
+          rule = self->conf->BIG_RULE.o.string;
         }
       else if (!buttons || is_top || unit_type == OU_special_unit
-               || (end_page && self->conf->SPLIT.string
-                   && (!strcmp (self->conf->SPLIT.string, "section")
-                       || !strcmp (self->conf->SPLIT.string, "chapter")))
-               || (self->conf->SPLIT.string
-                   && !strcmp (self->conf->SPLIT.string, "node")
-                   && self->conf->HEADERS.integer > 0))
+               || (end_page && self->conf->SPLIT.o.string
+                   && (!strcmp (self->conf->SPLIT.o.string, "section")
+                       || !strcmp (self->conf->SPLIT.o.string, "chapter")))
+               || (self->conf->SPLIT.o.string
+                   && !strcmp (self->conf->SPLIT.o.string, "node")
+                   && self->conf->HEADERS.o.integer > 0))
         {
-          rule = self->conf->DEFAULT_RULE.string;
+          rule = self->conf->DEFAULT_RULE.o.string;
         }
       if (rule && strlen (rule))
         {
@@ -8342,16 +8346,16 @@ html_default_format_node_redirection_page (CONVERTER 
*self,
 
   text_init (&result);
 
-  if (self->conf->DOCTYPE.string)
-    text_append (&result, self->conf->DOCTYPE.string);
+  if (self->conf->DOCTYPE.o.string)
+    text_append (&result, self->conf->DOCTYPE.o.string);
   text_append_n (&result, "\n", 1);
   text_printf (&result, "<html%s>\n", 
begin_info->root_html_element_attributes);
-  if (self->conf->PACKAGE_AND_VERSION.string)
-    package_and_version = self->conf->PACKAGE_AND_VERSION.string;
+  if (self->conf->PACKAGE_AND_VERSION.o.string)
+    package_and_version = self->conf->PACKAGE_AND_VERSION.o.string;
   else
     package_and_version = "";
-  if (self->conf->PACKAGE_URL.string)
-    package_url = self->conf->PACKAGE_URL.string;
+  if (self->conf->PACKAGE_URL.o.string)
+    package_url = self->conf->PACKAGE_URL.o.string;
   else
     package_url = "";
   text_printf (&result, "<!-- Created by %s, %s -->\n"
@@ -8398,8 +8402,8 @@ html_default_format_node_redirection_page (CONVERTER 
*self,
     text_append (&result, begin_info->extra_head);
   text_append_n (&result, "\n</head>\n\n", 10);
   text_printf (&result, "<body %s>\n", begin_info->body_attributes);
-  if (self->conf->AFTER_BODY_OPEN.string)
-    text_append (&result, self->conf->AFTER_BODY_OPEN.string);
+  if (self->conf->AFTER_BODY_OPEN.o.string)
+    text_append (&result, self->conf->AFTER_BODY_OPEN.o.string);
 
   text_append_n (&result, "\n<p>", 4);
   text_append (&result, body.text);
@@ -8627,8 +8631,8 @@ convert_style_command (CONVERTER *self, const enum 
command_id cmd,
           free (style_as_cmd);
         }
 
-      if (formatting_spec->quote && self->conf->OPEN_QUOTE_SYMBOL.string)
-        text_append (result, self->conf->OPEN_QUOTE_SYMBOL.string);
+      if (formatting_spec->quote && self->conf->OPEN_QUOTE_SYMBOL.o.string)
+        text_append (result, self->conf->OPEN_QUOTE_SYMBOL.o.string);
 
       open
         = html_attribute_class (self, formatting_spec->element, classes);
@@ -8653,8 +8657,8 @@ convert_style_command (CONVERTER *self, const enum 
command_id cmd,
           text_append_n (result, ">", 1);
         }
 
-      if (formatting_spec->quote && self->conf->CLOSE_QUOTE_SYMBOL.string)
-        text_append (result, self->conf->CLOSE_QUOTE_SYMBOL.string);
+      if (formatting_spec->quote && self->conf->CLOSE_QUOTE_SYMBOL.o.string)
+        text_append (result, self->conf->CLOSE_QUOTE_SYMBOL.o.string);
     }
   else
     text_append (result, args_formatted->args[0].formatted[AFT_type_normal]);
@@ -8972,10 +8976,10 @@ convert_footnote_command (CONVERTER *self, const enum 
command_id cmd,
   self->shared_conversion_state.footnote_number++;
   foot_num = self->shared_conversion_state.footnote_number;
 
-  if (self->conf->NUMBER_FOOTNOTES.integer > 0)
+  if (self->conf->NUMBER_FOOTNOTES.o.integer > 0)
     xasprintf (&footnote_mark, "%d", foot_num);
-  else if (self->conf->NO_NUMBER_FOOTNOTE_SYMBOL.string)
-    footnote_mark = strdup (self->conf->NO_NUMBER_FOOTNOTE_SYMBOL.string);
+  else if (self->conf->NO_NUMBER_FOOTNOTE_SYMBOL.o.string)
+    footnote_mark = strdup (self->conf->NO_NUMBER_FOOTNOTE_SYMBOL.o.string);
   else
     footnote_mark = strdup ("");
 
@@ -9033,8 +9037,8 @@ convert_footnote_command (CONVERTER *self, const enum 
command_id cmd,
       footnote_id_number->number++;
     }
 
-  if ((!self->conf->footnotestyle.string
-       || strcmp (self->conf->footnotestyle.string, "separate"))
+  if ((!self->conf->footnotestyle.o.string
+       || strcmp (self->conf->footnotestyle.o.string, "separate"))
       && (multi_expanded_region || multiple_expanded_footnote))
     {
    /* if the footnote appears multiple times, command_href() will select
@@ -9160,7 +9164,7 @@ find_image_extension_file (CONVERTER *self, const ELEMENT 
*element,
                    image_file, 0, &input_file_encoding, &element->source_info);
 
   located_image_path = locate_include_file (file_name,
-                                      self->conf->INCLUDE_DIRECTORIES.strlist);
+                                   self->conf->INCLUDE_DIRECTORIES.o.strlist);
   free (file_name);
 
   if (located_image_path)
@@ -9323,10 +9327,10 @@ convert_image_command (CONVERTER *self, const enum 
command_id cmd,
       free_image_file_location_info (image_path_info);
       free (image_path_info);
 
-      if (self->conf->IMAGE_LINK_PREFIX.string)
+      if (self->conf->IMAGE_LINK_PREFIX.o.string)
         {
           char *tmp;
-          xasprintf (&tmp, "%s%s", self->conf->IMAGE_LINK_PREFIX.string,
+          xasprintf (&tmp, "%s%s", self->conf->IMAGE_LINK_PREFIX.o.string,
                                    image_file);
           free (image_file);
           image_file = tmp;
@@ -9379,8 +9383,8 @@ convert_math_command (CONVERTER *self, const enum 
command_id cmd,
   classes = new_string_list ();
   add_string (builtin_command_name (cmd), classes);
 
-  if (self->conf->HTML_MATH.string
-      && !strcmp (self->conf->HTML_MATH.string, "mathjax"))
+  if (self->conf->HTML_MATH.o.string
+      && !strcmp (self->conf->HTML_MATH.o.string, "mathjax"))
     {
       html_register_file_information (self, "mathjax", 1);
       add_string ("tex2jax_process", classes);
@@ -9514,9 +9518,9 @@ convert_accent_command (CONVERTER *self, const enum 
command_id cmd,
   char *(*format_accents)(CONVERTER *self, const char *text,
                          const ELEMENT *element, int set_case);
 
-  int output_encoded_characters = (self->conf->OUTPUT_CHARACTERS.integer > 0);
+  int output_encoded_characters = (self->conf->OUTPUT_CHARACTERS.o.integer > 
0);
 
-  if (self->conf->USE_NUMERIC_ENTITY.integer > 0)
+  if (self->conf->USE_NUMERIC_ENTITY.o.integer > 0)
     format_accents = &html_accent_entities_numeric_entities_accent;
   else
     format_accents = &html_accent_entities_html_accent;
@@ -9734,7 +9738,7 @@ css_string_convert_accent_command (CONVERTER *self, const 
enum command_id cmd,
   char *(*format_accents)(CONVERTER *self, const char *text,
                          const ELEMENT *element, int set_case);
 
-  int output_encoded_characters = (self->conf->OUTPUT_CHARACTERS.integer > 0);
+  int output_encoded_characters = (self->conf->OUTPUT_CHARACTERS.o.integer > 
0);
 
   format_accents = &css_string_accent;
 
@@ -9758,8 +9762,8 @@ convert_indicateurl_command (CONVERTER *self, const enum 
command_id cmd,
       || !args_formatted->args[0].formatted[AFT_type_normal])
     return;
 
-  if (self->conf->OPEN_QUOTE_SYMBOL.string)
-    text_append (result, self->conf->OPEN_QUOTE_SYMBOL.string);
+  if (self->conf->OPEN_QUOTE_SYMBOL.o.string)
+    text_append (result, self->conf->OPEN_QUOTE_SYMBOL.o.string);
 
   if (!html_in_string (self))
     {
@@ -9781,8 +9785,8 @@ convert_indicateurl_command (CONVERTER *self, const enum 
command_id cmd,
   else
     text_append (result, args_formatted->args[0].formatted[AFT_type_normal]);
 
-  if (self->conf->CLOSE_QUOTE_SYMBOL.string)
-    text_append (result, self->conf->CLOSE_QUOTE_SYMBOL.string);
+  if (self->conf->CLOSE_QUOTE_SYMBOL.o.string)
+    text_append (result, self->conf->CLOSE_QUOTE_SYMBOL.o.string);
 }
 
 void
@@ -9826,7 +9830,7 @@ contents_inline_element (CONVERTER *self, const enum 
command_id cmd,
 {
   char *table_of_contents;
 
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     fprintf (stderr, "CONTENTS_INLINE %s\n", builtin_command_name (cmd));
 
   table_of_contents = format_contents (self, cmd, element, 0);
@@ -9886,7 +9890,7 @@ contents_inline_element (CONVERTER *self, const enum 
command_id cmd,
               if (!heading)
                 heading = strdup ("");
               format_heading_text (self, 0, classes, heading,
-                                   self->conf->CHAPTER_HEADER_LEVEL.integer,
+                                   self->conf->CHAPTER_HEADER_LEVEL.o.integer,
                                    0, 0, 0, &result);
               destroy_strings_list (classes);
 
@@ -9956,7 +9960,7 @@ mini_toc_internal (CONVERTER *self, const ELEMENT 
*element, TEXT *result)
 
           entry_index++;
 
-          if (self->conf->USE_ACCESSKEY.integer > 0 && entry_index < 10)
+          if (self->conf->USE_ACCESSKEY.o.integer > 0 && entry_index < 10)
             {
               xasprintf (&accesskey, " accesskey=\"%d\"", entry_index);
             }
@@ -10026,7 +10030,7 @@ convert_heading_command (CONVERTER *self, const enum 
command_id cmd,
 
   element_id = html_command_id (self, element);
 
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     {
       char *root_heading_texi = root_heading_command_to_texinfo (element);
       fprintf (stderr, "CONVERT elt heading %s\n", root_heading_texi);
@@ -10047,8 +10051,8 @@ convert_heading_command (CONVERTER *self, const enum 
command_id cmd,
   text_init (&tables_of_contents);
   text_append (&tables_of_contents, "");
   if (element->cmd == CM_top
-      && self->conf->CONTENTS_OUTPUT_LOCATION.string
-      && !strcmp (self->conf->CONTENTS_OUTPUT_LOCATION.string, "after_top")
+      && self->conf->CONTENTS_OUTPUT_LOCATION.o.string
+      && !strcmp (self->conf->CONTENTS_OUTPUT_LOCATION.o.string, "after_top")
       && self->document->sections_list
       && self->document->sections_list->number > 1)
     {
@@ -10058,8 +10062,9 @@ convert_heading_command (CONVERTER *self, const enum 
command_id cmd,
         {
           int contents_set = 0;
           enum command_id cmd = contents_cmds[i];
-          const OPTION *contents_option_ref = get_command_option (self->conf, 
cmd);
-          if (contents_option_ref->integer > 0)
+          const OPTION *contents_option_ref
+                 = get_command_option (self->conf, cmd);
+          if (contents_option_ref->o.integer > 0)
             contents_set = 1;
           if (contents_set)
             {
@@ -10078,13 +10083,13 @@ convert_heading_command (CONVERTER *self, const enum 
command_id cmd,
   text_append (&mini_toc_or_auto_menu, "");
   if (tables_of_contents.end <= 0
       && (flags & CF_sectioning_heading)
-      && self->conf->FORMAT_MENU.string)
+      && self->conf->FORMAT_MENU.o.string)
     {
-      if (!strcmp (self->conf->FORMAT_MENU.string, "sectiontoc"))
+      if (!strcmp (self->conf->FORMAT_MENU.o.string, "sectiontoc"))
         {
           mini_toc_internal (self, element, &mini_toc_or_auto_menu);
         }
-      else if (!strcmp (self->conf->FORMAT_MENU.string, "menu"))
+      else if (!strcmp (self->conf->FORMAT_MENU.o.string, "menu"))
         {
           const ELEMENT *node
             = lookup_extra_element (element, "associated_node");
@@ -10113,7 +10118,7 @@ convert_heading_command (CONVERTER *self, const enum 
command_id cmd,
         }
     }
 
-  if (self->conf->NO_TOP_NODE_OUTPUT.integer > 0
+  if (self->conf->NO_TOP_NODE_OUTPUT.o.integer > 0
       && builtin_command_data[cmd].flags & CF_root)
     {
       const ELEMENT *node_element = 0;
@@ -10233,14 +10238,14 @@ convert_heading_command (CONVERTER *self, const enum 
command_id cmd,
           else
             {
               int use_next_heading = 0;
-              if (self->conf->USE_NEXT_HEADING_FOR_LONE_NODE.integer > 0)
+              if (self->conf->USE_NEXT_HEADING_FOR_LONE_NODE.o.integer > 0)
                 {
                   const ELEMENT *next_heading
                     = find_root_command_next_heading_command (element,
                                                         self->expanded_formats,
-                    (self->conf->CONTENTS_OUTPUT_LOCATION.string
+                    (self->conf->CONTENTS_OUTPUT_LOCATION.o.string
                      && !strcmp (
-                        self->conf->CONTENTS_OUTPUT_LOCATION.string, 
"inline")),
+                        self->conf->CONTENTS_OUTPUT_LOCATION.o.string, 
"inline")),
                             0);
                   if (next_heading)
                     use_next_heading = 1;
@@ -10350,7 +10355,7 @@ convert_heading_command (CONVERTER *self, const enum 
command_id cmd,
   if (do_heading)
     {
       STRING_LIST *heading_classes;
-      if (self->conf->TOC_LINKS.integer > 0
+      if (self->conf->TOC_LINKS.o.integer > 0
           && (builtin_command_data[cmd].flags & CF_root)
           && (builtin_command_data[cmd].flags & CF_sectioning_heading))
         {
@@ -10394,7 +10399,8 @@ convert_heading_command (CONVERTER *self, const enum 
command_id cmd,
         {
           format_heading_text (self, level_corrected_cmd,
                     heading_classes, heading,
-                    heading_level + self->conf->CHAPTER_HEADER_LEVEL.integer 
-1,
+                    heading_level
+                       + self->conf->CHAPTER_HEADER_LEVEL.o.integer -1,
                     heading_id, element, element_id, result);
         }
       destroy_strings_list (heading_classes);
@@ -10578,7 +10584,7 @@ convert_preformatted_command (CONVERTER *self, const 
enum command_id cmd,
       main_cmd = CM_example;
     }
 
-  if (self->conf->INDENTED_BLOCK_COMMANDS_IN_TABLE.integer > 0
+  if (self->conf->INDENTED_BLOCK_COMMANDS_IN_TABLE.o.integer > 0
       && html_commands_data[cmd].flags & HF_indented_preformatted)
     {
       indent_with_table (self, cmd, content,
@@ -10640,7 +10646,7 @@ convert_indented_command (CONVERTER *self, const enum 
command_id cmd,
   else
     main_cmd = cmd;
 
-  if (self->conf->INDENTED_BLOCK_COMMANDS_IN_TABLE.integer > 0)
+  if (self->conf->INDENTED_BLOCK_COMMANDS_IN_TABLE.o.integer > 0)
     {
       indent_with_table (self, main_cmd, content,
                          additional_classes, result);
@@ -10717,8 +10723,8 @@ convert_displaymath_command (CONVERTER *self, const 
enum command_id cmd,
 
   clear_strings_list (classes);
 
-  if (self->conf->HTML_MATH.string
-      && !strcmp (self->conf->HTML_MATH.string, "mathjax"))
+  if (self->conf->HTML_MATH.o.string
+      && !strcmp (self->conf->HTML_MATH.o.string, "mathjax"))
     {
       html_register_file_information (self, "mathjax", 1);
       add_string ("tex2jax_process", classes);
@@ -11673,7 +11679,7 @@ convert_itemize_command (CONVERTER *self, const enum 
command_id cmd,
   text_append (result, attribute_class);
   free (attribute_class);
 
-  if (!selector_style && self->conf->NO_CSS.integer <= 0)
+  if (!selector_style && self->conf->NO_CSS.o.integer <= 0)
     {
       char *css_string
         = html_convert_css_string_for_list_mark (self, element->args.list[0],
@@ -12136,8 +12142,8 @@ convert_xref_commands (CONVERTER *self, const enum 
command_id cmd,
 
       if (!name)
         {
-          if (self->conf->xrefautomaticsectiontitle.string
-              && !strcmp (self->conf->xrefautomaticsectiontitle.string, "on")
+          if (self->conf->xrefautomaticsectiontitle.o.string
+              && !strcmp (self->conf->xrefautomaticsectiontitle.o.string, "on")
               && associated_section
         /* this condition avoids infinite recursions, indeed in that case
            the node will be used and not the section.  There should not be
@@ -12154,7 +12160,7 @@ convert_xref_commands (CONVERTER *self, const enum 
command_id cmd,
             }
           else if (target_node->cmd == CM_float)
             {
-              if (self->conf->XREF_USE_FLOAT_LABEL.integer <= 0)
+              if (self->conf->XREF_USE_FLOAT_LABEL.o.integer <= 0)
                 {
                   name = html_command_text (self, target_root, 0);
                 }
@@ -12171,8 +12177,8 @@ convert_xref_commands (CONVERTER *self, const enum 
command_id cmd,
                     name = strdup ("");
                 }
             }
-          else if (self->conf->XREF_USE_NODE_NAME_ARG.integer <= 0
-                   && (self->conf->XREF_USE_NODE_NAME_ARG.integer == 0
+          else if (self->conf->XREF_USE_NODE_NAME_ARG.o.integer <= 0
+                   && (self->conf->XREF_USE_NODE_NAME_ARG.o.integer == 0
                        || !html_in_preformatted_context (self)))
             {
               name = html_command_text (self, target_root, HTT_text_nonumber);
@@ -12339,7 +12345,7 @@ convert_xref_commands (CONVERTER *self, const enum 
command_id cmd,
           TEXT manual_name_attribute;
           text_init (&manual_name_attribute);
           text_append (&manual_name_attribute, "");
-          if (file && self->conf->NO_CUSTOM_HTML_ATTRIBUTE.integer <= 0)
+          if (file && self->conf->NO_CUSTOM_HTML_ATTRIBUTE.o.integer <= 0)
             {
               text_append_n (&manual_name_attribute, "data-manual=\"", 13);
               format_protect_text (self, file, &manual_name_attribute);
@@ -12709,7 +12715,7 @@ convert_printindex_command (CONVERTER *self, const enum 
command_id cmd,
           ELEMENT *letter_text = new_element (ET_NONE);
           text_append (&letter_text->text, letter);
           normalized_letter = normalize_transliterate_texinfo (letter_text,
-                                             (self->conf->TEST.integer > 0));
+                                             (self->conf->TEST.o.integer > 0));
           destroy_element (letter_text);
 
           if (strcmp (letter, normalized_letter))
@@ -12801,7 +12807,7 @@ convert_printindex_command (CONVERTER *self, const enum 
command_id cmd,
                                      "integer", &status);
           entry_nr++;
 
-          if (self->conf->NO_TOP_NODE_OUTPUT.integer > 0)
+          if (self->conf->NO_TOP_NODE_OUTPUT.o.integer > 0)
             {
               const ELEMENT *element_node
                 = lookup_extra_element (main_entry_element, "element_node");
@@ -13141,9 +13147,9 @@ convert_printindex_command (CONVERTER *self, const enum 
command_id cmd,
                 {
                   if (in_code)
                     text_append_n (&entries_text, "</code>", 7);
-                  if (self->conf->INDEX_ENTRY_COLON.string)
+                  if (self->conf->INDEX_ENTRY_COLON.o.string)
                     text_append (&entries_text,
-                                 self->conf->INDEX_ENTRY_COLON.string);
+                                 self->conf->INDEX_ENTRY_COLON.o.string);
                 }
               text_append_n (&entries_text, "</td>", 5);
 
@@ -13238,12 +13244,12 @@ convert_printindex_command (CONVERTER *self, const 
enum command_id cmd,
                   if (in_code)
                     text_append_n (&entries_text, "</code>", 7);
                   text_append_n (&entries_text, "</a>", 4);
-                  if (self->conf->INDEX_ENTRY_COLON.string)
+                  if (self->conf->INDEX_ENTRY_COLON.o.string)
                     text_append (&entries_text,
-                                 self->conf->INDEX_ENTRY_COLON.string);
+                                 self->conf->INDEX_ENTRY_COLON.o.string);
                   text_append_n (&entries_text, "</td>", 5);
 
-                  if (self->conf->NODE_NAME_IN_INDEX.integer > 0)
+                  if (self->conf->NODE_NAME_IN_INDEX.o.integer > 0)
                     {
                       associated_command
                           = lookup_extra_element (main_entry_element,
@@ -13291,7 +13297,7 @@ convert_printindex_command (CONVERTER *self, const enum 
command_id cmd,
             NODE_NAME_IN_INDEX may be undef even with USE_NODES set if the
             converter is called as convert() as in the test suite */
 
-                          if (self->conf->NODE_NAME_IN_INDEX.integer == 0
+                          if (self->conf->NODE_NAME_IN_INDEX.o.integer == 0
                               && *formatted_index_entry_nr == 1)
                             {
                               char *element_region
@@ -13439,9 +13445,9 @@ convert_printindex_command (CONVERTER *self, const enum 
command_id cmd,
           text_append_n (&result_index_entries, "</th></tr>\n", 11);
           text_append (&result_index_entries, entries_text.text);
           text_append_n (&result_index_entries, "<tr><td colspan=\"3\">", 20);
-          if (self->conf->DEFAULT_RULE.string)
+          if (self->conf->DEFAULT_RULE.o.string)
             text_append (&result_index_entries,
-                         self->conf->DEFAULT_RULE.string);
+                         self->conf->DEFAULT_RULE.o.string);
           text_append_n (&result_index_entries, "</td></tr>\n", 11);
         }
       else
@@ -13616,8 +13622,8 @@ convert_printindex_command (CONVERTER *self, const enum 
command_id cmd,
                                       "Tr th idx entries 2");
   text_append_n (result, "</th></tr>\n", 11);
   text_append_n (result, "<tr><td colspan=\"3\">", 20);
-  if (self->conf->DEFAULT_RULE.string)
-    text_append (result, self->conf->DEFAULT_RULE.string);
+  if (self->conf->DEFAULT_RULE.o.string)
+    text_append (result, self->conf->DEFAULT_RULE.o.string);
   text_append_n (result, "</td></tr>\n", 11);
   text_append (result, result_index_entries.text);
   text_append_n (result, "</table>\n", 9);
@@ -13676,11 +13682,11 @@ convert_contents_command (CONVERTER *self, const enum 
command_id cmd,
 
   set_informative_command_value (self->conf, element);
 
-  if (self->conf->CONTENTS_OUTPUT_LOCATION.string
-      && !strcmp (self->conf->CONTENTS_OUTPUT_LOCATION.string, "inline")
-      && ((used_cmd == CM_contents && self->conf->contents.integer > 0)
+  if (self->conf->CONTENTS_OUTPUT_LOCATION.o.string
+      && !strcmp (self->conf->CONTENTS_OUTPUT_LOCATION.o.string, "inline")
+      && ((used_cmd == CM_contents && self->conf->contents.o.integer > 0)
           || (used_cmd == CM_shortcontents
-              && self->conf->shortcontents.integer > 0))
+              && self->conf->shortcontents.o.integer > 0))
       && self->document->sections_list
       && self->document->sections_list->number > 1)
     {
@@ -13744,7 +13750,7 @@ convert_def_command (CONVERTER *self, const enum 
command_id cmd,
   else
     add_string (builtin_command_name (cmd), classes);
 
-  if (self->conf->DEF_TABLE.integer <= 0)
+  if (self->conf->DEF_TABLE.o.integer <= 0)
     {
       attribute_class = html_attribute_class (self, "dl", classes);
       text_append (result, attribute_class);
@@ -14330,7 +14336,7 @@ menu_entry_a (const CONVERTER *self, const char *href, 
int isindex,
   text_printf (result, "<a href=\"%s\"", href);
   if (isindex)
     text_append_n (result, " rel=\"index\"", 12);
-  if (self->conf->USE_ACCESSKEY.integer > 0 && html_menu_entry_index < 10)
+  if (self->conf->USE_ACCESSKEY.o.integer > 0 && html_menu_entry_index < 10)
     text_printf (result, " accesskey=\"%d\"", html_menu_entry_index);
   text_append_n (result, ">", 1);
 }
@@ -14398,7 +14404,7 @@ convert_menu_entry_type (CONVERTER *self, const enum 
element_type type,
 
    /* if !NODE_NAME_IN_MENU, we pick the associated section, except if
       the node is the element command */
-              if (self->conf->NODE_NAME_IN_MENU.integer <= 0)
+              if (self->conf->NODE_NAME_IN_MENU.o.integer <= 0)
                 {
                   const ELEMENT *associated_section = lookup_extra_element 
(node,
                                                        "associated_section");
@@ -14476,8 +14482,8 @@ convert_menu_entry_type (CONVERTER *self, const enum 
element_type type,
           text_append_n (result, leading_text, menu_symbol - leading_text);
           leading_text = menu_symbol;
         }
-      if (self->conf->MENU_SYMBOL.string)
-        text_append (result, self->conf->MENU_SYMBOL.string);
+      if (self->conf->MENU_SYMBOL.o.string)
+        text_append (result, self->conf->MENU_SYMBOL.o.string);
       /* past "*" */
       leading_text++;
       text_append (result, leading_text);
@@ -14645,8 +14651,8 @@ convert_menu_entry_type (CONVERTER *self, const enum 
element_type type,
                 }
             }
 
-          if (self->conf->MENU_SYMBOL.string)
-            text_append (result, self->conf->MENU_SYMBOL.string);
+          if (self->conf->MENU_SYMBOL.o.string)
+            text_append (result, self->conf->MENU_SYMBOL.o.string);
           text_append_n (result, " ", 1);
 
           if (href)
@@ -14673,8 +14679,8 @@ convert_menu_entry_type (CONVERTER *self, const enum 
element_type type,
             text_append_n (result, "</a>", 4);
         }
 
-      if (self->conf->MENU_ENTRY_COLON.string)
-        text_append (result, self->conf->MENU_ENTRY_COLON.string);
+      if (self->conf->MENU_ENTRY_COLON.o.string)
+        text_append (result, self->conf->MENU_ENTRY_COLON.o.string);
       text_append_n (result, "</td><td>", 9);
       text_append_n (result,
                 self->special_character[SC_non_breaking_space].string,
@@ -14970,8 +14976,8 @@ convert_def_line_type (CONVERTER *self, const enum 
element_type type,
           text_append_n (&def_call, "</code>", 7);
         }
       if ((base_cmd == CM_deftypefn || base_cmd == CM_deftypeop)
-          && self->conf->deftypefnnewline.string
-          && !strcmp (self->conf->deftypefnnewline.string, "on"))
+          && self->conf->deftypefnnewline.o.string
+          && !strcmp (self->conf->deftypefnnewline.o.string, "on"))
         {
           text_append_n (&def_call, self->line_break_element.string,
                                     self->line_break_element.len);
@@ -15072,7 +15078,7 @@ convert_def_line_type (CONVERTER *self, const enum 
element_type type,
       free (args_formatted);
     }
 
-  if (self->conf->DEF_TABLE.integer > 0)
+  if (self->conf->DEF_TABLE.o.integer > 0)
     {
       ELEMENT *category_tree
          = definition_category_tree (self->conf, element);
@@ -15137,8 +15143,8 @@ convert_def_line_type (CONVERTER *self, const enum 
element_type type,
                                             "class", class_copy);
 
           if (base_cmd == CM_deftypeop && parsed_def->type
-              && self->conf->deftypefnnewline.string
-              && !strcmp (self->conf->deftypefnnewline.string, "on"))
+              && self->conf->deftypefnnewline.o.string
+              && !strcmp (self->conf->deftypefnnewline.o.string, "on"))
             {
                category_tree
                   = html_cdt_tree ("{category} on @code{{class}}:@* ",
@@ -15161,8 +15167,8 @@ convert_def_line_type (CONVERTER *self, const enum 
element_type type,
         {
           if ((base_cmd == CM_deftypefn || base_cmd == CM_deftypeop)
               && parsed_def->type
-              && self->conf->deftypefnnewline.string
-              && !strcmp (self->conf->deftypefnnewline.string, "on"))
+              && self->conf->deftypefnnewline.o.string
+              && !strcmp (self->conf->deftypefnnewline.o.string, "on"))
             {
               category_tree
                   = html_cdt_tree ("{category}:@* ",
@@ -15237,7 +15243,7 @@ convert_def_item_type (CONVERTER *self, const enum 
element_type type,
   if (content[strspn (content, whitespace_chars)] == '\0')
     return;
 
-  if (self->conf->DEF_TABLE.integer <= 0)
+  if (self->conf->DEF_TABLE.o.integer <= 0)
     {
       text_append_n (result, "<dd>", 4);
       text_append (result, content);
@@ -15319,10 +15325,10 @@ convert_unit_type (CONVERTER *self, const enum 
output_unit_type unit_type,
        of footnotes in a separate unit.  And if footnotestyle is end
        the footnotes won't be done in format_element_footer either. */
           format_footnotes_segment (self, result);
-          if (self->conf->DEFAULT_RULE.string
-              && self->conf->PROGRAM_NAME_IN_FOOTER.integer > 0)
+          if (self->conf->DEFAULT_RULE.o.string
+              && self->conf->PROGRAM_NAME_IN_FOOTER.o.integer > 0)
             {
-              text_append (result, self->conf->DEFAULT_RULE.string);
+              text_append (result, self->conf->DEFAULT_RULE.o.string);
               text_append_n (result, "\n", 1);
             }
 
@@ -15437,18 +15443,18 @@ convert_special_unit_type (CONVERTER *self,
         = count_elements_in_file_number (self, CEFT_current, file_index +1);
     }
 
-  if (self->conf->HEADERS.integer > 0
+  if (self->conf->HEADERS.o.integer > 0
       /* first in page */
       || count_in_file == 1)
     {
-      format_navigation_header (self, self->conf->MISC_BUTTONS.buttons, 0,
+      format_navigation_header (self, self->conf->MISC_BUTTONS.o.buttons, 0,
                                 unit_command, result);
     }
 
   heading = html_command_text (self, unit_command, 0);
-  level = self->conf->CHAPTER_HEADER_LEVEL.integer;
+  level = self->conf->CHAPTER_HEADER_LEVEL.o.integer;
   if (!strcmp (special_unit_variety, "footnotes"))
-    level = self->conf->FOOTNOTE_SEPARATE_HEADER_LEVEL.integer;
+    level = self->conf->FOOTNOTE_SEPARATE_HEADER_LEVEL.o.integer;
 
   xasprintf (&class, "%s-heading", class_base);
 
@@ -15479,8 +15485,8 @@ contents_shortcontents_in_title (CONVERTER *self, TEXT 
*result)
 {
   if (self->document->sections_list
       && self->document->sections_list->number > 0
-      && self->conf->CONTENTS_OUTPUT_LOCATION.string
-      && !strcmp (self->conf->CONTENTS_OUTPUT_LOCATION.string, "after_title"))
+      && self->conf->CONTENTS_OUTPUT_LOCATION.o.string
+      && !strcmp (self->conf->CONTENTS_OUTPUT_LOCATION.o.string, 
"after_title"))
     {
       enum command_id contents_cmds[2] = {CM_shortcontents, CM_contents};
       int i;
@@ -15488,8 +15494,9 @@ contents_shortcontents_in_title (CONVERTER *self, TEXT 
*result)
         {
           int contents_set = 0;
           enum command_id cmd = contents_cmds[i];
-          const OPTION *contents_option_ref = get_command_option (self->conf, 
cmd);
-          if (contents_option_ref->integer > 0)
+          const OPTION *contents_option_ref
+                           = get_command_option (self->conf, cmd);
+          if (contents_option_ref->o.integer > 0)
             contents_set = 1;
           if (contents_set)
             {
@@ -15498,9 +15505,9 @@ contents_shortcontents_in_title (CONVERTER *self, TEXT 
*result)
               if (contents_text)
                 {
                   text_append (result, contents_text);
-                  if (self->conf->DEFAULT_RULE.string)
+                  if (self->conf->DEFAULT_RULE.o.string)
                     {
-                      text_append (result, self->conf->DEFAULT_RULE.string);
+                      text_append (result, self->conf->DEFAULT_RULE.o.string);
                       text_append_n (result, "\n", 1);
                     }
                   free (contents_text);
@@ -15554,9 +15561,9 @@ html_default_format_titlepage (CONVERTER *self)
       format_simpletitle (self, &result);
       titlepage_text = 1;
     }
-  if (titlepage_text && self->conf->DEFAULT_RULE.string)
+  if (titlepage_text && self->conf->DEFAULT_RULE.o.string)
     {
-      text_append (&result, self->conf->DEFAULT_RULE.string);
+      text_append (&result, self->conf->DEFAULT_RULE.o.string);
       text_append_n (&result, "\n", 1);
     }
   contents_shortcontents_in_title (self, &result);
@@ -15582,9 +15589,9 @@ format_titlepage (CONVERTER *self)
 char *
 html_default_format_title_titlepage (CONVERTER *self)
 {
-  if (self->conf->SHOW_TITLE.integer > 0)
+  if (self->conf->SHOW_TITLE.o.integer > 0)
     {
-      if (self->conf->USE_TITLEPAGE_FOR_TITLE.integer)
+      if (self->conf->USE_TITLEPAGE_FOR_TITLE.o.integer)
         {
           return format_titlepage (self);
         }
@@ -15671,9 +15678,9 @@ default_format_special_body_about (CONVERTER *self,
 {
   int i;
   const BUTTON_SPECIFICATION_LIST *buttons
-           = self->conf->SECTION_BUTTONS.buttons;
+           = self->conf->SECTION_BUTTONS.o.buttons;
 
-  if (self->conf->PROGRAM_NAME_IN_ABOUT.integer > 0)
+  if (self->conf->PROGRAM_NAME_IN_ABOUT.o.integer > 0)
     {
       text_append_n (result, "<p>\n  ", 6);
       format_program_string (self, result);
@@ -15734,16 +15741,16 @@ default_format_special_body_about (CONVERTER *self,
 
       if (button->type == BST_direction)
         {
-          if (self->conf->ICONS.integer > 0
-              && self->conf->ACTIVE_ICONS.icons->number > 0
-              && self->conf->ACTIVE_ICONS.icons->list[direction]
-              && strlen (self->conf->ACTIVE_ICONS.icons->list[direction]))
+          if (self->conf->ICONS.o.integer > 0
+              && self->conf->ACTIVE_ICONS.o.icons->number > 0
+              && self->conf->ACTIVE_ICONS.o.icons->list[direction]
+              && strlen (self->conf->ACTIVE_ICONS.o.icons->list[direction]))
             {
               const char *button_name_string
                    = direction_string (self, direction,
                                        TDS_type_button, TDS_context_string);
               char *button = format_button_icon_img (self, button_name_string,
-                        self->conf->ACTIVE_ICONS.icons->list[direction], 0);
+                        self->conf->ACTIVE_ICONS.o.icons->list[direction], 0);
               text_append (result, button);
               free (button);
             }
@@ -15849,7 +15856,7 @@ command_conversion_external (CONVERTER *self, const 
enum command_id cmd,
 {
   /* XS specific debug message */
   /*
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     fprintf (stderr, "DEBUG: command conversion %s '%s'\n",
              builtin_command_data[cmd].cmdname, content);
    */
@@ -16047,9 +16054,9 @@ html_prepare_converted_output_info (CONVERTER *self)
     }
 
   /* documentdescription */
-  if (self->conf->documentdescription.string)
+  if (self->conf->documentdescription.o.string)
     self->documentdescription_string
-     = strdup (self->conf->documentdescription.string);
+     = strdup (self->conf->documentdescription.o.string);
   else if (self->document->global_commands.documentdescription)
     {
       ELEMENT *tmp = new_element (ET_NONE);
@@ -16556,7 +16563,7 @@ html_converter_initialize (CONVERTER *self)
          sizeof (HTMLXREF_MANUAL), compare_htmlxref_manual);
 
   /* set to customization such that it is not replaced by C functions */
-  if (self->conf->XS_EXTERNAL_FORMATTING.integer > 0)
+  if (self->conf->XS_EXTERNAL_FORMATTING.o.integer > 0)
     {
       for (i = 0; i < FR_format_translate_message+1; i++)
         if (self->formatting_references[i].status == FRS_status_default_set)
@@ -16577,7 +16584,7 @@ html_converter_initialize (CONVERTER *self)
   /* remaining of the file is for the replacement of call to external
      functions by internal functions in C.
    */
-  if (self->conf->XS_EXTERNAL_CONVERSION.integer > 0)
+  if (self->conf->XS_EXTERNAL_CONVERSION.o.integer > 0)
     goto out;
 
   for (i = 0; types_internal_conversion_table[i].type_conversion; i++)
@@ -16910,12 +16917,12 @@ html_initialize_output_state (CONVERTER *self, const 
char *context)
   const char *output_encoding;
   const char *line_break_element;
 
-  if (!self->document && self->conf->DEBUG.integer > 0)
+  if (!self->document && self->conf->DEBUG.o.integer > 0)
     {
       fprintf (stderr, "REMARK: html_initialize_output_state: no document");
     }
 
-  output_encoding = self->conf->OUTPUT_ENCODING_NAME.string;
+  output_encoding = self->conf->OUTPUT_ENCODING_NAME.o.string;
 
   for (i = 0; i < SC_non_breaking_space+1; i++)
     {
@@ -16925,11 +16932,11 @@ html_initialize_output_state (CONVERTER *self, const 
char *context)
       const char *numeric_entity = special_characters_formatting[i][3];
       const char *special_character_string;
 
-      if (self->conf->OUTPUT_CHARACTERS.integer > 0
+      if (self->conf->OUTPUT_CHARACTERS.o.integer > 0
           && unicode_point_decoded_in_encoding (output_encoding,
                                                 unicode_point))
         special_character_string = encoded_string;
-      else if (self->conf->USE_NUMERIC_ENTITY.integer > 0)
+      else if (self->conf->USE_NUMERIC_ENTITY.o.integer > 0)
         special_character_string = numeric_entity;
       else
         special_character_string = entity;
@@ -16938,7 +16945,7 @@ html_initialize_output_state (CONVERTER *self, const 
char *context)
       self->special_character[i].len = strlen (special_character_string);
     }
 
-  if (self->conf->USE_XML_SYNTAX.integer > 0)
+  if (self->conf->USE_XML_SYNTAX.o.integer > 0)
     {
       /* here in perl something for rules but we already get that from perl */
       line_break_element = "<br/>";
@@ -16954,12 +16961,13 @@ html_initialize_output_state (CONVERTER *self, const 
char *context)
   /* set the htmlxref type split of the document */
   self->document_htmlxref_split_type = htmlxref_split_type_mono;
 
-  if (self->conf->SPLIT.string && strlen (self->conf->SPLIT.string))
+  if (self->conf->SPLIT.o.string && strlen (self->conf->SPLIT.o.string))
     {
       int i;
       for (i = 1; i < htmlxref_split_type_chapter+1; i++)
         {
-          if (!strcmp (self->conf->SPLIT.string, htmlxref_split_type_names[i]))
+          if (!strcmp (self->conf->SPLIT.o.string,
+                       htmlxref_split_type_names[i]))
             {
               self->document_htmlxref_split_type = i;
               break;
@@ -17235,7 +17243,7 @@ html_reset_converter (CONVERTER *self)
         {
           fprintf (stderr, "BUG: tree_to_build: %zu\n",
                            self->tree_to_build.number);
-          if (self->conf->DEBUG.integer > 0)
+          if (self->conf->DEBUG.o.integer > 0)
             {
               for (i = 0; i < self->tree_to_build.number; i++)
                 {
@@ -17587,12 +17595,12 @@ html_translate_names (CONVERTER *self)
   int j;
   const STRING_LIST *special_unit_varieties = &self->special_unit_varieties;
 
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     {
       fprintf (stderr, "\nXS|TRANSLATE_NAMES encoding_name: %s"
                " documentlanguage: %s\n",
-               self->conf->OUTPUT_ENCODING_NAME.string,
-               self->conf->documentlanguage.string);
+               self->conf->OUTPUT_ENCODING_NAME.o.string,
+               self->conf->documentlanguage.o.string);
     }
 
   /* reset strings such that they are translated when needed. */
@@ -17721,7 +17729,7 @@ html_translate_names (CONVERTER *self)
         }
     }
 
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     fprintf (stderr, "END TRANSLATE_NAMES\n\n");
 
   self->modified_state |= HMSF_translations;
@@ -17835,7 +17843,7 @@ html_open_command_update_context (CONVERTER *self, enum 
command_id data_cmd)
   else if (builtin_command_data[data_cmd].flags & CF_math)
     {
       top_document_ctx->math_ctx++;
-      if (self->conf->CONVERT_TO_LATEX_IN_MATH.integer > 0)
+      if (self->conf->CONVERT_TO_LATEX_IN_MATH.o.integer > 0)
         convert_to_latex = 1;
     }
   if (data_cmd == CM_verb)
@@ -18056,7 +18064,7 @@ convert_to_html_internal (CONVERTER *self, const 
ELEMENT *element,
   if (element->type)
     text_append (&command_type, element_type_names[element->type]);
 
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     {
       TEXT debug_str;
       char *contexts_str = debug_print_html_contexts (self);
@@ -18095,7 +18103,7 @@ convert_to_html_internal (CONVERTER *self, const 
ELEMENT *element,
           && self->current_commands_conversion_function[cmd].status
                                                          == 
FRS_status_ignored))
     {
-      if (self->conf->DEBUG.integer > 0)
+      if (self->conf->DEBUG.o.integer > 0)
         {
           fprintf (stderr, "IGNORED %s\n", command_type.text);
         }
@@ -18119,7 +18127,7 @@ convert_to_html_internal (CONVERTER *self, const 
ELEMENT *element,
                     (self, ET_text, element, element->text.text, &text_result);
         }
 
-      if (self->conf->DEBUG.integer > 0)
+      if (self->conf->DEBUG.o.integer > 0)
         {
           fprintf (stderr, "XS|DO TEXT => `%s'\n", text_result.text);
         }
@@ -18137,7 +18145,7 @@ convert_to_html_internal (CONVERTER *self, const 
ELEMENT *element,
       enum command_id data_cmd = element_builtin_data_cmd (element);
       /* XS only debug message */
       /*
-      if (self->conf->DEBUG.integer > 0)
+      if (self->conf->DEBUG.o.integer > 0)
         fprintf (stderr, "COMMAND: %s %s\n",
                  builtin_command_data[data_cmd].cmdname,
                  builtin_command_data[cmd].cmdname);
@@ -18440,7 +18448,8 @@ convert_to_html_internal (CONVERTER *self, const 
ELEMENT *element,
         }
       else
         {
-          if (self->conf->DEBUG.integer > 0 || self->conf->VERBOSE.integer > 0)
+          if (self->conf->DEBUG.o.integer > 0
+              || self->conf->VERBOSE.o.integer > 0)
             fprintf (stderr, "Command not converted: %s\n", command_name);
           if (builtin_command_data[data_cmd].flags & CF_root)
             {
@@ -18513,7 +18522,7 @@ convert_to_html_internal (CONVERTER *self, const 
ELEMENT *element,
         }
       free (content_formatted.text);
 
-      if (self->conf->DEBUG.integer > 0)
+      if (self->conf->DEBUG.o.integer > 0)
         {
           fprintf (stderr, "XS|DO type (%s) => `%s'\n", 
element_type_names[type],
                            type_result.text);
@@ -18544,7 +18553,7 @@ convert_to_html_internal (CONVERTER *self, const 
ELEMENT *element,
           free (explanation);
         }
 
-      if (self->conf->DEBUG.integer > 0)
+      if (self->conf->DEBUG.o.integer > 0)
         fprintf (stderr, "UNNAMED HOLDER => `%s'\n", content_formatted.text);
       ADD(content_formatted.text);
       free (content_formatted.text);
@@ -18552,7 +18561,7 @@ convert_to_html_internal (CONVERTER *self, const 
ELEMENT *element,
     }
   else
     {
-      if (self->conf->DEBUG.integer > 0)
+      if (self->conf->DEBUG.o.integer > 0)
         fprintf (stderr, "UNNAMED empty\n");
       if (self->current_types_conversion_function[0].type_conversion)
         {
@@ -18582,7 +18591,7 @@ convert_output_unit (CONVERTER *self, const OUTPUT_UNIT 
*output_unit,
 
   if (self->output_units_conversion[unit_type].status == FRS_status_ignored)
     {
-      if (self->conf->DEBUG.integer > 0)
+      if (self->conf->DEBUG.o.integer > 0)
         {
           fprintf (stderr, "IGNORED OU %s\n",
                            output_unit_type_names[unit_type]);
@@ -18590,7 +18599,7 @@ convert_output_unit (CONVERTER *self, const OUTPUT_UNIT 
*output_unit,
       return;
     }
 
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     {
       char *output_unit_txi = output_unit_texi (output_unit);
       fprintf (stderr, "XS|UNIT(%s) -> ou: %s '%s'\n", explanation,
@@ -18635,7 +18644,7 @@ convert_output_unit (CONVERTER *self, const OUTPUT_UNIT 
*output_unit,
 
   self->current_output_unit = 0;
 
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     fprintf (stderr, "DOUNIT (%s) => `%s'\n", 
output_unit_type_names[unit_type],
                      result->text + input_result_end);
 }
@@ -18648,7 +18657,7 @@ convert_convert_output_unit_internal (CONVERTER *self, 
TEXT *result,
 {
   char *explanation;
 
-  if (self->conf->DEBUG.integer > 0)
+  if (self->conf->DEBUG.o.integer > 0)
     fprintf (stderr, "\n%s %d\n", debug_str, unit_nr);
 
   xasprintf (&explanation, "%s %d", explanation_str, unit_nr);
@@ -18900,7 +18909,7 @@ html_convert_output (CONVERTER *self, const ELEMENT 
*root,
   text_init (&text);
 
   /* set self->date_in_header to format it only once */
-  if (self->conf->DATE_IN_HEADER.integer > 0)
+  if (self->conf->DATE_IN_HEADER.o.integer > 0)
     {
       ELEMENT *today_element = new_element (ET_NONE);
       char *today;
@@ -18978,15 +18987,16 @@ html_convert_output (CONVERTER *self, const ELEMENT 
*root,
       int i;
       const ENCODING_CONVERSION *conversion = 0;
 
-      if (self->conf->OUTPUT_ENCODING_NAME.string
-          && strcmp (self->conf->OUTPUT_ENCODING_NAME.string, "utf-8"))
+      if (self->conf->OUTPUT_ENCODING_NAME.o.string
+          && strcmp (self->conf->OUTPUT_ENCODING_NAME.o.string, "utf-8"))
         {
           conversion
-             = get_encoding_conversion 
(self->conf->OUTPUT_ENCODING_NAME.string,
+             = get_encoding_conversion (
+                              self->conf->OUTPUT_ENCODING_NAME.o.string,
                                               &output_conversions);
         }
 
-      if (self->conf->DEBUG.integer > 0)
+      if (self->conf->DEBUG.o.integer > 0)
         fprintf (stderr, "DO Units with filenames\n");
 
       for (i = 0; i < output_units->number; i++)
@@ -19038,18 +19048,19 @@ html_node_redirections (CONVERTER *self,
   FILE_SOURCE_INFO_LIST *files_source_info = &self->files_source_info;
   int redirection_files_done = 0;
   if (self->document->identifiers_target.number > 0
-      && self->conf->NODE_FILES.integer > 0
+      && self->conf->NODE_FILES.o.integer > 0
       && strlen (output_file) > 0)
     {
       const LABEL_LIST *label_targets = &self->document->labels_list;
       int i;
       const ENCODING_CONVERSION *conversion = 0;
 
-      if (self->conf->OUTPUT_ENCODING_NAME.string
-          && strcmp (self->conf->OUTPUT_ENCODING_NAME.string, "utf-8"))
+      if (self->conf->OUTPUT_ENCODING_NAME.o.string
+          && strcmp (self->conf->OUTPUT_ENCODING_NAME.o.string, "utf-8"))
         {
           conversion
-          = get_encoding_conversion (self->conf->OUTPUT_ENCODING_NAME.string,
+             = get_encoding_conversion (
+                     self->conf->OUTPUT_ENCODING_NAME.o.string,
                                               &output_conversions);
         }
 
@@ -19078,9 +19089,9 @@ html_node_redirections (CONVERTER *self,
         either. */
           normalized = lookup_extra_string (target_element, "normalized");
           if (normalized && !strcmp (normalized, "Top")
-              && self->conf->TOP_NODE_FILE_TARGET.string)
+              && self->conf->TOP_NODE_FILE_TARGET.o.string)
             {
-              node_filename = self->conf->TOP_NODE_FILE_TARGET.string;
+              node_filename = self->conf->TOP_NODE_FILE_TARGET.o.string;
             }
           else
             {
diff --git a/tp/Texinfo/XS/convert/converter.c 
b/tp/Texinfo/XS/convert/converter.c
index eeb1da11ee..5281c3119b 100644
--- a/tp/Texinfo/XS/convert/converter.c
+++ b/tp/Texinfo/XS/convert/converter.c
@@ -129,16 +129,16 @@ copy_option (OPTION *destination, OPTION *source)
   switch (source->type)
    {
      case GOT_integer:
-       destination->integer = source->integer;
+       destination->o.integer = source->o.integer;
        break;
 
      case GOT_char:
      case GOT_bytes:
-       free (destination->string);
-       if (!source->string)
-         destination->string = 0;
+       free (destination->o.string);
+       if (!source->o.string)
+         destination->o.string = 0;
        else
-         destination->string = strdup (source->string);
+         destination->o.string = strdup (source->o.string);
        break;
 
      default:
@@ -155,9 +155,9 @@ new_option_value (enum global_option_type type, int 
int_value, char *char_value)
   memset (result, 0, sizeof (OPTION));
   result->type = type;
   if (type == GOT_integer)
-    result->integer = int_value;
+    result->o.integer = int_value;
   else
-    result->string = char_value;
+    result->o.string = char_value;
   return result;
 }
 
@@ -223,7 +223,7 @@ set_global_document_commands (CONVERTER *converter,
         {
           const ELEMENT *element;
           enum command_id cmd = cmd_list[i];
-          if (converter->conf->DEBUG.integer > 0)
+          if (converter->conf->DEBUG.o.integer > 0)
             {
               fprintf (stderr, "XS|SET_global(%s) %s\n",
                        command_location_names[location],
@@ -253,12 +253,12 @@ set_global_document_commands (CONVERTER *converter,
 static void
 id_to_filename (CONVERTER *self, char **id_ref)
 {
-  if (self->conf->BASEFILENAME_LENGTH.integer < 0)
+  if (self->conf->BASEFILENAME_LENGTH.o.integer < 0)
     return;
   char *id = *id_ref;
-  if (strlen (id) > self->conf->BASEFILENAME_LENGTH.integer)
+  if (strlen (id) > self->conf->BASEFILENAME_LENGTH.o.integer)
     {
-      id[self->conf->BASEFILENAME_LENGTH.integer] = '\0';
+      id[self->conf->BASEFILENAME_LENGTH.o.integer] = '\0';
     }
 }
 
@@ -271,16 +271,16 @@ normalized_sectioning_command_filename (CONVERTER *self, 
const ELEMENT *command)
   char *normalized_file_name;
   char *normalized_name
     = normalize_transliterate_texinfo_contents (command->args.list[0],
-                                                (self->conf->TEST.integer > 
0));
+                                          (self->conf->TEST.o.integer > 0));
   normalized_file_name = strdup (normalized_name);
   id_to_filename (self, &normalized_file_name);
 
   text_init (&filename);
   text_append (&filename, normalized_file_name);
-  if (self->conf->EXTENSION.string && strlen (self->conf->EXTENSION.string))
+  if (self->conf->EXTENSION.o.string && strlen 
(self->conf->EXTENSION.o.string))
     {
       text_append (&filename, ".");
-      text_append (&filename, self->conf->EXTENSION.string);
+      text_append (&filename, self->conf->EXTENSION.o.string);
     }
 
   free (normalized_file_name);
@@ -299,10 +299,10 @@ node_information_filename (CONVERTER *self, const char 
*normalized,
 
   if (normalized)
     {
-      if (self->conf->TRANSLITERATE_FILE_NAMES.integer > 0)
+      if (self->conf->TRANSLITERATE_FILE_NAMES.o.integer > 0)
         {
           filename = normalize_transliterate_texinfo_contents (label_element,
-                                                       
(self->conf->TEST.integer > 0));
+                                            (self->conf->TEST.o.integer > 0));
         }
       else
         filename = strdup (normalized);
@@ -578,7 +578,7 @@ convert_accents (CONVERTER *self, const ELEMENT *accent,
   if (output_encoded_characters)
     {
       char *encoded = encoded_accents (self, arg_text, &accent_stack->stack,
-                                 self->conf->OUTPUT_ENCODING_NAME.string,
+                                 self->conf->OUTPUT_ENCODING_NAME.o.string,
                                  format_accent, set_case);
       if (encoded)
         {
@@ -657,18 +657,18 @@ get_converter_indices_sorted_by_index (CONVERTER *self, 
char **language)
     {
       char *collation_language = 0;
       COLLATION_INDICES_SORTED_BY_INDEX *collation_sorted_indices;
-      if (self->conf->COLLATION_LANGUAGE.string)
-        collation_language = self->conf->COLLATION_LANGUAGE.string;
-      else if (self->conf->DOCUMENTLANGUAGE_COLLATION.integer > 0
-               && self->conf->documentlanguage.string)
-        collation_language = self->conf->documentlanguage.string;
+      if (self->conf->COLLATION_LANGUAGE.o.string)
+        collation_language = self->conf->COLLATION_LANGUAGE.o.string;
+      else if (self->conf->DOCUMENTLANGUAGE_COLLATION.o.integer > 0
+               && self->conf->documentlanguage.o.string)
+        collation_language = self->conf->documentlanguage.o.string;
 
       collation_sorted_indices
         = sorted_indices_by_index (self->document,
                                    &self->error_messages, self->conf,
-                                   self->conf->USE_UNICODE_COLLATION.integer,
+                                   self->conf->USE_UNICODE_COLLATION.o.integer,
                                    collation_language,
-                               self->conf->XS_STRXFRM_COLLATION_LOCALE.string);
+                           self->conf->XS_STRXFRM_COLLATION_LOCALE.o.string);
       if (collation_sorted_indices->type != ctn_locale_collation)
         *language = collation_sorted_indices->language;
       return collation_sorted_indices->sorted_indices;
@@ -684,18 +684,18 @@ get_converter_indices_sorted_by_letter (CONVERTER *self, 
char **language)
     {
       char *collation_language = 0;
       COLLATION_INDICES_SORTED_BY_LETTER *collation_sorted_indices;
-      if (self->conf->COLLATION_LANGUAGE.string)
-        collation_language = self->conf->COLLATION_LANGUAGE.string;
-      else if (self->conf->DOCUMENTLANGUAGE_COLLATION.integer > 0
-               && self->conf->documentlanguage.string)
-        collation_language = self->conf->documentlanguage.string;
+      if (self->conf->COLLATION_LANGUAGE.o.string)
+        collation_language = self->conf->COLLATION_LANGUAGE.o.string;
+      else if (self->conf->DOCUMENTLANGUAGE_COLLATION.o.integer > 0
+               && self->conf->documentlanguage.o.string)
+        collation_language = self->conf->documentlanguage.o.string;
 
       collation_sorted_indices
         = sorted_indices_by_letter (self->document,
                                     &self->error_messages, self->conf,
-                                    self->conf->USE_UNICODE_COLLATION.integer,
+                                    
self->conf->USE_UNICODE_COLLATION.o.integer,
                                     collation_language,
-                               self->conf->XS_STRXFRM_COLLATION_LOCALE.string);
+                            self->conf->XS_STRXFRM_COLLATION_LOCALE.o.string);
       if (collation_sorted_indices->type != ctn_locale_collation)
         *language = collation_sorted_indices->language;
       return collation_sorted_indices->sorted_indices;
@@ -709,19 +709,20 @@ top_node_filename (const CONVERTER *self, const char 
*document_name)
 {
   TEXT top_node_filename;
 
-  if (self->conf->TOP_FILE.string && strlen (self->conf->TOP_FILE.string))
+  if (self->conf->TOP_FILE.o.string && strlen (self->conf->TOP_FILE.o.string))
     {
-      return strdup (self->conf->TOP_FILE.string);
+      return strdup (self->conf->TOP_FILE.o.string);
     }
 
   if (document_name)
     {
       text_init (&top_node_filename);
       text_append (&top_node_filename, document_name);
-      if (self->conf->EXTENSION.string && strlen 
(self->conf->EXTENSION.string))
+      if (self->conf->EXTENSION.o.string
+          && strlen (self->conf->EXTENSION.o.string))
         {
           text_append (&top_node_filename, ".");
-          text_append (&top_node_filename, self->conf->EXTENSION.string);
+          text_append (&top_node_filename, self->conf->EXTENSION.o.string);
         }
       return top_node_filename.text;
     }
@@ -793,14 +794,14 @@ size_t
 register_normalize_case_filename (CONVERTER *self, const char *filename)
 {
   size_t output_unit_file_idx;
-  if (self->conf->CASE_INSENSITIVE_FILENAMES.integer > 0)
+  if (self->conf->CASE_INSENSITIVE_FILENAMES.o.integer > 0)
     {
       char *lc_filename = to_upper_or_lower_multibyte (filename, -1);
       int status;
       output_unit_file_idx = find_output_unit_file (self, lc_filename, 
&status);
       if (status)
         {
-          if (self->conf->DEBUG.integer > 0)
+          if (self->conf->DEBUG.o.integer > 0)
             {
               FILE_NAME_PATH_COUNTER *output_unit_file
                 = &self->output_unit_files.list[output_unit_file_idx];
@@ -827,7 +828,7 @@ register_normalize_case_filename (CONVERTER *self, const 
char *filename)
       output_unit_file_idx = find_output_unit_file (self, filename, &status);
       if (status)
         {
-          if (self->conf->DEBUG.integer > 0)
+          if (self->conf->DEBUG.o.integer > 0)
             {
               FILE_NAME_PATH_COUNTER *output_unit_file
                 = &self->output_unit_files.list[output_unit_file_idx];
@@ -885,14 +886,14 @@ set_file_path (CONVERTER *self, const char *filename, 
const char *filepath,
     {
       if (!strcmp (output_unit_file->filepath, filepath_str))
         {
-          if (self->conf->DEBUG.integer > 0)
+          if (self->conf->DEBUG.o.integer > 0)
             fprintf (stderr, "set_file_path: filepath set: %s\n",
                              filepath_str);
           free (filepath_str);
         }
       else
         {
-          if (self->conf->DEBUG.integer > 0)
+          if (self->conf->DEBUG.o.integer > 0)
             fprintf (stderr, "set_file_path: filepath reset: %s, %s\n",
                              output_unit_file->filepath, filepath_str);
           free (output_unit_file->filepath);
diff --git a/tp/Texinfo/XS/main/convert_to_text.c 
b/tp/Texinfo/XS/main/convert_to_text.c
index c6340674de..26a5f5ea8d 100644
--- a/tp/Texinfo/XS/main/convert_to_text.c
+++ b/tp/Texinfo/XS/main/convert_to_text.c
@@ -92,14 +92,14 @@ copy_options_for_convert_text (OPTIONS *options)
   TEXT_OPTIONS *text_options = new_text_options ();
   int text_indicator_option;
 
-  if (options->ENABLE_ENCODING.integer > 0
-       && options->OUTPUT_ENCODING_NAME.string)
+  if (options->ENABLE_ENCODING.o.integer > 0
+       && options->OUTPUT_ENCODING_NAME.o.string)
     {
-      text_options->encoding = strdup (options->OUTPUT_ENCODING_NAME.string);
+      text_options->encoding = strdup (options->OUTPUT_ENCODING_NAME.o.string);
     }
 
   #define tico_option_name(name) \
-  text_indicator_option = options->name.integer; \
+  text_indicator_option = options->name.o.integer; \
   if (text_indicator_option > 0) { text_options->name = 1; } \
   else if (text_indicator_option >= 0) { text_options->name = 0; }
    TEXT_INDICATOR_CONVERTER_OPTIONS
@@ -108,7 +108,7 @@ copy_options_for_convert_text (OPTIONS *options)
   set_expanded_formats_from_options (text_options->expanded_formats, options);
 
   copy_strings (&text_options->include_directories,
-                options->INCLUDE_DIRECTORIES.strlist);
+                options->INCLUDE_DIRECTORIES.o.strlist);
 
   /* not a copy , but a reference to the options */
   text_options->other_converter_options = options;
@@ -129,9 +129,9 @@ static void
 set_additional_index_entry_keys_options (OPTIONS *options,
                                          TEXT_OPTIONS *text_options)
 {
-  if (options->ENABLE_ENCODING.integer <= 0
-      || !(options->OUTPUT_ENCODING_NAME.string
-           && !strcasecmp (options->OUTPUT_ENCODING_NAME.string, "utf-8")))
+  if (options->ENABLE_ENCODING.o.integer <= 0
+      || !(options->OUTPUT_ENCODING_NAME.o.string
+           && !strcasecmp (options->OUTPUT_ENCODING_NAME.o.string, "utf-8")))
     {
       text_options->sort_string = 1;
     }
@@ -164,20 +164,20 @@ void
 text_set_options_encoding_if_not_ascii (CONVERTER *self,
                                         TEXT_OPTIONS *text_options)
 {
-  if (self->conf->OUTPUT_ENCODING_NAME.string
-      && strcmp (self->conf->OUTPUT_ENCODING_NAME.string, "us-ascii"))
+  if (self->conf->OUTPUT_ENCODING_NAME.o.string
+      && strcmp (self->conf->OUTPUT_ENCODING_NAME.o.string, "us-ascii"))
     {
       if (text_options->_saved_enabled_encoding)
         {
           fprintf (stderr,
             "BUG: if_not_ascii _saved_enabled_encoding set: %s / %s\n",
                text_options->_saved_enabled_encoding,
-               self->conf->OUTPUT_ENCODING_NAME.string);
+               self->conf->OUTPUT_ENCODING_NAME.o.string);
           text_options->_saved_enabled_encoding = 0;
         }
 
       text_options->_saved_enabled_encoding = text_options->encoding;
-      text_options->encoding = self->conf->OUTPUT_ENCODING_NAME.string;
+      text_options->encoding = self->conf->OUTPUT_ENCODING_NAME.o.string;
     }
 }
 
diff --git a/tp/Texinfo/XS/main/convert_utils.c 
b/tp/Texinfo/XS/main/convert_utils.c
index 67abcd0e07..90e1b068db 100644
--- a/tp/Texinfo/XS/main/convert_utils.c
+++ b/tp/Texinfo/XS/main/convert_utils.c
@@ -66,7 +66,7 @@ expand_today (OPTIONS *options)
   ELEMENT *year_element;
   ELEMENT *result;
 
-  if (options->TEST.integer > 0)
+  if (options->TEST.o.integer > 0)
     {
       result = new_element (ET_NONE);
       text_append (&result->text, "a sunny day");
@@ -92,8 +92,8 @@ expand_today (OPTIONS *options)
   year = time_tm->tm_year + 1900;
 
   month_tree = gdt_tree (convert_utils_month_name[time_tm->tm_mon], 0,
-                         options->documentlanguage.string, 0,
-                         options->DEBUG.integer, 0);
+                         options->documentlanguage.o.string, 0,
+                         options->DEBUG.o.integer, 0);
   day_element = new_element (ET_NONE);
   year_element = new_element (ET_NONE);
   text_printf (&day_element->text, "%d", time_tm->tm_mday);
@@ -105,8 +105,8 @@ expand_today (OPTIONS *options)
   add_element_to_named_string_element_list (substrings, "year", year_element);
 
   result = gdt_tree ("{month} {day}, {year}", 0,
-                     options->documentlanguage.string, substrings,
-                     options->DEBUG.integer, 0);
+                     options->documentlanguage.o.string, substrings,
+                     options->DEBUG.o.integer, 0);
   destroy_named_string_element_list (substrings);
 
   return result;
@@ -216,14 +216,14 @@ add_heading_number (OPTIONS *options, const ELEMENT 
*current, char *text,
                 {
                   numbered_heading
                    = gdt_string ("Appendix {number} {section_title}",
-                                 options->documentlanguage.string,
+                                 options->documentlanguage.o.string,
                                  substrings, 0);
                 }
             }
           if (!numbered_heading)
             numbered_heading
               = gdt_string ("{number} {section_title}",
-                            options->documentlanguage.string, substrings, 0);
+                            options->documentlanguage.o.string, substrings, 0);
 
           destroy_named_string_element_list (substrings);
 
@@ -280,9 +280,9 @@ encoded_input_file_name (const OPTIONS *options,
   const char *encoding = 0;
   int status;
 
-  if (options && options->INPUT_FILE_NAME_ENCODING.string)
-    encoding = options->INPUT_FILE_NAME_ENCODING.string;
-  else if (options && options->DOC_ENCODING_FOR_INPUT_FILE_NAME.integer != 0
+  if (options && options->INPUT_FILE_NAME_ENCODING.o.string)
+    encoding = options->INPUT_FILE_NAME_ENCODING.o.string;
+  else if (options && options->DOC_ENCODING_FOR_INPUT_FILE_NAME.o.integer != 0
            || (!options))
     {
       if (input_file_encoding)
@@ -291,7 +291,7 @@ encoded_input_file_name (const OPTIONS *options,
         encoding = global_information->input_encoding_name;
     }
   else if (options)
-    encoding = options->LOCALE_ENCODING.string;
+    encoding = options->LOCALE_ENCODING.o.string;
 
   result = encode_string (file_name, encoding, &status, source_info);
 
@@ -314,16 +314,16 @@ encoded_output_file_name (const OPTIONS *options,
   const char *encoding = 0;
   int status;
 
-  if (options && options->OUTPUT_FILE_NAME_ENCODING.string)
-    encoding = options->OUTPUT_FILE_NAME_ENCODING.string;
-  else if (options && options->DOC_ENCODING_FOR_OUTPUT_FILE_NAME.integer != 0
+  if (options && options->OUTPUT_FILE_NAME_ENCODING.o.string)
+    encoding = options->OUTPUT_FILE_NAME_ENCODING.o.string;
+  else if (options && options->DOC_ENCODING_FOR_OUTPUT_FILE_NAME.o.integer != 0
            || (!options))
     {
       if (global_information && global_information->input_encoding_name)
         encoding = global_information->input_encoding_name;
     }
   else if (options)
-    encoding = options->LOCALE_ENCODING.string;
+    encoding = options->LOCALE_ENCODING.o.string;
 
   result = encode_string (file_name, encoding, &status, source_info);
 
@@ -357,7 +357,7 @@ expand_verbatiminclude (ERROR_MESSAGE_LIST *error_messages,
                                        &current->source_info);
 
   if (options)
-    include_directories = options->INCLUDE_DIRECTORIES.strlist;
+    include_directories = options->INCLUDE_DIRECTORIES.o.strlist;
 
   file = locate_include_file (file_name, include_directories);
 
@@ -574,8 +574,8 @@ definition_category_tree (OPTIONS * options, const ELEMENT 
*current)
            */
 
           result = gdt_tree ("{category} on @code{{class}}", 0,
-                             options->documentlanguage.string, substrings,
-                             options->DEBUG.integer, 0);
+                             options->documentlanguage.o.string, substrings,
+                             options->DEBUG.o.integer, 0);
         }
       else
         {
@@ -613,8 +613,8 @@ definition_category_tree (OPTIONS * options, const ELEMENT 
*current)
            */
 
           result = gdt_tree ("{category} of @code{{class}}", 0,
-                             options->documentlanguage.string, substrings,
-                             options->DEBUG.integer, 0);
+                             options->documentlanguage.o.string, substrings,
+                             options->DEBUG.o.integer, 0);
         }
       else
         {
@@ -641,8 +641,8 @@ cdt_tree (const char * string, CONVERTER *self,
           NAMED_STRING_ELEMENT_LIST *replaced_substrings,
           const char *translation_context)
 {
-  const char *lang = self->conf->documentlanguage.string;
-  int debug_level = self->conf->DEBUG.integer;
+  const char *lang = self->conf->documentlanguage.o.string;
+  int debug_level = self->conf->DEBUG.o.integer;
 
   return gdt_tree (string, self->document, lang, replaced_substrings,
                    debug_level, translation_context);
diff --git a/tp/Texinfo/XS/main/errors.c b/tp/Texinfo/XS/main/errors.c
index 16ab777cc1..874ad50439 100644
--- a/tp/Texinfo/XS/main/errors.c
+++ b/tp/Texinfo/XS/main/errors.c
@@ -171,7 +171,7 @@ message_list_document_formatted_message (ERROR_MESSAGE_LIST 
*error_messages,
   text_init (&error_line);
   text_append (&error_line, "");
 
-  if (conf && conf->PROGRAM.string && strlen (conf->PROGRAM.string))
+  if (conf && conf->PROGRAM.o.string && strlen (conf->PROGRAM.o.string))
     {
       if (type == MSG_document_warning)
         {
@@ -179,16 +179,16 @@ message_list_document_formatted_message 
(ERROR_MESSAGE_LIST *error_messages,
           text_printf (&error_line,
                        pgettext ("whole document warning",
                                  "%s: warning: %s"),
-                       conf->PROGRAM.string, error_message->message);
+                       conf->PROGRAM.o.string, error_message->message);
 #else
           text_printf (&error_line, "%s: warning: %s",
-                       conf->PROGRAM.string, error_message->message);
+                       conf->PROGRAM.o.string, error_message->message);
 #endif
         }
       else
         {
           text_printf (&error_line, "%s: %s",
-                       conf->PROGRAM.string, error_message->message);
+                       conf->PROGRAM.o.string, error_message->message);
         }
     }
   else
@@ -251,7 +251,7 @@ message_list_line_error_ext (ERROR_MESSAGE_LIST 
*error_messages,
 
   va_start (v, format);
   vmessage_list_line_error (error_messages, type, continuation,
-                            (conf && conf->DEBUG.integer > 0),
+                            (conf && conf->DEBUG.o.integer > 0),
                             cmd_source_info, 0, format, v);
 }
 
@@ -265,7 +265,7 @@ message_list_command_warn (ERROR_MESSAGE_LIST 
*error_messages,
 
   va_start (v, format);
   vmessage_list_line_error (error_messages, MSG_warning, continuation,
-                            (conf && conf->DEBUG.integer > 0),
+                            (conf && conf->DEBUG.o.integer > 0),
                              &e->source_info, 0, format, v);
 }
 
@@ -281,7 +281,7 @@ pmessage_list_command_warn (ERROR_MESSAGE_LIST 
*error_messages,
 
   va_start (v, format);
   vmessage_list_line_error (error_messages, MSG_warning, continuation,
-                            (conf && conf->DEBUG.integer > 0),
+                            (conf && conf->DEBUG.o.integer > 0),
                              &e->source_info, translation_context, format, v);
 }
 
@@ -293,7 +293,7 @@ vmessage_list_command_warn (ERROR_MESSAGE_LIST 
*error_messages,
                             const ELEMENT *e, const char *format, va_list v)
 {
   vmessage_list_line_error (error_messages, MSG_warning, 0,
-                            (conf && conf->DEBUG.integer > 0),
+                            (conf && conf->DEBUG.o.integer > 0),
                             &e->source_info, 0, format, v);
 }
 
@@ -306,7 +306,7 @@ message_list_command_error (ERROR_MESSAGE_LIST 
*error_messages,
 
   va_start (v, format);
   vmessage_list_line_error (error_messages, MSG_error, 0,
-                           (conf && conf->DEBUG.integer > 0),
+                           (conf && conf->DEBUG.o.integer > 0),
                            &e->source_info, 0, format, v);
 }
 
diff --git a/tp/Texinfo/XS/main/get_perl_info.c 
b/tp/Texinfo/XS/main/get_perl_info.c
index 14b5d85eff..028fb629df 100644
--- a/tp/Texinfo/XS/main/get_perl_info.c
+++ b/tp/Texinfo/XS/main/get_perl_info.c
@@ -348,7 +348,7 @@ void
 get_line_message (CONVERTER *self, enum error_type type, int continuation,
                   SV *error_location_info, const char *message)
 {
-  int do_warn = (self->conf->DEBUG.integer > 0);
+  int do_warn = (self->conf->DEBUG.o.integer > 0);
   SOURCE_INFO *source_info = get_source_info (error_location_info);
   if (source_info->file_name)
     {
diff --git a/tp/Texinfo/XS/main/option_types.h 
b/tp/Texinfo/XS/main/option_types.h
index ec4ca19bfe..d4c68408a1 100644
--- a/tp/Texinfo/XS/main/option_types.h
+++ b/tp/Texinfo/XS/main/option_types.h
@@ -155,7 +155,7 @@ typedef struct OPTION {
       STRING_LIST *strlist;
       BUTTON_SPECIFICATION_LIST *buttons;
       DIRECTION_ICON_LIST *icons;
-    };
+    } o;
 } OPTION;
 
 #endif
diff --git a/tp/Texinfo/XS/main/utils.c b/tp/Texinfo/XS/main/utils.c
index 4fd41c666f..358f892375 100644
--- a/tp/Texinfo/XS/main/utils.c
+++ b/tp/Texinfo/XS/main/utils.c
@@ -610,14 +610,14 @@ void
 set_expanded_formats_from_options (EXPANDED_FORMAT *formats,
                                    const OPTIONS *options)
 {
-  if (options->EXPANDED_FORMATS.strlist
-      && (options->EXPANDED_FORMATS.strlist->number))
+  if (options->EXPANDED_FORMATS.o.strlist
+      && (options->EXPANDED_FORMATS.o.strlist->number))
     {
       size_t i;
-      for (i = 0; i < options->EXPANDED_FORMATS.strlist->number; i++)
+      for (i = 0; i < options->EXPANDED_FORMATS.o.strlist->number; i++)
         {
           add_expanded_format (formats,
-                               options->EXPANDED_FORMATS.strlist->list[i]);
+                               options->EXPANDED_FORMATS.o.strlist->list[i]);
         }
     }
 }
@@ -1034,8 +1034,8 @@ set_conf_string (OPTION *option, const char *value)
   if (option->configured > 0)
     return;
 
-  free (option->string);
-  option->string = strdup (value);
+  free (option->o.string);
+  option->o.string = strdup (value);
 }
 
 /* In perl, OUTPUT_PERL_ENCODING is set too.  Note that if the perl
@@ -1227,7 +1227,7 @@ set_informative_command_value (OPTIONS *options, const 
ELEMENT *element)
           if (option->type == GOT_integer)
             {
               if (option->configured <= 0)
-                option->integer = strtoul (value, NULL, 10);
+                option->o.integer = strtoul (value, NULL, 10);
             }
           else
             set_conf_string (option, value);
@@ -1587,27 +1587,27 @@ clear_option (OPTION *option)
     {
       case GOT_char:
       case GOT_bytes:
-        free (option->string);
-        option->string = 0;
+        free (option->o.string);
+        option->o.string = 0;
         break;
 
       case GOT_bytes_string_list:
       case GOT_file_string_list:
       case GOT_char_string_list:
-        clear_strings_list (option->strlist);
+        clear_strings_list (option->o.strlist);
         break;
 
       case GOT_buttons:
-        html_free_button_specification_list (option->buttons);
-        option->buttons = 0;
+        html_free_button_specification_list (option->o.buttons);
+        option->o.buttons = 0;
         break;
 
       case GOT_icons:
-        html_clear_direction_icons (option->icons);
+        html_clear_direction_icons (option->o.icons);
         break;
 
       case GOT_integer:
-        option->integer = -1;
+        option->o.integer = -1;
 
       default:
        break;
@@ -1622,22 +1622,22 @@ free_option (OPTION *option)
     {
       case GOT_char:
       case GOT_bytes:
-        free (option->string);
+        free (option->o.string);
         break;
 
       case GOT_bytes_string_list:
       case GOT_file_string_list:
       case GOT_char_string_list:
-        destroy_strings_list (option->strlist);
+        destroy_strings_list (option->o.strlist);
         break;
 
       case GOT_buttons:
-        html_free_button_specification_list (option->buttons);
+        html_free_button_specification_list (option->o.buttons);
         break;
 
       case GOT_icons:
-        html_free_direction_icons (option->icons);
-        free (option->icons);
+        html_free_direction_icons (option->o.icons);
+        free (option->o.icons);
         break;
 
       case GOT_integer:
@@ -1653,28 +1653,28 @@ initialize_option (OPTION *option, enum 
global_option_type type)
   switch (type)
     {
       case GOT_integer:
-        option->integer = -1;
+        option->o.integer = -1;
         break;
 
       case GOT_bytes_string_list:
       case GOT_file_string_list:
       case GOT_char_string_list:
-        option->strlist = new_string_list ();
+        option->o.strlist = new_string_list ();
         break;
 
       case GOT_char:
       case GOT_bytes:
-        option->string = 0;
+        option->o.string = 0;
         break;
 
       case GOT_buttons:
-        option->buttons = 0;
+        option->o.buttons = 0;
         break;
 
       case GOT_icons:
-        option->icons = (DIRECTION_ICON_LIST *)
+        option->o.icons = (DIRECTION_ICON_LIST *)
                           malloc (sizeof (DIRECTION_ICON_LIST));
-        memset (option->icons, 0, sizeof (DIRECTION_ICON_LIST));
+        memset (option->o.icons, 0, sizeof (DIRECTION_ICON_LIST));
         break;
 
       default:
diff --git a/tp/Texinfo/XS/structuring_transfo/structuring.c 
b/tp/Texinfo/XS/structuring_transfo/structuring.c
index bd310cede2..fdaebf334d 100644
--- a/tp/Texinfo/XS/structuring_transfo/structuring.c
+++ b/tp/Texinfo/XS/structuring_transfo/structuring.c
@@ -814,9 +814,9 @@ set_menus_node_directions (DOCUMENT *document)
   if (!nodes_list || nodes_list->number <= 0)
     return;
 
-  if (options && (options->novalidate.integer > 0
-                  || !options->FORMAT_MENU.string
-                  || strcmp (options->FORMAT_MENU.string, "menu")))
+  if (options && (options->novalidate.o.integer > 0
+                  || !options->FORMAT_MENU.o.string
+                  || strcmp (options->FORMAT_MENU.o.string, "menu")))
     check_menu_entries = 0;
 
   /*
@@ -1046,7 +1046,7 @@ complete_node_tree_with_menus (DOCUMENT *document)
                   section = lookup_extra_element (node, "associated_section");
                   if (section
                       && ((!options)
-                          || options->CHECK_NORMAL_MENU_STRUCTURE.integer > 0))
+                          || options->CHECK_NORMAL_MENU_STRUCTURE.o.integer > 
0))
                     {
                       const ELEMENT *node_direction_section = section;
                       const ELEMENT *part_section;
@@ -1116,7 +1116,7 @@ complete_node_tree_with_menus (DOCUMENT *document)
                       if (!menu_direction_manual_content)
                         {
                           if (((!options)
-                           || options->CHECK_NORMAL_MENU_STRUCTURE.integer > 0)
+                           || options->CHECK_NORMAL_MENU_STRUCTURE.o.integer > 
0)
                               && section)
                             {
                               char *node_texi
@@ -1198,7 +1198,7 @@ complete_node_tree_with_menus (DOCUMENT *document)
         }
   /* check consistency between node pointer and node entries menu order */
       if (((!options)
-           || options->CHECK_NORMAL_MENU_STRUCTURE.integer > 0)
+           || options->CHECK_NORMAL_MENU_STRUCTURE.o.integer > 0)
           && strcmp (normalized, "Top"))
         {
           const ELEMENT_LIST *node_directions = lookup_extra_directions (node,
@@ -1243,7 +1243,7 @@ complete_node_tree_with_menus (DOCUMENT *document)
         }
       /* check for node up / menu up mismatch */
       if ((!options)
-          || options->CHECK_MISSING_MENU_ENTRY.integer > 0)
+          || options->CHECK_MISSING_MENU_ENTRY.o.integer > 0)
         {
           const ELEMENT_LIST *node_directions = lookup_extra_directions (node,
                                                            "node_directions");
@@ -1451,7 +1451,7 @@ nodes_tree (DOCUMENT *document)
                             = add_extra_directions (node, "node_directions");
                           node_directions->list[direction] = node_target;
                           if ((!options)
-                               || options->novalidate.integer <= 0)
+                               || options->novalidate.o.integer <= 0)
                             {
                               ELEMENT *direction_node_content
                                 = lookup_extra_element (direction_element,
@@ -1481,7 +1481,7 @@ nodes_tree (DOCUMENT *document)
                       else
                         {
                           if ((!options)
-                               || options->novalidate.integer <= 0)
+                               || options->novalidate.o.integer <= 0)
                             {
                               char *direction_texi
                                  = link_element_to_texi (direction_element);
@@ -1562,7 +1562,7 @@ associate_internal_references (DOCUMENT *document)
           if (!node_target)
             {
               if ((!options)
-                  || options->novalidate.integer <= 0)
+                  || options->novalidate.o.integer <= 0)
                 {
                   char *label_texi = link_element_to_texi (label_element);
                   message_list_command_error (error_messages, options,
@@ -1576,7 +1576,7 @@ associate_internal_references (DOCUMENT *document)
               label_node_content = lookup_extra_element (label_element,
                                                          "node_content");
               if ((!options)
-                  || options->novalidate.integer <= 0)
+                  || options->novalidate.o.integer <= 0)
                 {
                   if (!check_node_same_texinfo_code (node_target,
                                                      label_node_content))
@@ -1900,8 +1900,8 @@ new_complete_node_menu (const ELEMENT *node, DOCUMENT 
*document,
 
                       part_title
                         = gdt_tree ("Part: {part_title}", document,
-                                    options->documentlanguage.string,
-                                    substrings, options->DEBUG.integer, 0);
+                                    options->documentlanguage.o.string,
+                                    substrings, options->DEBUG.o.integer, 0);
 
                       insert_menu_comment_content (&new_menu->contents,
                                                    content_index, part_title,
@@ -1917,8 +1917,8 @@ new_complete_node_menu (const ELEMENT *node, DOCUMENT 
*document,
                     {
                       ELEMENT *appendix_title
                         = gdt_tree ("Appendices", document,
-                                    options->documentlanguage.string,
-                                    0, options->DEBUG.integer, 0);
+                                    options->documentlanguage.o.string,
+                                    0, options->DEBUG.o.integer, 0);
 
                       insert_menu_comment_content (&new_menu->contents,
                                                    content_index,
@@ -2148,8 +2148,8 @@ new_detailmenu (ERROR_MESSAGE_LIST *error_messages,
           ELEMENT *master_menu_title;
           master_menu_title
             = gdt_tree (" --- The Detailed Node Listing ---", 0,
-                        options->documentlanguage.string, 0,
-                        options->DEBUG.integer, 0);
+                        options->documentlanguage.o.string, 0,
+                        options->DEBUG.o.integer, 0);
 
           for (i = 0; i < master_menu_title->contents.number; i++)
             master_menu_title->contents.list[i]->parent = first_preformatted;
diff --git a/tp/maintain/regenerate_C_options_info.pl 
b/tp/maintain/regenerate_C_options_info.pl
index 06a471608f..99662d8d66 100755
--- a/tp/maintain/regenerate_C_options_info.pl
+++ b/tp/maintain/regenerate_C_options_info.pl
@@ -309,26 +309,26 @@ foreach my $category (sort(keys(%option_categories))) {
       # TODO the generated file includes perl headers.  The NOTE in
       # build_perl_info.c about not using malloc/free should be relevant for
       # the generated file.
-      print GET "      non_perl_free (options->$option.string);
+      print GET "      non_perl_free (options->$option.o.string);
       if (SvOK (value))
-        options->$option.string = non_perl_strdup 
(SvPV${SV_function_type}_nolen (value));
+        options->$option.o.string = non_perl_strdup 
(SvPV${SV_function_type}_nolen (value));
       else
-        options->$option.string = 0;
+        options->$option.o.string = 0;
     }\n";
     } elsif ($type eq 'integer') {
       print GET "      if (SvOK (value))
         {
           if (looks_like_number (value))
-            options->$option.integer = SvIV (value);
+            options->$option.o.integer = SvIV (value);
           else
             {
               fprintf (stderr, \"BUG: %s: not an integer: %s\\n\",
                        \"$option\", SvPVutf8_nolen (value));
-              options->$option.integer = -1;
+              options->$option.o.integer = -1;
             }
         }
       else
-        options->$option.integer = -1;
+        options->$option.o.integer = -1;
     }\n";
     } elsif ($type =~ /_string_list$/) {
       my $dir_string_arg = 'svt_byte';
@@ -337,23 +337,23 @@ foreach my $category (sort(keys(%option_categories))) {
       } elsif ($type eq 'char_string_list') {
         $dir_string_arg = 'svt_char';
       }
-      print GET "      clear_strings_list (options->$option.strlist);
-      add_svav_to_string_list (value, options->$option.strlist, 
$dir_string_arg);
+      print GET "      clear_strings_list (options->$option.o.strlist);
+      add_svav_to_string_list (value, options->$option.o.strlist, 
$dir_string_arg);
     }\n";
     } elsif ($type eq 'buttons') {
-      print GET "      if (options->$option.buttons)
+      print GET "      if (options->$option.o.buttons)
         {
-          options->BIT_user_function_number -= 
options->$option.buttons->BIT_user_function_number;
-          html_free_button_specification_list (options->$option.buttons);
+          options->BIT_user_function_number -= 
options->$option.o.buttons->BIT_user_function_number;
+          html_free_button_specification_list (options->$option.o.buttons);
         }
 
-      options->$option.buttons = html_get_button_specification_list 
(converter, value);
-      if (options->$option.buttons)
-        options->BIT_user_function_number += 
options->$option.buttons->BIT_user_function_number;
+      options->$option.o.buttons = html_get_button_specification_list 
(converter, value);
+      if (options->$option.o.buttons)
+        options->BIT_user_function_number += 
options->$option.o.buttons->BIT_user_function_number;
     }\n";
     } elsif ($type eq 'icons') {
-      print GET "      html_free_direction_icons (options->$option.icons);
-      html_get_direction_icons_sv (converter, options->$option.icons, value);
+      print GET "      html_free_direction_icons (options->$option.o.icons);
+      html_get_direction_icons_sv (converter, options->$option.o.icons, value);
     }\n";
     } else {
       print GET "    {}\n";
@@ -385,15 +385,15 @@ foreach my $category (sort(keys(%option_categories))) {
         $SV_function_type = 'byte';
       }
       print GET "    {
-      if (!options->$option.string)
+      if (!options->$option.o.string)
         return newSV (0);
-      return newSVpv_${SV_function_type} (options->$option.string, 0);
+      return newSVpv_${SV_function_type} (options->$option.o.string, 0);
     }\n";
     } elsif ($type eq 'integer') {
       print GET "    {
-      if (options->$option.integer == -1)
+      if (options->$option.o.integer == -1)
         return newSV (0);
-      return newSViv (options->$option.integer);
+      return newSViv (options->$option.o.integer);
     }\n";
     } elsif ($type =~ /_string_list$/) {
       my $dir_string_arg = 'svt_byte';
@@ -403,16 +403,16 @@ foreach my $category (sort(keys(%option_categories))) {
         $dir_string_arg = 'svt_char';
       }
       print GET "    {
-      return newRV_noinc ((SV *) build_string_list(options->$option.strlist, 
$dir_string_arg));
+      return newRV_noinc ((SV *) build_string_list(options->$option.o.strlist, 
$dir_string_arg));
     }\n";
     } elsif ($type eq 'buttons') {
       print GET "    {
-      if (!options->$option.buttons) return newSV (0);
-      return newRV_inc ((SV *) options->$option.buttons->av);
+      if (!options->$option.o.buttons) return newSV (0);
+      return newRV_inc ((SV *) options->$option.o.buttons->av);
     }\n";
     } elsif ($type eq 'icons') {
       print GET "    {
-      return html_build_direction_icons (converter, options->$option.icons);
+      return html_build_direction_icons (converter, options->$option.o.icons);
     }\n";
     } else {
       print GET "    {return newSV (0);}\n";



reply via email to

[Prev in Thread] Current Thread [Next in Thread]