texinfo-commits
[Top][All Lists]
Advanced

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

[no subject]


From: Patrice Dumas
Date: Wed, 2 Oct 2024 06:20:11 -0400 (EDT)

branch: master
commit bec3cc4fe3e1a880ba9666614855da77836f6dc9
Author: Patrice Dumas <pertusus@free.fr>
AuthorDate: Wed Jul 31 11:01:38 2024 +0200

    * tp/Texinfo/XS/convert/get_html_perl_info.c
    (html_converter_initialize_sv): move up code which should have
    defaults in C and customization from Perl.  No change.
---
 ChangeLog                                  |    6 +
 tp/Texinfo/XS/convert/get_html_perl_info.c | 1162 ++++++++++++++--------------
 2 files changed, 587 insertions(+), 581 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d823bfd817..ee00899460 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2024-07-31  Patrice Dumas  <pertusus@free.fr>
+
+       * tp/Texinfo/XS/convert/get_html_perl_info.c
+       (html_converter_initialize_sv): move up code which should have
+       defaults in C and customization from Perl.  No change.
+
 2024-07-31  Patrice Dumas  <pertusus@free.fr>
 
        * tp/Texinfo/XS/convert/convert_html.c (html_format_setup): preset
diff --git a/tp/Texinfo/XS/convert/get_html_perl_info.c 
b/tp/Texinfo/XS/convert/get_html_perl_info.c
index a365f74568..9fc3809fc9 100644
--- a/tp/Texinfo/XS/convert/get_html_perl_info.c
+++ b/tp/Texinfo/XS/convert/get_html_perl_info.c
@@ -315,508 +315,312 @@ html_converter_initialize_sv (SV *converter_sv,
         }
     }
 
-#define FETCH(key) key##_sv = hv_fetch (converter_hv, #key, strlen (#key), 0);
-  FETCH(htmlxref)
-
-  if (htmlxref_sv)
+  if (customized_upper_case_commands && SvOK (customized_upper_case_commands))
     {
       I32 hv_number;
       I32 i;
-      HV *htmlxref_hv = (HV *) SvRV (*htmlxref_sv);
+      int cmd_index = 0;
 
-      hv_number = hv_iterinit (htmlxref_hv);
+      HV *upper_case_commands_hv = (HV *)SvRV (customized_upper_case_commands);
 
-      converter->htmlxref.number = hv_number;
+      hv_number = hv_iterinit (upper_case_commands_hv);
 
-      if (hv_number > 0)
-        {
-          converter->htmlxref.list = new_htmlxref_manual_list (hv_number);
+      converter->html_customized_upper_case_commands
+        = (COMMAND_INTEGER_INFORMATION *) malloc ((hv_number + 1)
+                                  * sizeof (COMMAND_INTEGER_INFORMATION));
+      memset (converter->html_customized_upper_case_commands, 0,
+              (hv_number + 1) * sizeof (COMMAND_INTEGER_INFORMATION));
 
-          for (i = 0; i < hv_number; i++)
+      for (i = 0; i < hv_number; i++)
+        {
+          I32 retlen;
+          char *cmdname;
+          SV *upper_case_sv = hv_iternextsv (upper_case_commands_hv,
+                                             &cmdname, &retlen);
+          if (SvOK (upper_case_sv))
             {
-              int j;
-              HTMLXREF_MANUAL *htmlxref_manual = &converter->htmlxref.list[i];
-              HE *next = hv_iternext (htmlxref_hv);
-              SV *selector_sv = hv_iterkeysv (next);
-              const char *selector = (char *) SvPVutf8_nolen (selector_sv);
-              SV *split_type_sv = HeVAL(next);
-              HV *split_type_hv = (HV *) SvRV (split_type_sv);
-
-              htmlxref_manual->manual = non_perl_strdup (selector);
-
-              for (j = 0; j < htmlxref_split_type_chapter +1; j++)
+              int upper_case_value = SvIV (upper_case_sv);
+              enum command_id cmd = lookup_builtin_command (cmdname);
+              if (!cmd)
+                fprintf (stderr, "ERROR: %s: no upper-case command\n", 
cmdname);
+              else
                 {
-                  const char *split_type_name = htmlxref_split_type_names[j];
-                  SV **urlprefix_sv = hv_fetch (split_type_hv, split_type_name,
-                                                strlen (split_type_name), 0);
-                  if (urlprefix_sv && SvOK (*urlprefix_sv))
-                    {
-                      const char *urlprefix = SvPVutf8_nolen (*urlprefix_sv);
-                      htmlxref_manual->urlprefix[j]
-                        = non_perl_strdup (urlprefix);
-                    }
+                  COMMAND_INTEGER_INFORMATION *customized_upper
+                    = 
&converter->html_customized_upper_case_commands[cmd_index];
+                  customized_upper->cmd = cmd;
+                  customized_upper->integer = upper_case_value;
+                  cmd_index++;
                 }
             }
         }
     }
 
-  FETCH(formatting_function);
-
-  /* no need to check if it exists */
-  formatting_function_hv = (HV *)SvRV (*formatting_function_sv);
+#define FETCH(key) key##_sv = hv_fetch (converter_hv, #key, strlen (#key), 0);
+  FETCH(code_types)
 
-  for (i = 0; i < FR_format_translate_message+1; i++)
+  if (code_types_sv)
     {
-      const char *ref_name = html_formatting_reference_names[i];
-      FORMATTING_REFERENCE *formatting_reference
-        = &converter->formatting_references[i];
-      SV **default_formatting_reference_sv
-        = hv_fetch (default_formatting_references_hv, ref_name,
-                    strlen (ref_name), 0);
-      SV **formatting_reference_sv
-        = hv_fetch (formatting_function_hv, ref_name, strlen (ref_name), 0);
-      /* no check for existence, all should exist */
-      if (SvOK (*default_formatting_reference_sv))
+      I32 hv_number;
+      I32 i;
+
+      HV *code_types_hv = (HV *)SvRV (*code_types_sv);
+
+      hv_number = hv_iterinit (code_types_hv);
+
+      for (i = 0; i < hv_number; i++)
         {
-          formatting_reference->sv_default = *default_formatting_reference_sv;
-          formatting_reference->status = FRS_status_default_set;
-        }
-      if (formatting_reference_sv)
+          int j;
+          enum element_type type = ET_NONE;
+          I32 retlen;
+          char *type_name;
+          SV *code_sv = hv_iternextsv (code_types_hv,
+                                       &type_name, &retlen);
+          if (SvOK (code_sv))
+            {
+              int code_value = SvIV (code_sv);
+          /* this is not very efficient, but should be done only once
+             in the default case.  If this is needed more, a qsort/bfind
+             could be used, but the overhead could probably only be
+             justified if finding the type index happens more often */
+              for (j = 1; j < TXI_TREE_TYPES_NUMBER; j++)
+                {
+                  if (!strcmp (type_data[j].name, type_name))
+                    {
+                      type = j;
+                      break;
+                    }
+                }
+              if (type == ET_NONE)
+                {
+                  fprintf (stderr, "ERROR: %s: code type not found\n",
+                                   type_name);
+                }
+              else
+                converter->code_types[type] = code_value;
+           }
+       }
+   }
+
+  FETCH(pre_class_types)
+
+  if (pre_class_types_sv)
+    {
+      I32 hv_number;
+      I32 i;
+
+      HV *pre_class_types_hv = (HV *)SvRV (*pre_class_types_sv);
+
+      hv_number = hv_iterinit (pre_class_types_hv);
+
+      for (i = 0; i < hv_number; i++)
         {
-          if SvOK (*formatting_reference_sv)
+          I32 retlen;
+          char *type_name;
+          SV *pre_class_sv = hv_iternextsv (pre_class_types_hv,
+                                            &type_name, &retlen);
+          if (SvOK (pre_class_sv))
             {
-              formatting_reference->sv_reference = *formatting_reference_sv;
-              if (formatting_reference->status != FRS_status_default_set
-                  || SvRV (*formatting_reference_sv)
-                       != SvRV (*default_formatting_reference_sv))
-                formatting_reference->status = FRS_status_customization_set;
+              const char *pre_class = SvPV_nolen (pre_class_sv);
+              enum element_type type = find_element_type (type_name);
+
+              if (type == ET_NONE)
+                {
+                  fprintf (stderr, "ERROR: %s: pre class type not found\n",
+                           type_name);
+                }
+              else
+                converter->pre_class_types[type] = non_perl_strdup (pre_class);
             }
         }
-      else
-        fprintf (stderr, "BUG: formatting reference %s not found\n",
-                         ref_name);
     }
 
-  /* copy the normal formatting references and replace the css strings
-     specific references */
-  memcpy (&converter->css_string_formatting_references,
-          &converter->formatting_references,
-      (FR_format_translate_message+1) * sizeof (FORMATTING_REFERENCE));
+  FETCH(accent_entities)
 
-  for (i = 0; i < FR_format_translate_message+1; i++)
+  if (accent_entities_sv)
     {
-      const char *ref_name = html_formatting_reference_names[i];
-      SV **default_formatting_reference_sv
-        = hv_fetch (default_css_string_formatting_references_hv, ref_name,
-                    strlen (ref_name), 0);
+      I32 hv_number;
+      I32 i;
 
-      /* no customization, current is the default */
-      if (default_formatting_reference_sv
-          && SvOK (*default_formatting_reference_sv))
+      HV *accent_entities_hv
+        = (HV *)SvRV (*accent_entities_sv);
+
+      hv_number = hv_iterinit (accent_entities_hv);
+
+      for (i = 0; i < hv_number; i++)
         {
-          FORMATTING_REFERENCE *formatting_reference
-            = &converter->css_string_formatting_references[i];
-          formatting_reference->sv_default = *default_formatting_reference_sv;
-          formatting_reference->sv_reference = 
*default_formatting_reference_sv;
-          formatting_reference->status = FRS_status_default_set;
+          char *cmdname;
+          I32 retlen;
+          SV *spec_sv = hv_iternextsv (accent_entities_hv,
+                                          &cmdname, &retlen);
+          if (SvOK (spec_sv))
+            {
+              enum command_id cmd = lookup_builtin_command (cmdname);
+              if (!cmd)
+                fprintf (stderr, "ERROR: %s: no accent command\n", cmdname);
+              else
+                {
+                  ACCENT_ENTITY_INFO *accent_info
+                    = &converter->accent_entities[cmd];
+                  AV *spec_av = (AV *)SvRV (spec_sv);
+                  SV **entity_sv = av_fetch (spec_av, 0, 0);
+                  SV **characters_sv = av_fetch (spec_av, 1, 0);
+
+                  if (entity_sv)
+                    {
+                      char *entity = (char *) SvPVutf8_nolen (*entity_sv);
+                      accent_info->entity = non_perl_strdup (entity);
+                    }
+
+                  if (characters_sv && SvOK (*characters_sv))
+                    {
+                      char *characters
+                        = (char *) SvPVutf8_nolen (*characters_sv);
+                      if (strlen (characters))
+                        accent_info->characters = non_perl_strdup (characters);
+                    }
+                }
+            }
         }
     }
 
-  FETCH(commands_open)
-  commands_open_hv = (HV *)SvRV (*commands_open_sv);
-  default_commands_open_hv = (HV *)SvRV (default_commands_open);
 
-  FETCH(commands_conversion)
-  commands_conversion_hv = (HV *)SvRV (*commands_conversion_sv);
-  default_commands_conversion_hv = (HV *)SvRV (default_commands_conversion);
+  FETCH(style_commands_formatting)
 
-  for (i = 0; i < BUILTIN_CMD_NUMBER; i++)
+  if (style_commands_formatting_sv)
     {
-      const char *ref_name;
-      if (i == 0)
-        ref_name = "";
-      else
-        ref_name = builtin_command_data[i].cmdname;
-      FORMATTING_REFERENCE *open_formatting_reference
-       = &converter->commands_open[i];
-      FORMATTING_REFERENCE *conversion_formatting_reference
-       = &converter->commands_conversion[i];
-
-      register_formatting_reference_with_default ("command_open",
-        open_formatting_reference, ref_name, default_commands_open_hv,
-        commands_open_hv);
-      register_formatting_reference_with_default ("command_conversion",
-        conversion_formatting_reference, ref_name,
-        default_commands_conversion_hv,
-        commands_conversion_hv);
+      I32 hv_number;
+      I32 i;
 
-  /* NOTE use the loop to collect the number of accent commands too */
-      if (builtin_command_data[i].flags & CF_accent)
-        nr_accent_cmd++;
-    }
+      HV *style_commands_formatting_hv
+        = (HV *)SvRV (*style_commands_formatting_sv);
 
-  initialize_cmd_list (&converter->accent_cmd, nr_accent_cmd, 0);
+      hv_number = hv_iterinit (style_commands_formatting_hv);
+      initialize_cmd_list (&converter->style_formatted_cmd, hv_number, 0);
 
-  default_css_string_commands_conversion_hv
-    = (HV *)SvRV (default_css_string_commands_conversion);
-  /* copy the normal formatting references and replace the css strings
-     specific references */
-  memcpy (&converter->css_string_commands_conversion,
-          &converter->commands_conversion,
-      (BUILTIN_CMD_NUMBER) * sizeof (FORMATTING_REFERENCE));
-
-  for (i = 0; i < BUILTIN_CMD_NUMBER; i++)
-    {
-      const char *ref_name;
-      if (i == 0)
-        ref_name = "";
-      else
-        ref_name = builtin_command_data[i].cmdname;
-
-     FORMATTING_REFERENCE *conversion_formatting_reference
-       = &converter->css_string_commands_conversion[i];
-
-     register_formatting_reference_default ("css_command_conversion",
-        conversion_formatting_reference, ref_name,
-        default_css_string_commands_conversion_hv);
-
-  /* NOTE we use the loop to collect the accent commands too */
-     if (builtin_command_data[i].flags & CF_accent)
-       {
-         converter->accent_cmd.list[converter->accent_cmd.number] = i;
-         converter->accent_cmd.number++;
-       }
-    }
-
-
-  FETCH(types_open)
-  types_open_hv = (HV *)SvRV (*types_open_sv);
-  default_types_open_hv = (HV *)SvRV (default_types_open);
-
-  FETCH(types_conversion)
-  types_conversion_hv = (HV *)SvRV (*types_conversion_sv);
-  default_types_conversion_hv = (HV *)SvRV (default_types_conversion);
-
-  for (i = 0; i < TXI_TREE_TYPES_NUMBER; i++)
-    {
-      const char *ref_name;
-      if (i == 0)
-        ref_name = "";
-      else
-        ref_name = type_data[i].name;
-      FORMATTING_REFERENCE *open_formatting_reference
-       = &converter->types_open[i];
-      FORMATTING_REFERENCE *conversion_formatting_reference
-       = &converter->types_conversion[i];
-
-      register_formatting_reference_with_default ("type_open",
-        open_formatting_reference, ref_name, default_types_open_hv,
-        types_open_hv);
-      register_formatting_reference_with_default ("type_conversion",
-        conversion_formatting_reference, ref_name,
-        default_types_conversion_hv,
-        types_conversion_hv);
-    }
-
-  default_css_string_types_conversion_hv
-     = (HV *)SvRV (default_css_string_types_conversion);
-  /* copy the normal formatting references and replace the css strings
-     specific references */
-  memcpy (&converter->css_string_types_conversion,
-          &converter->types_conversion,
-      (TXI_TREE_TYPES_NUMBER) * sizeof (FORMATTING_REFERENCE));
-
-  for (i = 0; i < TXI_TREE_TYPES_NUMBER; i++)
-    {
-      char *ref_name;
-      if (i == 0)
-        ref_name = "";
-      else
-        ref_name = type_data[i].name;
-      FORMATTING_REFERENCE *conversion_formatting_reference
-       = &converter->css_string_types_conversion[i];
-
-      register_formatting_reference_default ("css_type_conversion",
-        conversion_formatting_reference, ref_name,
-        default_css_string_types_conversion_hv);
-    }
-
-
-  FETCH(output_units_conversion)
-  output_units_conversion_hv = (HV *)SvRV (*output_units_conversion_sv);
-  default_output_units_conversion_hv
-    = (HV *)SvRV (default_output_units_conversion);
-
-  for (i = 0; i < OU_special_unit+1; i++)
-    {
-      const char *ref_name = output_unit_type_names[i];
-      FORMATTING_REFERENCE *conversion_formatting_reference
-       = &converter->output_units_conversion[i];
+      for (i = 0; i < hv_number; i++)
+        {
+          char *cmdname;
+          I32 retlen;
+          SV *context_sv = hv_iternextsv (style_commands_formatting_hv,
+                                          &cmdname, &retlen);
+          if (SvOK (context_sv))
+            {
+              HV *context_hv = (HV *)SvRV (context_sv);
+              enum command_id cmd = lookup_builtin_command (cmdname);
+              if (!cmd)
+                fprintf (stderr, "ERROR: %s: no style command\n", cmdname);
+              else
+                {
+                  I32 context_nr;
+                  I32 j;
 
-      register_formatting_reference_with_default ("output_unit_conversion",
-        conversion_formatting_reference, ref_name,
-        default_output_units_conversion_hv,
-        output_units_conversion_hv);
-    }
+                  converter->style_formatted_cmd.list[
+                                 converter->style_formatted_cmd.number] = cmd;
+                  converter->style_formatted_cmd.number++;
 
-  if (special_unit_varieties->number > 0)
-    {
-      HV *special_unit_body_hv = 0;
-      HV *default_special_unit_body_hv;
+                  context_nr = hv_iterinit (context_hv);
+                  for (j = 0; j < context_nr; j++)
+                    {
+                      char *context_name;
+                      I32 retlen;
+                      int k;
+                      int context_idx = -1;
+                      SV *format_spec_sv = hv_iternextsv (context_hv,
+                                                 &context_name, &retlen);
+                      for (k = 0; k < STYLE_COMMAND_CONTEXT_NR; k++)
+                        {
+                          if (!strcmp (context_name,
+                                html_conversion_context_type_names[k]))
+                            {
+                              context_idx = k;
+                              break;
+                            }
+                        }
+                      if (context_idx < 0)
+                        {
+                          fprintf (stderr,
+                              "ERROR: %s: %s: unknown style context\n",
+                                         cmdname, context_name);
+                          break;
+                        }
+                      if (SvOK (format_spec_sv))
+                        {
+                          I32 spec_number;
+                          I32 s;
+                          HTML_STYLE_COMMAND_CONVERSION *format_spec;
 
-      converter->special_unit_body
-        = new_special_unit_formatting_references
-                         (special_unit_varieties->number);
+                          HV *format_spec_hv = (HV *)SvRV (format_spec_sv);
 
-      FETCH(special_unit_body)
-      if (special_unit_body_sv)
-        special_unit_body_hv = (HV *)SvRV (*special_unit_body_sv);
-      default_special_unit_body_hv = (HV *)SvRV (default_special_unit_body);
+                          format_spec
+                            = &converter
+                             ->html_style_command_conversion[cmd][context_idx];
 
-      for (i = 0; i < special_unit_varieties->number; i++)
-        {
-          char *variety_name = special_unit_varieties->list[i];
-          FORMATTING_REFERENCE *special_unit_body_formatting_reference
-            = &converter->special_unit_body[i];
-          register_formatting_reference_with_default ("special_unit_body",
-            special_unit_body_formatting_reference, variety_name,
-            default_special_unit_body_hv,
-            special_unit_body_hv);
+                          spec_number = hv_iterinit (format_spec_hv);
+                          for (s = 0; s < spec_number; s++)
+                            {
+                              char *key;
+                              I32 retlen;
+                              SV *spec_sv = hv_iternextsv (format_spec_hv,
+                                                           &key, &retlen);
+                              if (!strcmp (key, "element"))
+                                {
+                                  const char *tmp_spec
+                                    = (char *) SvPVutf8_nolen (spec_sv);
+                                  format_spec->element
+                                    = non_perl_strdup (tmp_spec);
+                                }
+                              else if (!strcmp (key, "quote"))
+                                format_spec->quote = SvIV (spec_sv);
+                            }
+                            /*
+                          fprintf (stderr, "HHH %d %d %s %d %d %s %d %s\n", i, 
cmd, cmdname, j, context_idx, context_name, format_spec->quote, 
format_spec->element);
+                             */
+                        }
+                    }
+                }
+            }
         }
     }
 
-  FETCH(file_id_setting)
-
-  if (file_id_setting_sv)
-    {
-      HV *file_id_setting_hv = (HV *)SvRV(*file_id_setting_sv);
-      #define html_file_id_setting_name(name) \
-      {\
-        SV **name##_sv = hv_fetch (file_id_setting_hv, #name, \
-                                   strlen (#name), 0);\
-        if (name##_sv)\
-          {\
-            converter->file_id_setting_refs[FIS_##name]\
-              = (const void *) (* name##_sv);\
-            converter->file_id_setting_ref_number++; \
-          }\
-      }
-       HTML_FILE_ID_SETTING_NAMES_LIST
-      #undef html_file_id_setting_name
-    }
-
-  FETCH(code_types)
-
-  if (code_types_sv)
+  FETCH(customized_no_arg_commands_formatting)
+  if (customized_no_arg_commands_formatting_sv)
     {
       I32 hv_number;
       I32 i;
+      HV *customized_no_arg_commands_formatting_hv
+        = (HV *) SvRV (*customized_no_arg_commands_formatting_sv);
 
-      HV *code_types_hv = (HV *)SvRV (*code_types_sv);
-
-      hv_number = hv_iterinit (code_types_hv);
+      hv_number = hv_iterinit (customized_no_arg_commands_formatting_hv);
 
       for (i = 0; i < hv_number; i++)
         {
-          int j;
-          enum element_type type = ET_NONE;
+          char *cmdname;
           I32 retlen;
-          char *type_name;
-          SV *code_sv = hv_iternextsv (code_types_hv,
-                                       &type_name, &retlen);
-          if (SvOK (code_sv))
+          SV *context_sv
+              = hv_iternextsv (customized_no_arg_commands_formatting_hv,
+                                          &cmdname, &retlen);
+          if (SvOK (context_sv))
             {
-              int code_value = SvIV (code_sv);
-          /* this is not very efficient, but should be done only once
-             in the default case.  If this is needed more, a qsort/bfind
-             could be used, but the overhead could probably only be
-             justified if finding the type index happens more often */
-              for (j = 1; j < TXI_TREE_TYPES_NUMBER; j++)
+              HV *context_hv = (HV *)SvRV (context_sv);
+              enum command_id cmd = lookup_builtin_command (cmdname);
+
+              if (!cmd)
+                fprintf (stderr, "ERROR: %s: no no arg command\n", cmdname);
+              else
                 {
-                  if (!strcmp (type_data[j].name, type_name))
-                    {
-                      type = j;
-                      break;
-                    }
-                }
-              if (type == ET_NONE)
-                {
-                  fprintf (stderr, "ERROR: %s: code type not found\n",
-                                   type_name);
-                }
-              else
-                converter->code_types[type] = code_value;
-           }
-       }
-   }
-
-  FETCH(pre_class_types)
-
-  if (pre_class_types_sv)
-    {
-      I32 hv_number;
-      I32 i;
-
-      HV *pre_class_types_hv = (HV *)SvRV (*pre_class_types_sv);
-
-      hv_number = hv_iterinit (pre_class_types_hv);
-
-      for (i = 0; i < hv_number; i++)
-        {
-          I32 retlen;
-          char *type_name;
-          SV *pre_class_sv = hv_iternextsv (pre_class_types_hv,
-                                            &type_name, &retlen);
-          if (SvOK (pre_class_sv))
-            {
-              const char *pre_class = SvPV_nolen (pre_class_sv);
-              enum element_type type = find_element_type (type_name);
-
-              if (type == ET_NONE)
-                {
-                  fprintf (stderr, "ERROR: %s: pre class type not found\n",
-                           type_name);
-                }
-              else
-                converter->pre_class_types[type] = non_perl_strdup (pre_class);
-            }
-        }
-    }
-
-  if (customized_upper_case_commands && SvOK (customized_upper_case_commands))
-    {
-      I32 hv_number;
-      I32 i;
-      int cmd_index = 0;
-
-      HV *upper_case_commands_hv = (HV *)SvRV (customized_upper_case_commands);
-
-      hv_number = hv_iterinit (upper_case_commands_hv);
-
-      converter->html_customized_upper_case_commands
-        = (COMMAND_INTEGER_INFORMATION *) malloc ((hv_number + 1)
-                                  * sizeof (COMMAND_INTEGER_INFORMATION));
-      memset (converter->html_customized_upper_case_commands, 0,
-              (hv_number + 1) * sizeof (COMMAND_INTEGER_INFORMATION));
-
-      for (i = 0; i < hv_number; i++)
-        {
-          I32 retlen;
-          char *cmdname;
-          SV *upper_case_sv = hv_iternextsv (upper_case_commands_hv,
-                                             &cmdname, &retlen);
-          if (SvOK (upper_case_sv))
-            {
-              int upper_case_value = SvIV (upper_case_sv);
-              enum command_id cmd = lookup_builtin_command (cmdname);
-              if (!cmd)
-                fprintf (stderr, "ERROR: %s: no upper-case command\n", 
cmdname);
-              else
-                {
-                  COMMAND_INTEGER_INFORMATION *customized_upper
-                    = 
&converter->html_customized_upper_case_commands[cmd_index];
-                  customized_upper->cmd = cmd;
-                  customized_upper->integer = upper_case_value;
-                  cmd_index++;
-                }
-           }
-       }
-   }
-
-  FETCH(accent_entities)
-
-  if (accent_entities_sv)
-    {
-      I32 hv_number;
-      I32 i;
-
-      HV *accent_entities_hv
-        = (HV *)SvRV (*accent_entities_sv);
-
-      hv_number = hv_iterinit (accent_entities_hv);
-
-      for (i = 0; i < hv_number; i++)
-        {
-          char *cmdname;
-          I32 retlen;
-          SV *spec_sv = hv_iternextsv (accent_entities_hv,
-                                          &cmdname, &retlen);
-          if (SvOK (spec_sv))
-            {
-              enum command_id cmd = lookup_builtin_command (cmdname);
-              if (!cmd)
-                fprintf (stderr, "ERROR: %s: no accent command\n", cmdname);
-              else
-                {
-                  ACCENT_ENTITY_INFO *accent_info
-                    = &converter->accent_entities[cmd];
-                  AV *spec_av = (AV *)SvRV (spec_sv);
-                  SV **entity_sv = av_fetch (spec_av, 0, 0);
-                  SV **characters_sv = av_fetch (spec_av, 1, 0);
-
-                  if (entity_sv)
-                    {
-                      char *entity = (char *) SvPVutf8_nolen (*entity_sv);
-                      accent_info->entity = non_perl_strdup (entity);
-                    }
-
-                  if (characters_sv && SvOK (*characters_sv))
-                    {
-                      char *characters
-                        = (char *) SvPVutf8_nolen (*characters_sv);
-                      if (strlen (characters))
-                        accent_info->characters = non_perl_strdup (characters);
-                    }
-                }
-            }
-        }
-    }
-
-
-  FETCH(style_commands_formatting)
-
-  if (style_commands_formatting_sv)
-    {
-      I32 hv_number;
-      I32 i;
-
-      HV *style_commands_formatting_hv
-        = (HV *)SvRV (*style_commands_formatting_sv);
-
-      hv_number = hv_iterinit (style_commands_formatting_hv);
-      initialize_cmd_list (&converter->style_formatted_cmd, hv_number, 0);
-
-      for (i = 0; i < hv_number; i++)
-        {
-          char *cmdname;
-          I32 retlen;
-          SV *context_sv = hv_iternextsv (style_commands_formatting_hv,
-                                          &cmdname, &retlen);
-          if (SvOK (context_sv))
-            {
-              HV *context_hv = (HV *)SvRV (context_sv);
-              enum command_id cmd = lookup_builtin_command (cmdname);
-              if (!cmd)
-                fprintf (stderr, "ERROR: %s: no style command\n", cmdname);
-              else
-                {
-                  I32 context_nr;
-                  I32 j;
-
-                  converter->style_formatted_cmd.list[
-                                 converter->style_formatted_cmd.number] = cmd;
-                  converter->style_formatted_cmd.number++;
-
-                  context_nr = hv_iterinit (context_hv);
-                  for (j = 0; j < context_nr; j++)
+                  I32 context_nr;
+                  I32 j;
+
+                  context_nr = hv_iterinit (context_hv);
+                  for (j = 0; j < context_nr; j++)
                     {
                       char *context_name;
                       I32 retlen;
-                      int k;
+                      enum conversion_context k;
                       int context_idx = -1;
                       SV *format_spec_sv = hv_iternextsv (context_hv,
                                                  &context_name, &retlen);
-                      for (k = 0; k < STYLE_COMMAND_CONTEXT_NR; k++)
+                      for (k = 0; k < NO_ARG_COMMAND_CONTEXT_NR; k++)
                         {
                           if (!strcmp (context_name,
                                 html_conversion_context_type_names[k]))
@@ -828,7 +632,7 @@ html_converter_initialize_sv (SV *converter_sv,
                       if (context_idx < 0)
                         {
                           fprintf (stderr,
-                              "ERROR: %s: %s: unknown style context\n",
+                              "ERROR: %s: %s: unknown no arg context\n",
                                          cmdname, context_name);
                           break;
                         }
@@ -836,13 +640,16 @@ html_converter_initialize_sv (SV *converter_sv,
                         {
                           I32 spec_number;
                           I32 s;
-                          HTML_STYLE_COMMAND_CONVERSION *format_spec;
+                          HTML_NO_ARG_COMMAND_CONVERSION *format_spec;
 
                           HV *format_spec_hv = (HV *)SvRV (format_spec_sv);
 
-                          format_spec
-                            = &converter
-                             ->html_style_command_conversion[cmd][context_idx];
+                          format_spec = (HTML_NO_ARG_COMMAND_CONVERSION *)
+                            malloc (sizeof (HTML_NO_ARG_COMMAND_CONVERSION));
+                          memset (format_spec, 0,
+                                  sizeof (HTML_NO_ARG_COMMAND_CONVERSION));
+                          converter->customized_no_arg_commands_formatting
+                                              [cmd][context_idx] = format_spec;
 
                           spec_number = hv_iterinit (format_spec_hv);
                           for (s = 0; s < spec_number; s++)
@@ -858,12 +665,30 @@ html_converter_initialize_sv (SV *converter_sv,
                                   format_spec->element
                                     = non_perl_strdup (tmp_spec);
                                 }
-                              else if (!strcmp (key, "quote"))
-                                format_spec->quote = SvIV (spec_sv);
+                              else if (!strcmp (key, "unset"))
+                                format_spec->unset = SvIV (spec_sv);
+                              else if (!strcmp (key, "text"))
+                                {
+                                  const char *tmp_spec
+                                    = (char *) SvPVutf8_nolen (spec_sv);
+                                  format_spec->text
+                                    = non_perl_strdup (tmp_spec);
+                                }
+                              else if (!strcmp (key, "translated_converted"))
+                                {
+                                  const char *tmp_spec
+                                    = (char *) SvPVutf8_nolen (spec_sv);
+                                  format_spec->translated_converted
+                                    = non_perl_strdup (tmp_spec);
+                                }
+                              else if (!strcmp (key, "translated_to_convert"))
+                                {
+                                  const char *tmp_spec
+                                    = (char *) SvPVutf8_nolen (spec_sv);
+                                  format_spec->translated_to_convert
+                                    = non_perl_strdup (tmp_spec);
+                                }
                             }
-                            /*
-                          fprintf (stderr, "HHH %d %d %s %d %d %s %d %s\n", i, 
cmd, cmdname, j, context_idx, context_name, format_spec->quote, 
format_spec->element);
-                             */
                         }
                     }
                 }
@@ -871,138 +696,24 @@ html_converter_initialize_sv (SV *converter_sv,
         }
     }
 
-  FETCH(customized_no_arg_commands_formatting)
-  if (customized_no_arg_commands_formatting_sv)
-    {
-      I32 hv_number;
-      I32 i;
-      HV *customized_no_arg_commands_formatting_hv
-        = (HV *) SvRV (*customized_no_arg_commands_formatting_sv);
+  /* The corresponding direction without FirstInFile are used instead
+     of FirstInFile*, so the directions_strings are not set */
+  nr_string_directions = NON_SPECIAL_DIRECTIONS_NR - FIRSTINFILE_NR
+                     + special_unit_varieties->number;
 
-      hv_number = hv_iterinit (customized_no_arg_commands_formatting_hv);
+  if (customized_direction_strings && SvOK (customized_direction_strings))
+    {
+      HV *customized_direction_strings_hv
+        = (HV *) SvRV (customized_direction_strings);
 
-      for (i = 0; i < hv_number; i++)
+      for (DS_type = 0; DS_type < TDS_TYPE_MAX_NR; DS_type++)
         {
-          char *cmdname;
-          I32 retlen;
-          SV *context_sv
-              = hv_iternextsv (customized_no_arg_commands_formatting_hv,
-                                          &cmdname, &retlen);
-          if (SvOK (context_sv))
-            {
-              HV *context_hv = (HV *)SvRV (context_sv);
-              enum command_id cmd = lookup_builtin_command (cmdname);
-
-              if (!cmd)
-                fprintf (stderr, "ERROR: %s: no no arg command\n", cmdname);
-              else
-                {
-                  I32 context_nr;
-                  I32 j;
-
-                  context_nr = hv_iterinit (context_hv);
-                  for (j = 0; j < context_nr; j++)
-                    {
-                      char *context_name;
-                      I32 retlen;
-                      enum conversion_context k;
-                      int context_idx = -1;
-                      SV *format_spec_sv = hv_iternextsv (context_hv,
-                                                 &context_name, &retlen);
-                      for (k = 0; k < NO_ARG_COMMAND_CONTEXT_NR; k++)
-                        {
-                          if (!strcmp (context_name,
-                                html_conversion_context_type_names[k]))
-                            {
-                              context_idx = k;
-                              break;
-                            }
-                        }
-                      if (context_idx < 0)
-                        {
-                          fprintf (stderr,
-                              "ERROR: %s: %s: unknown no arg context\n",
-                                         cmdname, context_name);
-                          break;
-                        }
-                      if (SvOK (format_spec_sv))
-                        {
-                          I32 spec_number;
-                          I32 s;
-                          HTML_NO_ARG_COMMAND_CONVERSION *format_spec;
-
-                          HV *format_spec_hv = (HV *)SvRV (format_spec_sv);
-
-                          format_spec = (HTML_NO_ARG_COMMAND_CONVERSION *)
-                            malloc (sizeof (HTML_NO_ARG_COMMAND_CONVERSION));
-                          memset (format_spec, 0,
-                                  sizeof (HTML_NO_ARG_COMMAND_CONVERSION));
-                          converter->customized_no_arg_commands_formatting
-                                              [cmd][context_idx] = format_spec;
-
-                          spec_number = hv_iterinit (format_spec_hv);
-                          for (s = 0; s < spec_number; s++)
-                            {
-                              char *key;
-                              I32 retlen;
-                              SV *spec_sv = hv_iternextsv (format_spec_hv,
-                                                           &key, &retlen);
-                              if (!strcmp (key, "element"))
-                                {
-                                  const char *tmp_spec
-                                    = (char *) SvPVutf8_nolen (spec_sv);
-                                  format_spec->element
-                                    = non_perl_strdup (tmp_spec);
-                                }
-                              else if (!strcmp (key, "unset"))
-                                format_spec->unset = SvIV (spec_sv);
-                              else if (!strcmp (key, "text"))
-                                {
-                                  const char *tmp_spec
-                                    = (char *) SvPVutf8_nolen (spec_sv);
-                                  format_spec->text
-                                    = non_perl_strdup (tmp_spec);
-                                }
-                              else if (!strcmp (key, "translated_converted"))
-                                {
-                                  const char *tmp_spec
-                                    = (char *) SvPVutf8_nolen (spec_sv);
-                                  format_spec->translated_converted
-                                    = non_perl_strdup (tmp_spec);
-                                }
-                              else if (!strcmp (key, "translated_to_convert"))
-                                {
-                                  const char *tmp_spec
-                                    = (char *) SvPVutf8_nolen (spec_sv);
-                                  format_spec->translated_to_convert
-                                    = non_perl_strdup (tmp_spec);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-  /* The corresponding direction without FirstInFile are used instead
-     of FirstInFile*, so the directions_strings are not set */
-  nr_string_directions = NON_SPECIAL_DIRECTIONS_NR - FIRSTINFILE_NR
-                     + special_unit_varieties->number;
-
-  if (customized_direction_strings && SvOK (customized_direction_strings))
-    {
-      HV *customized_direction_strings_hv
-        = (HV *) SvRV (customized_direction_strings);
-
-      for (DS_type = 0; DS_type < TDS_TYPE_MAX_NR; DS_type++)
-        {
-          int i;
-          const char *type_name;
-          HV *direction_hv = 0;
-          SV **direction_sv;
-          size_t customized_type = DS_type;
-          int translated = 0;
+          int i;
+          const char *type_name;
+          HV *direction_hv = 0;
+          SV **direction_sv;
+          size_t customized_type = DS_type;
+          int translated = 0;
 
           type_name = direction_string_type_names[DS_type];
 
@@ -1145,6 +856,295 @@ html_converter_initialize_sv (SV *converter_sv,
         }
     }
 
+  FETCH(htmlxref)
+
+  if (htmlxref_sv)
+    {
+      I32 hv_number;
+      I32 i;
+      HV *htmlxref_hv = (HV *) SvRV (*htmlxref_sv);
+
+      hv_number = hv_iterinit (htmlxref_hv);
+
+      converter->htmlxref.number = hv_number;
+
+      if (hv_number > 0)
+        {
+          converter->htmlxref.list = new_htmlxref_manual_list (hv_number);
+
+          for (i = 0; i < hv_number; i++)
+            {
+              int j;
+              HTMLXREF_MANUAL *htmlxref_manual = &converter->htmlxref.list[i];
+              HE *next = hv_iternext (htmlxref_hv);
+              SV *selector_sv = hv_iterkeysv (next);
+              const char *selector = (char *) SvPVutf8_nolen (selector_sv);
+              SV *split_type_sv = HeVAL(next);
+              HV *split_type_hv = (HV *) SvRV (split_type_sv);
+
+              htmlxref_manual->manual = non_perl_strdup (selector);
+
+              for (j = 0; j < htmlxref_split_type_chapter +1; j++)
+                {
+                  const char *split_type_name = htmlxref_split_type_names[j];
+                  SV **urlprefix_sv = hv_fetch (split_type_hv, split_type_name,
+                                                strlen (split_type_name), 0);
+                  if (urlprefix_sv && SvOK (*urlprefix_sv))
+                    {
+                      const char *urlprefix = SvPVutf8_nolen (*urlprefix_sv);
+                      htmlxref_manual->urlprefix[j]
+                        = non_perl_strdup (urlprefix);
+                    }
+                }
+            }
+        }
+    }
+
+  FETCH(formatting_function);
+
+  /* no need to check if it exists */
+  formatting_function_hv = (HV *)SvRV (*formatting_function_sv);
+
+  for (i = 0; i < FR_format_translate_message+1; i++)
+    {
+      const char *ref_name = html_formatting_reference_names[i];
+      FORMATTING_REFERENCE *formatting_reference
+        = &converter->formatting_references[i];
+      SV **default_formatting_reference_sv
+        = hv_fetch (default_formatting_references_hv, ref_name,
+                    strlen (ref_name), 0);
+      SV **formatting_reference_sv
+        = hv_fetch (formatting_function_hv, ref_name, strlen (ref_name), 0);
+      /* no check for existence, all should exist */
+      if (SvOK (*default_formatting_reference_sv))
+        {
+          formatting_reference->sv_default = *default_formatting_reference_sv;
+          formatting_reference->status = FRS_status_default_set;
+        }
+      if (formatting_reference_sv)
+        {
+          if SvOK (*formatting_reference_sv)
+            {
+              formatting_reference->sv_reference = *formatting_reference_sv;
+              if (formatting_reference->status != FRS_status_default_set
+                  || SvRV (*formatting_reference_sv)
+                       != SvRV (*default_formatting_reference_sv))
+                formatting_reference->status = FRS_status_customization_set;
+            }
+        }
+      else
+        fprintf (stderr, "BUG: formatting reference %s not found\n",
+                         ref_name);
+    }
+
+  /* copy the normal formatting references and replace the css strings
+     specific references */
+  memcpy (&converter->css_string_formatting_references,
+          &converter->formatting_references,
+      (FR_format_translate_message+1) * sizeof (FORMATTING_REFERENCE));
+
+  for (i = 0; i < FR_format_translate_message+1; i++)
+    {
+      const char *ref_name = html_formatting_reference_names[i];
+      SV **default_formatting_reference_sv
+        = hv_fetch (default_css_string_formatting_references_hv, ref_name,
+                    strlen (ref_name), 0);
+
+      /* no customization, current is the default */
+      if (default_formatting_reference_sv
+          && SvOK (*default_formatting_reference_sv))
+        {
+          FORMATTING_REFERENCE *formatting_reference
+            = &converter->css_string_formatting_references[i];
+          formatting_reference->sv_default = *default_formatting_reference_sv;
+          formatting_reference->sv_reference = 
*default_formatting_reference_sv;
+          formatting_reference->status = FRS_status_default_set;
+        }
+    }
+
+  FETCH(commands_open)
+  commands_open_hv = (HV *)SvRV (*commands_open_sv);
+  default_commands_open_hv = (HV *)SvRV (default_commands_open);
+
+  FETCH(commands_conversion)
+  commands_conversion_hv = (HV *)SvRV (*commands_conversion_sv);
+  default_commands_conversion_hv = (HV *)SvRV (default_commands_conversion);
+
+  for (i = 0; i < BUILTIN_CMD_NUMBER; i++)
+    {
+      const char *ref_name;
+      if (i == 0)
+        ref_name = "";
+      else
+        ref_name = builtin_command_data[i].cmdname;
+      FORMATTING_REFERENCE *open_formatting_reference
+       = &converter->commands_open[i];
+      FORMATTING_REFERENCE *conversion_formatting_reference
+       = &converter->commands_conversion[i];
+
+      register_formatting_reference_with_default ("command_open",
+        open_formatting_reference, ref_name, default_commands_open_hv,
+        commands_open_hv);
+      register_formatting_reference_with_default ("command_conversion",
+        conversion_formatting_reference, ref_name,
+        default_commands_conversion_hv,
+        commands_conversion_hv);
+
+  /* NOTE use the loop to collect the number of accent commands too */
+      if (builtin_command_data[i].flags & CF_accent)
+        nr_accent_cmd++;
+    }
+
+  initialize_cmd_list (&converter->accent_cmd, nr_accent_cmd, 0);
+
+  default_css_string_commands_conversion_hv
+    = (HV *)SvRV (default_css_string_commands_conversion);
+  /* copy the normal formatting references and replace the css strings
+     specific references */
+  memcpy (&converter->css_string_commands_conversion,
+          &converter->commands_conversion,
+      (BUILTIN_CMD_NUMBER) * sizeof (FORMATTING_REFERENCE));
+
+  for (i = 0; i < BUILTIN_CMD_NUMBER; i++)
+    {
+      const char *ref_name;
+      if (i == 0)
+        ref_name = "";
+      else
+        ref_name = builtin_command_data[i].cmdname;
+
+     FORMATTING_REFERENCE *conversion_formatting_reference
+       = &converter->css_string_commands_conversion[i];
+
+     register_formatting_reference_default ("css_command_conversion",
+        conversion_formatting_reference, ref_name,
+        default_css_string_commands_conversion_hv);
+
+  /* NOTE we use the loop to collect the accent commands too */
+     if (builtin_command_data[i].flags & CF_accent)
+       {
+         converter->accent_cmd.list[converter->accent_cmd.number] = i;
+         converter->accent_cmd.number++;
+       }
+    }
+
+
+  FETCH(types_open)
+  types_open_hv = (HV *)SvRV (*types_open_sv);
+  default_types_open_hv = (HV *)SvRV (default_types_open);
+
+  FETCH(types_conversion)
+  types_conversion_hv = (HV *)SvRV (*types_conversion_sv);
+  default_types_conversion_hv = (HV *)SvRV (default_types_conversion);
+
+  for (i = 0; i < TXI_TREE_TYPES_NUMBER; i++)
+    {
+      const char *ref_name;
+      if (i == 0)
+        ref_name = "";
+      else
+        ref_name = type_data[i].name;
+      FORMATTING_REFERENCE *open_formatting_reference
+       = &converter->types_open[i];
+      FORMATTING_REFERENCE *conversion_formatting_reference
+       = &converter->types_conversion[i];
+
+      register_formatting_reference_with_default ("type_open",
+        open_formatting_reference, ref_name, default_types_open_hv,
+        types_open_hv);
+      register_formatting_reference_with_default ("type_conversion",
+        conversion_formatting_reference, ref_name,
+        default_types_conversion_hv,
+        types_conversion_hv);
+    }
+
+  default_css_string_types_conversion_hv
+     = (HV *)SvRV (default_css_string_types_conversion);
+  /* copy the normal formatting references and replace the css strings
+     specific references */
+  memcpy (&converter->css_string_types_conversion,
+          &converter->types_conversion,
+      (TXI_TREE_TYPES_NUMBER) * sizeof (FORMATTING_REFERENCE));
+
+  for (i = 0; i < TXI_TREE_TYPES_NUMBER; i++)
+    {
+      char *ref_name;
+      if (i == 0)
+        ref_name = "";
+      else
+        ref_name = type_data[i].name;
+      FORMATTING_REFERENCE *conversion_formatting_reference
+       = &converter->css_string_types_conversion[i];
+
+      register_formatting_reference_default ("css_type_conversion",
+        conversion_formatting_reference, ref_name,
+        default_css_string_types_conversion_hv);
+    }
+
+
+  FETCH(output_units_conversion)
+  output_units_conversion_hv = (HV *)SvRV (*output_units_conversion_sv);
+  default_output_units_conversion_hv
+    = (HV *)SvRV (default_output_units_conversion);
+
+  for (i = 0; i < OU_special_unit+1; i++)
+    {
+      const char *ref_name = output_unit_type_names[i];
+      FORMATTING_REFERENCE *conversion_formatting_reference
+       = &converter->output_units_conversion[i];
+
+      register_formatting_reference_with_default ("output_unit_conversion",
+        conversion_formatting_reference, ref_name,
+        default_output_units_conversion_hv,
+        output_units_conversion_hv);
+    }
+
+  if (special_unit_varieties->number > 0)
+    {
+      HV *special_unit_body_hv = 0;
+      HV *default_special_unit_body_hv;
+
+      converter->special_unit_body
+        = new_special_unit_formatting_references
+                         (special_unit_varieties->number);
+
+      FETCH(special_unit_body)
+      if (special_unit_body_sv)
+        special_unit_body_hv = (HV *)SvRV (*special_unit_body_sv);
+      default_special_unit_body_hv = (HV *)SvRV (default_special_unit_body);
+
+      for (i = 0; i < special_unit_varieties->number; i++)
+        {
+          char *variety_name = special_unit_varieties->list[i];
+          FORMATTING_REFERENCE *special_unit_body_formatting_reference
+            = &converter->special_unit_body[i];
+          register_formatting_reference_with_default ("special_unit_body",
+            special_unit_body_formatting_reference, variety_name,
+            default_special_unit_body_hv,
+            special_unit_body_hv);
+        }
+    }
+
+  FETCH(file_id_setting)
+
+  if (file_id_setting_sv)
+    {
+      HV *file_id_setting_hv = (HV *)SvRV(*file_id_setting_sv);
+      #define html_file_id_setting_name(name) \
+      {\
+        SV **name##_sv = hv_fetch (file_id_setting_hv, #name, \
+                                   strlen (#name), 0);\
+        if (name##_sv)\
+          {\
+            converter->file_id_setting_refs[FIS_##name]\
+              = (const void *) (* name##_sv);\
+            converter->file_id_setting_ref_number++; \
+          }\
+      }
+       HTML_FILE_ID_SETTING_NAMES_LIST
+      #undef html_file_id_setting_name
+    }
+
   FETCH(stage_handlers)
 
   if (stage_handlers_sv)



reply via email to

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