blob: 35e51102ae99802a1aa5956704609d04d91ccf8b [file]
/* converter_types.h - declarations of types used in many places */
#ifndef CONVERTER_TYPES_H
#define CONVERTER_TYPES_H
/* Copyright 2010-2026 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
#include <stddef.h>
/* for FILE */
#include <stdio.h>
/* for iconv_t */
#include <iconv.h>
/* for enum special_unit_info_type SPECIAL_UNIT_INFO_TYPE_NR ... */
#include "html_conversion_data.h"
#include "element_types.h"
#include "command_ids.h"
#include "tree_types.h"
#include "document_types.h"
#include "option_types.h"
#include "options_data.h"
/* for interdependency with convert_to_text.h */
struct TEXT_OPTIONS;
struct C_HASHMAP;
/* formatting context flags */
#define CTXF_string 0x0001
#define CTXF_code 0x0002
enum converter_format {
COF_none = -1,
COF_html,
COF_rawtext,
COF_plaintexinfo,
};
/* for string information passing to/from perl */
enum sv_string_type {
svt_byte,
svt_dir,
svt_char,
};
enum formatting_reference_status {
FRS_status_none,
FRS_status_default_set, /* default is set, no customization (or
customization is the same as default) */
FRS_status_customization_set, /* customization is set, no default, or
not the same as default */
FRS_status_internal, /* formatting reference is not used, code in C
does the task */
FRS_status_ignored, /* explicitly ignored. Only used for
types_conversion and commands_conversion
*/
};
enum command_type_variety {
CTV_type_none,
CTV_type_command,
CTV_type_type,
};
/* for style commands up to STYLE_COMMAND_CONTEXT_NR and for
no args commands up to NO_ARG_COMMAND_CONTEXT_NR */
#define HCC_CONTEXT_TYPES_LIST \
cctx_type(normal) \
cctx_type(preformatted) \
cctx_type(string) \
cctx_type(css_string) \
cctx_type(code) \
cctx_type(math)
enum conversion_context {
#define cctx_type(name) HCC_type_## name,
HCC_CONTEXT_TYPES_LIST
#undef cctx_type
};
#define STYLE_COMMAND_CONTEXT_NR HCC_type_preformatted +1
#define NO_ARG_COMMAND_CONTEXT_NR HCC_type_css_string +1
enum special_target_type {
ST_footnote_location,
};
enum direction_string_type {
#define tds_type(name) TDS_type_ ## name,
TDS_TRANSLATED_TYPES_LIST
TDS_NON_TRANSLATED_TYPES_LIST
#undef tds_type
};
/* used both for direction strings and special unit info text */
enum direction_string_context {
TDS_context_normal,
TDS_context_string,
};
#define HTML_FILE_ID_SETTING_NAMES_LIST \
html_file_id_setting_name(external_target_non_split_name) \
html_file_id_setting_name(external_target_split_name)\
html_file_id_setting_name(label_target_name) \
html_file_id_setting_name(node_file_name)\
html_file_id_setting_name(redirection_file_names)\
html_file_id_setting_name(sectioning_command_target_name)\
html_file_id_setting_name(special_unit_target_file_name) \
html_file_id_setting_name(unit_file_name)
enum html_file_id_setting {
#define html_file_id_setting_name(name) FIS_## name,
HTML_FILE_ID_SETTING_NAMES_LIST
#undef html_file_id_setting_name
};
/* %default_formatting_references in Texinfo::HTML */
#define HTML_FORMATTING_REFERENCES_LIST \
html_fr_reference(format_begin_file) \
html_fr_reference(format_button) \
html_fr_reference(format_button_icon_img) \
html_fr_reference(format_css_lines) \
html_fr_reference(format_comment) \
html_fr_reference(format_contents) \
html_fr_reference(format_element_header) \
html_fr_reference(format_element_footer) \
html_fr_reference(format_end_file) \
html_fr_reference(format_footnotes_segment) \
html_fr_reference(format_footnotes_sequence) \
html_fr_reference(format_single_footnote) \
html_fr_reference(format_heading_text) \
html_fr_reference(format_navigation_header) \
html_fr_reference(format_navigation_panel) \
html_fr_reference(format_node_redirection_page) \
html_fr_reference(format_program_string) \
html_fr_reference(format_protect_text) \
html_fr_reference(format_separate_anchor) \
html_fr_reference(format_titlepage) \
html_fr_reference(format_title_titlepage) \
html_fr_reference(format_translate_message)
enum html_formatting_reference {
#define html_fr_reference(name) FR_## name,
HTML_FORMATTING_REFERENCES_LIST
#undef html_fr_reference
};
#define HTML_ARGUMENTS_FORMATTED_FORMAT_TYPE \
html_aft_type(none) \
html_aft_type(normal) \
html_aft_type(string) \
html_aft_type(monospace) \
html_aft_type(monospacetext) \
html_aft_type(monospacestring) \
html_aft_type(filenametext) \
html_aft_type(url) \
html_aft_type(raw)
enum html_argument_formatting_type {
#define html_aft_type(name) AFT_type_##name,
HTML_ARGUMENTS_FORMATTED_FORMAT_TYPE
#undef html_aft_type
};
enum html_special_character {
SC_paragraph_symbol,
SC_left_quote,
SC_right_quote,
SC_bullet,
SC_non_breaking_space,
};
enum htmlxref_split_type {
htmlxref_split_type_none = -1,
htmlxref_split_type_mono,
htmlxref_split_type_node,
htmlxref_split_type_section,
htmlxref_split_type_chapter,
};
#define HTML_STAGE_HANDLER_STAGE_TYPE \
html_hsht_type(setup) \
html_hsht_type(structure) \
html_hsht_type(init) \
html_hsht_type(finish)
enum html_stage_handler_stage_type {
HSHT_type_none = -1,
#define html_hsht_type(name) HSHT_type_##name,
HTML_STAGE_HANDLER_STAGE_TYPE
#undef html_hsht_type
};
/* either a type or a command id */
typedef struct {
enum command_type_variety variety;
union {
enum command_id cmd;
enum element_type type;
} ct;
} COMMAND_OR_TYPE;
typedef struct {
COMMAND_OR_TYPE *stack;
size_t top; /* One above last pushed. */
size_t space;
} COMMAND_OR_TYPE_STACK;
typedef struct {
char **stack;
size_t top; /* One above last pushed. */
size_t space;
} STRING_STACK;
typedef struct {
int *stack;
size_t top; /* One above last pushed. */
size_t space;
} INTEGER_STACK;
/* an element in C, and/or a reference to an external language (Perl)
for stack functions called from outside of the C converter */
typedef struct ELEMENT_REFERENCE {
const ELEMENT *element;
/* perl element. This should be HV *hv,
but we don't want to include the Perl headers everywhere; */
const void *hv;
} ELEMENT_REFERENCE;
typedef struct ELEMENT_REFERENCE_STACK {
ELEMENT_REFERENCE *stack;
size_t top;
size_t space;
} ELEMENT_REFERENCE_STACK;
typedef struct FILE_NUMBER_NAME {
size_t file_number;
const char *filename;
} FILE_NUMBER_NAME;
typedef struct VARIETY_DIRECTION_INDEX {
char *special_unit_variety;
int direction_index;
} VARIETY_DIRECTION_INDEX;
typedef struct HTML_TARGET {
const ELEMENT *element;
char *target;
char *special_unit_filename;
char *node_filename;
char *section_filename;
char *contents_target;
char *shortcontents_target;
char *command_text[HTT_string_nonumber+1];
char *command_description[HTT_string_nonumber+1];
char *command_name[HTT_string_nonumber+1];
TREE_ADDED_ELEMENTS tree;
TREE_ADDED_ELEMENTS tree_nonumber;
TREE_ADDED_ELEMENTS name_tree;
TREE_ADDED_ELEMENTS name_tree_nonumber;
FILE_NUMBER_NAME file_number_name;
int filename_set;
const ELEMENT *root_element_command;
int root_element_command_set;
const ELEMENT *node_command;
int node_command_set;
int formatted_nodedescription_nr;
} HTML_TARGET;
typedef struct HTML_TARGET_LIST {
size_t number;
size_t space;
HTML_TARGET *list;
} HTML_TARGET_LIST;
typedef struct EXPLAINED_COMMAND_TYPE {
enum command_id cmd;
char *type;
char *explanation;
} EXPLAINED_COMMAND_TYPE;
typedef struct EXPLAINED_COMMAND_TYPE_LIST {
size_t number;
size_t space;
EXPLAINED_COMMAND_TYPE *list;
} EXPLAINED_COMMAND_TYPE_LIST;
typedef struct FOOTNOTE_ID_NUMBER {
const char *footnote_id;
int number;
} FOOTNOTE_ID_NUMBER;
typedef struct ELEMENT_REFERENCE_STACK_STACK {
ELEMENT_REFERENCE_STACK **stack;
size_t top;
size_t space;
} ELEMENT_REFERENCE_STACK_STACK;
typedef struct HTML_SHARED_CONVERSION_STATE {
int in_skipped_node_top;
EXPLAINED_COMMAND_TYPE_LIST explained_commands;
/* explained_commands->{char $cmdname}->{char $normalized_type}
= explanation */
int footnote_number;
FOOTNOTE_ID_NUMBER *footnote_id_numbers; /* footnote_id_numbers->{char $footid} = int */
int html_menu_entry_index;
int **formatted_index_entries; /* formatted_index_entries->{INDEX_ENTRY $index_entry_ref} = 1, ++ */
int *formatted_listoffloats_nr;
/* stored in HTML_TARGET formatted_nodedescription_nr */
/* formatted_nodedescriptions */
ELEMENT_REFERENCE_STACK_STACK elements_authors;
} HTML_SHARED_CONVERSION_STATE;
typedef struct HTML_NO_ARG_COMMAND_CONVERSION {
char *element;
int unset;
char *text;
char *translated_converted;
} HTML_NO_ARG_COMMAND_CONVERSION;
typedef struct HTML_NO_ARG_COMMAND_FORMATTING {
HTML_NO_ARG_COMMAND_CONVERSION context_formatting[NO_ARG_COMMAND_CONTEXT_NR];
char *translated_to_convert;
ELEMENT *translated_tree;
} HTML_NO_ARG_COMMAND_FORMATTING;
typedef struct HTML_NO_ARG_COMMAND_CUSTOMIZATION {
HTML_NO_ARG_COMMAND_CONVERSION *context_formatting[NO_ARG_COMMAND_CONTEXT_NR];
char *translated_to_convert;
} HTML_NO_ARG_COMMAND_CUSTOMIZATION;
typedef struct HTML_STYLE_COMMAND_CONVERSION {
char *element;
int quote;
} HTML_STYLE_COMMAND_CONVERSION;
typedef struct COMMAND_HTML_STYLE_COMMAND_CONVERSION {
enum command_id cmd;
HTML_STYLE_COMMAND_CONVERSION *conversion[STYLE_COMMAND_CONTEXT_NR];
} COMMAND_HTML_STYLE_COMMAND_CONVERSION;
typedef struct HTML_DIRECTION_STRING_TRANSLATED {
char *to_convert;
char *converted[TDS_context_string +1];
} HTML_DIRECTION_STRING_TRANSLATED;
typedef struct COMMAND_ID_LIST {
size_t number;
enum command_id *list;
} COMMAND_ID_LIST;
typedef struct ARRAY_INDEX_LIST {
size_t number;
size_t *list;
} ARRAY_INDEX_LIST;
typedef struct CSS_LIST {
/* 0 if associated to output units and found by number */
char *page_name;
size_t number;
size_t space;
char **list;
} CSS_LIST;
typedef struct PAGES_CSS_LIST {
size_t number;
size_t space;
CSS_LIST *list; /* index 0 is for document_global_context_css
others for the output files */
} PAGES_CSS_LIST;
typedef struct COMMAND_ID_INDEX {
enum command_id cmd;
size_t index;
} COMMAND_ID_INDEX;
typedef struct TRANSLATED_COMMAND {
enum command_id cmd;
char *translation;
} TRANSLATED_COMMAND;
typedef struct TRANSLATED_COMMAND_LIST {
size_t number;
size_t space;
TRANSLATED_COMMAND *list;
} TRANSLATED_COMMAND_LIST;
typedef struct COMMAND_INTEGER_INFORMATION {
enum command_id cmd;
int integer;
} COMMAND_INTEGER_INFORMATION;
typedef struct TYPE_INTEGER_INFORMATION {
enum element_type type;
int integer;
} TYPE_INTEGER_INFORMATION;
typedef struct FILE_NAME_PATH_COUNTER {
char *filename;
char *normalized_filename;
char *filepath;
int counter;
int elements_in_file_count; /* only used in HTML, corresponds to
'elements_in_file_count' */
TEXT body; /* file body output, used for HTML */
const OUTPUT_UNIT *first_unit;
} FILE_NAME_PATH_COUNTER;
typedef struct FILE_NAME_PATH_COUNTER_LIST {
size_t number;
size_t space;
FILE_NAME_PATH_COUNTER *list;
} FILE_NAME_PATH_COUNTER_LIST;
typedef struct FILE_STREAM {
char *file_path;
FILE *stream;
/* actually PerlIO */
void *io;
} FILE_STREAM;
typedef struct FILE_STREAM_LIST {
size_t number;
size_t space;
FILE_STREAM *list;
} FILE_STREAM_LIST;
typedef struct OUTPUT_FILES_INFORMATION {
STRING_LIST opened_files;
FILE_STREAM_LIST unclosed_files;
} OUTPUT_FILES_INFORMATION;
typedef struct FILE_SOURCE_INFO {
char *filename;
const char *type;
const char *name;
const ELEMENT *element;
char *path;
} FILE_SOURCE_INFO;
typedef struct FILE_SOURCE_INFO_LIST {
size_t number;
size_t space;
FILE_SOURCE_INFO *list;
} FILE_SOURCE_INFO_LIST;
typedef struct SPECIAL_UNIT_DIRECTION {
const OUTPUT_UNIT *output_unit;
const char *direction;
} SPECIAL_UNIT_DIRECTION;
typedef struct SPECIAL_UNIT_DIRECTION_LIST {
size_t number;
SPECIAL_UNIT_DIRECTION *list;
} SPECIAL_UNIT_DIRECTION_LIST;
typedef struct DIRECTION_NODE_NAME {
char *direction;
char *node_name;
size_t direction_nr;
} DIRECTION_NODE_NAME;
typedef struct DIRECTION_NODE_NAME_LIST {
size_t number;
DIRECTION_NODE_NAME *list;
} DIRECTION_NODE_NAME_LIST;
typedef struct FORMATTING_REFERENCE {
/* perl references. This should be SV *sv_*,
but we don't want to include the Perl headers everywhere; */
void *sv_reference;
void *sv_default;
enum formatting_reference_status status;
} FORMATTING_REFERENCE;
typedef struct HTML_FORMATTING_CONTEXT {
char *context_name;
int preformatted_number;
int paragraph_number;
int upper_case_ctx;
int space_protected;
int no_break;
} HTML_FORMATTING_CONTEXT;
typedef struct HTML_FORMATTING_CONTEXT_STACK {
HTML_FORMATTING_CONTEXT *stack;
size_t top; /* One above last pushed context. */
size_t space;
} HTML_FORMATTING_CONTEXT_STACK;
typedef struct HTML_DOCUMENT_CONTEXT {
char *context;
int string_ctx;
int raw_ctx;
int verbatim_ctx;
int math_ctx;
int inside_preformatted;
char *document_global_context;
INTEGER_STACK monospace;
INTEGER_STACK preformatted_context;
COMMAND_OR_TYPE_STACK composition_context;
COMMAND_STACK block_commands;
HTML_FORMATTING_CONTEXT_STACK formatting_context;
COMMAND_OR_TYPE_STACK preformatted_classes;
} HTML_DOCUMENT_CONTEXT;
typedef struct HTML_DOCUMENT_CONTEXT_STACK {
HTML_DOCUMENT_CONTEXT *stack;
size_t top; /* One above last pushed context. */
size_t space;
} HTML_DOCUMENT_CONTEXT_STACK;
typedef struct FIXED_STRING_WITH_LEN {
const char *string;
size_t len;
} FIXED_STRING_WITH_LEN;
typedef struct CSS_SELECTOR_STYLE {
char *selector;
char *style;
} CSS_SELECTOR_STYLE;
typedef struct CSS_SELECTOR_STYLE_LIST {
size_t number;
size_t space;
CSS_SELECTOR_STYLE *list;
} CSS_SELECTOR_STYLE_LIST;
/* we have a circular reference with TYPE_CONVERSION_FUNCTION
and CONVERTER and with COMMAND_CONVERSION_FUNCTION and CONVERTER */
struct CONVERTER;
typedef struct TYPE_CONVERSION_FUNCTION {
enum formatting_reference_status status;
/* points to the perl formatting reference if it is used for
conversion */
FORMATTING_REFERENCE *formatting_reference;
/* the function used for conversion, either a function that calls
the perl function in formatting_reference, or another C function */
void (* type_conversion) (struct CONVERTER *self, const enum element_type type,
const ELEMENT *element, const char *content,
TEXT *text);
} TYPE_CONVERSION_FUNCTION;
typedef struct TYPE_OPEN_FUNCTION {
enum formatting_reference_status status;
/* points to the perl formatting reference if it is used for
conversion */
FORMATTING_REFERENCE *formatting_reference;
/* the function used for conversion, either a function that calls
the perl function in formatting_reference, or another C function */
void (* type_open) (struct CONVERTER *self, const enum element_type type,
const ELEMENT *element, TEXT *text);
} TYPE_OPEN_FUNCTION;
typedef struct HTML_ARG_FORMATTED {
const ELEMENT *arg_tree;
char *formatted[AFT_type_raw+1];
} HTML_ARG_FORMATTED;
typedef struct HTML_ARGS_FORMATTED {
size_t number;
HTML_ARG_FORMATTED *args;
} HTML_ARGS_FORMATTED;
typedef struct ACCENT_ENTITY_INFO {
char *entity;
char *characters;
} ACCENT_ENTITY_INFO;
typedef struct COMMAND_ACCENT_ENTITY_INFO {
enum command_id cmd;
ACCENT_ENTITY_INFO accent_entity_info;
} COMMAND_ACCENT_ENTITY_INFO;
typedef struct COMMAND_CONVERSION_FUNCTION {
enum formatting_reference_status status;
/* points to the perl formatting reference if it is used for
conversion */
FORMATTING_REFERENCE *formatting_reference;
/* the function used for conversion, either a function that calls
the perl function in formatting_reference, or another C function */
void (* command_conversion) (struct CONVERTER *self,
const enum command_id cmd,
const ELEMENT *element,
const HTML_ARGS_FORMATTED *args_formatted,
const char *content, TEXT *result);
} COMMAND_CONVERSION_FUNCTION;
typedef struct COMMAND_OPEN_FUNCTION {
enum formatting_reference_status status;
/* points to the perl formatting reference if it is used for
conversion */
FORMATTING_REFERENCE *formatting_reference;
/* the function used for conversion, either a function that calls
the perl function in formatting_reference, or another C function */
void (* command_open) (struct CONVERTER *self, const enum command_id cmd,
const ELEMENT *element, TEXT *result);
} COMMAND_OPEN_FUNCTION;
typedef struct OUTPUT_UNIT_CONVERSION_FUNCTION {
enum formatting_reference_status status;
/* points to the perl formatting reference if it is used for
conversion */
FORMATTING_REFERENCE *formatting_reference;
/* the function used for conversion, either a function that calls
the perl function in formatting_reference, or another C function */
void (* output_unit_conversion) (struct CONVERTER *self,
const enum output_unit_type unit_type,
const OUTPUT_UNIT *output_unit, const char *content,
TEXT *result);
} OUTPUT_UNIT_CONVERSION_FUNCTION;
typedef struct SPECIAL_UNIT_BODY_FORMATTING {
enum formatting_reference_status status;
/* points to the perl formatting reference if it is used for
conversion */
FORMATTING_REFERENCE *formatting_reference;
/* the function used for conversion, either a function that calls
the perl function in formatting_reference, or another C function */
void (* special_unit_body_formatting) (struct CONVERTER *self,
const size_t special_unit_number, const char *special_unit_variety,
const OUTPUT_UNIT *output_unit,
TEXT *result);
} SPECIAL_UNIT_BODY_FORMATTING;
typedef struct HTML_PENDING_FOOTNOTE {
const ELEMENT *command;
char *footid;
char *docid;
int number_in_doc;
char *footnote_location_filename;
char *multi_expanded_region;
} HTML_PENDING_FOOTNOTE;
typedef struct HTML_PENDING_FOOTNOTE_STACK {
size_t top;
size_t space;
HTML_PENDING_FOOTNOTE **stack;
} HTML_PENDING_FOOTNOTE_STACK;
typedef struct HTML_INLINE_CONTENT {
char *category;
char *string;
} HTML_INLINE_CONTENT;
typedef struct HTML_INLINE_CONTENT_STACK {
size_t top;
size_t space;
HTML_INLINE_CONTENT *stack;
} HTML_INLINE_CONTENT_STACK;
/* there should be either a pointer to a C tree element in element,
if set from C, or a reference to a Perl tree element in sv, if set
from Perl */
typedef struct HTML_ASSOCIATED_INLINE_CONTENT {
const ELEMENT *element;
/* Perl element. This should be HV *hv,
but we don't want to include the Perl headers everywhere; */
const void *hv;
TEXT inline_content;
} HTML_ASSOCIATED_INLINE_CONTENT;
typedef struct HTML_ASSOCIATED_INLINE_CONTENT_LIST {
size_t number;
size_t space;
HTML_ASSOCIATED_INLINE_CONTENT *list;
} HTML_ASSOCIATED_INLINE_CONTENT_LIST;
typedef struct HTMLXREF_MANUAL {
char *manual;
char *urlprefix[htmlxref_split_type_chapter +1];
} HTMLXREF_MANUAL;
typedef struct HTMLXREF_MANUAL_LIST {
size_t number;
size_t space;
HTMLXREF_MANUAL *list;
} HTMLXREF_MANUAL_LIST;
typedef struct ASSOCIATED_INFO_LIST {
size_t number;
ASSOCIATED_INFO *list;
} ASSOCIATED_INFO_LIST;
typedef struct STRING_STACK_LIST {
size_t number;
size_t space;
STRING_STACK *list;
} STRING_STACK_LIST;
typedef struct JSLICENSE_FILE_INFO {
char *filename;
char *license;
char *url;
char *source;
} JSLICENSE_FILE_INFO;
typedef struct JSLICENSE_FILE_INFO_LIST {
char *category;
size_t number;
JSLICENSE_FILE_INFO *list;
} JSLICENSE_FILE_INFO_LIST;
typedef struct JSLICENSE_CATEGORY_LIST {
size_t number;
JSLICENSE_FILE_INFO_LIST *list;
} JSLICENSE_CATEGORY_LIST;
/* contains only indices with entries */
typedef struct SORTED_INDEX_NAMES {
size_t number;
size_t space;
const INDEX **list;
} SORTED_INDEX_NAMES;
typedef struct FILE_INFO_KEY_PAIR {
const char *key;
int integer;
} FILE_INFO_KEY_PAIR;
typedef struct FILE_ASSOCIATED_INFO {
size_t info_number;
size_t info_space;
FILE_INFO_KEY_PAIR *info;
} FILE_ASSOCIATED_INFO;
typedef struct FILE_ASSOCIATED_INFO_LIST {
size_t number;
FILE_ASSOCIATED_INFO *list;
} FILE_ASSOCIATED_INFO_LIST;
typedef struct HTML_STAGE_HANDLER_INFO {
/* Perl function reference */
void *sv;
char *priority;
} HTML_STAGE_HANDLER_INFO;
typedef struct HTML_STAGE_HANDLER_INFO_LIST {
size_t number;
HTML_STAGE_HANDLER_INFO *list;
} HTML_STAGE_HANDLER_INFO_LIST;
typedef struct SPECIAL_UNIT_INFO {
int type;
size_t variety_nr;
char *value;
} SPECIAL_UNIT_INFO;
typedef struct SPECIAL_UNIT_INFO_LIST {
size_t number;
size_t space;
SPECIAL_UNIT_INFO *list;
} SPECIAL_UNIT_INFO_LIST;
typedef struct PRE_CLASS_TYPE_INFO {
enum element_type type;
char *pre_class;
} PRE_CLASS_TYPE_INFO;
typedef struct DEPRECATED_DIR_INFO {
char *reference_dir;
char *obsolete_dir;
} DEPRECATED_DIR_INFO;
typedef struct DEPRECATED_DIRS_LIST {
size_t space;
size_t number;
DEPRECATED_DIR_INFO *list;
} DEPRECATED_DIRS_LIST;
/* information on converter configuration from a source of configuration
(either output format or user customization) */
typedef struct CONVERTER_INITIALIZATION_INFO {
TRANSLATED_COMMAND_LIST translated_commands;
OPTIONS_LIST conf;
DEPRECATED_DIRS_LIST deprecated_config_directories;
/* gather strings that are not customization options */
STRING_LIST non_valid_customization;
} CONVERTER_INITIALIZATION_INFO;
typedef struct CONVERTER {
int converter_descriptor;
/* perl converter. This should be SV *sv,
but we don't want to include the Perl headers everywhere; */
void *sv;
/* this is the type of the converter, not of the output. (Similar to
a module name in Perl). Should only be used to determine which
functions are to be called */
enum converter_format format;
/* used to pass converter_defaults result, if going through XS and
destroyed shortly after */
CONVERTER_INITIALIZATION_INFO *format_defaults;
OPTIONS *conf;
/* an array containing the fields of conf ordered by name */
OPTION **sorted_options;
/* set to commands user defined from customization in generic converter
during converter initialization, or reset and set to each of
the commands values just before starting the conversion in HTML */
COMMAND_OPTION_VALUE commands_init_conf[BUILTIN_CMD_NUMBER];
EXPANDED_FORMAT *expanded_formats;
TRANSLATED_COMMAND_LIST translated_commands;
/* set based on documentlanguage customization option, if set,
and reset when the documentlanguage changes. Allocated
and put in the cache if the language was never seen.
*/
const LANG_TRANSLATION *current_lang_translations;
ERROR_MESSAGE_LIST error_messages;
/* for error messages registered in the converter */
STRING_LIST small_strings;
DOCUMENT *document;
/* reset in converter_set_document */
struct TEXT_OPTIONS *convert_text_options;
struct TEXT_OPTIONS *convert_index_text_options;
int upper_case[BUILTIN_CMD_NUMBER];
/* output unit files API */
/* reset for output */
FILE_NAME_PATH_COUNTER_LIST output_unit_files;
/* to find index in output_unit_files based on name */
/* reset upon allocation */
NAME_NUMBER_LIST page_name_number;
/* API to open, set encoding and register files */
OUTPUT_FILES_INFORMATION output_files_information;
/* associates deprecated directories and reference directories */
DEPRECATED_DIRS_LIST deprecated_config_directories;
INDICES_SORT_STRINGS *indices_sort_strings;
COLLATIONS_INDICES_SORTED_BY_INDEX *sorted_indices_by_index;
COLLATIONS_INDICES_SORTED_BY_LETTER *sorted_indices_by_letter;
/* HTML specific */
/* set for a converter */
int external_references_number; /* total number of external references
that could be called during conversion */
int code_types[TXI_TREE_TYPES_NUMBER];
COMMAND_INTEGER_INFORMATION *html_customized_upper_case_commands;
TYPE_INTEGER_INFORMATION *html_customized_code_types;
char *pre_class_types[TXI_TREE_TYPES_NUMBER];
ACCENT_ENTITY_INFO accent_entities[BUILTIN_CMD_NUMBER];
STRING_LIST files_css_rule_lines;
STRING_LIST files_css_import_lines;
/* perl function references. This should be SV *sv,
but we don't want to include the Perl headers everywhere; */
const void *file_id_setting_refs[FIS_unit_file_name+1];
int file_id_setting_ref_number; /* number of references actually set */
FORMATTING_REFERENCE
formatting_references[FR_format_translate_message+1];
FORMATTING_REFERENCE
css_string_formatting_references[FR_format_translate_message+1];
FORMATTING_REFERENCE commands_open[BUILTIN_CMD_NUMBER];
FORMATTING_REFERENCE commands_conversion[BUILTIN_CMD_NUMBER];
FORMATTING_REFERENCE css_string_commands_conversion[BUILTIN_CMD_NUMBER];
FORMATTING_REFERENCE types_open[TXI_TREE_TYPES_NUMBER];
FORMATTING_REFERENCE types_conversion[TXI_TREE_TYPES_NUMBER];
FORMATTING_REFERENCE css_string_types_conversion[TXI_TREE_TYPES_NUMBER];
FORMATTING_REFERENCE output_units_conversion[OU_special_unit+1];
FORMATTING_REFERENCE *special_unit_body;
STRING_LIST special_unit_varieties;
STRING_LIST customized_special_unit_varieties;
SPECIAL_UNIT_INFO_LIST customized_special_unit_info;
char **special_unit_info[SPECIAL_UNIT_INFO_TYPE_NR];
char **translated_special_unit_info_texinfo[SPECIAL_UNIT_INFO_TREE_NR];
HTMLXREF_MANUAL_LIST htmlxref;
TYPE_CONVERSION_FUNCTION type_conversion_function[TXI_TREE_TYPES_NUMBER];
TYPE_CONVERSION_FUNCTION css_string_type_conversion_function[TXI_TREE_TYPES_NUMBER];
TYPE_OPEN_FUNCTION type_open_function[TXI_TREE_TYPES_NUMBER];
COMMAND_CONVERSION_FUNCTION command_conversion_function[BUILTIN_CMD_NUMBER];
COMMAND_OPEN_FUNCTION command_open_function[BUILTIN_CMD_NUMBER];
COMMAND_CONVERSION_FUNCTION css_string_command_conversion_function[BUILTIN_CMD_NUMBER];
OUTPUT_UNIT_CONVERSION_FUNCTION output_unit_conversion_function[OU_special_unit+1];
SPECIAL_UNIT_BODY_FORMATTING *special_unit_body_formatting;
HTML_DIRECTION_STRING_TRANSLATED *translated_direction_strings[TDS_TRANSLATED_MAX_NR];
HTML_DIRECTION_STRING_TRANSLATED **customized_translated_direction_strings[TDS_TRANSLATED_MAX_NR];
HTML_STAGE_HANDLER_INFO_LIST html_stage_handlers[HSHT_type_finish +1];
HTML_NO_ARG_COMMAND_CUSTOMIZATION customized_no_arg_commands_formatting[BUILTIN_CMD_NUMBER];
char ***customized_directions_strings[(TDS_TYPE_MAX_NR) - (TDS_TRANSLATED_MAX_NR)];
PRE_CLASS_TYPE_INFO *html_customized_pre_class_types;
COMMAND_ACCENT_ENTITY_INFO *html_customized_accent_entity_info;
HTML_STYLE_COMMAND_CONVERSION html_style_command_conversion[BUILTIN_CMD_NUMBER][STYLE_COMMAND_CONTEXT_NR];
COMMAND_HTML_STYLE_COMMAND_CONVERSION *html_customized_style_commands;
/* for global directions texts, for example Space. The texts are available
at converter initialization, possibly based on customization.
The names are set when first accessed (from XS).
*/
STRING_LIST global_texts_direction_names;
const char **main_units_direction_names;
C_HASHMAP units_direction_names_index;
DIRECTION_NODE_NAME_LIST customized_global_units_directions;
STRING_LIST added_global_units_directions;
STRING_LIST customized_global_text_directions;
/* associate cmd and index in special_unit_varieties STRING_LIST */
/* number in sync with command_special_unit_variety, +1 for trailing 0 */
COMMAND_ID_INDEX command_special_variety_name_index[4+1];
/* set for a document */
/* next two set in conversion initialization */
FIXED_STRING_WITH_LEN special_character[SC_non_breaking_space+1];
FIXED_STRING_WITH_LEN line_break_element;
/* reset and set in conversion initialization, based on information
obtained at converter initialization in files_css_* */
STRING_LIST css_rule_lines;
STRING_LIST css_import_lines;
/* reset and set in conversion initialization */
CSS_SELECTOR_STYLE_LIST css_element_class_styles;
/* filled based on css_element_class_styles when needed */
STRING_LIST css_element_class_list;
/* next two reset and set in conversion initialization based on
default and customized and on special characters and similar.
*/
char ***directions_strings[TDS_TYPE_MAX_NR];
HTML_NO_ARG_COMMAND_FORMATTING html_no_arg_command_conversion[BUILTIN_CMD_NUMBER];
enum htmlxref_split_type document_htmlxref_split_type;
/* Allocated at converter initialization based on customization.
Zeroed before conversion, then filled. */
const OUTPUT_UNIT **global_units_directions;
/* reallocated and reset when set */
SPECIAL_UNIT_DIRECTION *special_units_direction_names;
/* both for global units associated to normal output units and
for special output units, sorted according to direction name */
/* free'd when global_units_directions are zeroed, set when first
accessed (from XS only) */
SPECIAL_UNIT_DIRECTION_LIST global_units_direction_names;
/* allocated at converter initialization, reset when translate_names
is called or at the end of the conversion */
ELEMENT **translated_special_unit_info_tree[SUIT_type_heading+1];
/* resized and reset at the beginning of the conversion */
SORTED_INDEX_NAMES sorted_index_names;
/* set or reset before conversion */
void *registered_ids_c_hashmap;
/* potentially one target list per command (only for some actually,
registered in html_target_cmds */
/* reset in conversion initialization. The trees are also free'd after
the conversion, to avoid having trees to build at that point.
*/
HTML_TARGET_LIST html_targets[BUILTIN_CMD_NUMBER];
HTML_TARGET_LIST html_special_targets[ST_footnote_location+1];
/* list of cmd with targets that have been allocated */
COMMAND_STACK html_target_cmds;
/* reset before conversion before being filled */
FILE_SOURCE_INFO_LIST files_source_info;
/* reset in conversion initialization */
JSLICENSE_CATEGORY_LIST jslicenses;
size_t *output_unit_file_indices; /* array of indices in output_unit_files
each position corresponding to an output unit. */
size_t *special_unit_file_indices; /* same for special output units */
/* Next are in converter_info in Perl. Reset in conversion initialization */
char *title_titlepage;
ELEMENT *simpletitle_tree;
enum command_id simpletitle_cmd;
ELEMENT *title_tree;
char *title_string;
char *documentdescription_string;
char *copying_comment;
char *documentinfo_metadata;
char *destination_directory;
char *document_name;
/* for user-defined translations */
/* reset before conversion */
LANG_TRANSLATION **translation_cache;
/* set for a document only in C */
/* output units lists descriptors for output units lists associated
to the converter, stored in document.
In Perl the output units lists are directly associated
to the converter. */
size_t output_units_descriptors[OUDT_external_nodes_units+1];
/* state only in C converter */
unsigned long modified_state; /* specifies which perl state to rebuild */
ELEMENT_LIST tree_to_build; /* C trees that needs to be built to perl
before calling perl functions on it */
COMMAND_ID_LIST no_arg_formatted_cmd_translated; /* list of commands that
were translated and need to be passed back to perl */
/* next 4 allow to switch from normal HTML formatting to css strings
formatting */
FORMATTING_REFERENCE *current_formatting_references;
TYPE_CONVERSION_FUNCTION *current_types_conversion_function;
COMMAND_CONVERSION_FUNCTION *current_commands_conversion_function;
void (* current_format_protect_text) (const char *text, TEXT *result);
int added_title_tree;
/* reset and set at the beginning of conversion */
char *date_in_header;
/* next two reset and set based on conf before starting the conversion */
char **html_active_icons;
char **html_passive_icons;
/* state common with perl converter */
int document_global_context_counter;
const ELEMENT *current_root_command;
const ELEMENT *current_node;
/* unset right after an output unit conversion */
const OUTPUT_UNIT *current_output_unit;
HTML_DOCUMENT_CONTEXT_STACK html_document_context;
STRING_STACK multiple_pass;
/* allocated or resized if needed when setting up page files.
should be empty at the end of conversion, if not there is an
error message output and it is cleared */
STRING_STACK_LIST pending_closes;
/* reset after the conversion and each time it is set outside
of the conversion. Also reset before calling output
(although it is not needed) */
FILE_NUMBER_NAME current_filename;
ELEMENT_REFERENCE_STACK referred_command_stack;
/* next three reset both in conversion initialization and finalization */
HTML_SHARED_CONVERSION_STATE shared_conversion_state;
HTML_INLINE_CONTENT_STACK pending_inline_content;
HTML_PENDING_FOOTNOTE_STACK pending_footnotes;
/* checked to be empty and reset if not in conversion finalization */
HTML_ASSOCIATED_INLINE_CONTENT_LIST associated_inline_content;
/* reset in conversion initialization, resized and zeroed when the
number of output units associated files are known. */
PAGES_CSS_LIST page_css;
/* reset at conversion initialization */
STRING_LIST check_htmlxref_already_warned;
FILE_ASSOCIATED_INFO_LIST html_files_information;
/* state common with perl converter, not transmitted to perl */
int use_unicode_text;
/* used to cache information passed to Perl, corresponding to
document and converter_info. Actually reference to the corresponding
Perl objects as setup at initialization, kept here to be sure that
they do not change even if later on another object is passed.
*/
void *pl_info_hv; /* converter->{'converter_info'} */
} CONVERTER;
typedef struct TRANSLATED_SUI_ASSOCIATION {
enum special_unit_info_tree tree_type;
enum special_unit_info_type string_type;
} TRANSLATED_SUI_ASSOCIATION;
/* following types used in several converter codes, but not in this file */
typedef struct TARGET_FILENAME {
char *target;
char *filename;
const char *extension;
} TARGET_FILENAME;
typedef struct TARGET_CONTENTS_FILENAME {
char *target;
char *filename;
char *target_contents;
char *target_shortcontents;
} TARGET_CONTENTS_FILENAME;
typedef struct FILE_NAME_PATH {
char *filename;
char *filepath;
} FILE_NAME_PATH;
typedef struct TARGET_DIRECTORY_FILENAME {
char *filename;
char *directory;
char *target;
} TARGET_DIRECTORY_FILENAME;
typedef struct ENCODING_CONVERSION {
char *encoding_name;
iconv_t iconv;
} ENCODING_CONVERSION;
typedef struct OUTPUT_TEXT_FILES_INFO {
OUTPUT_FILES_INFORMATION *output_files_information;
char *text;
} OUTPUT_TEXT_FILES_INFO;
typedef struct CONVERTER_TEXT_INFO {
CONVERTER *converter;
char *text;
} CONVERTER_TEXT_INFO;
#endif