* tta/C/main/targets.c: move find_identifier_target code up. * tta/C/main/targets.c (add_element_to_identifiers_target): inline add_target_in_identifiers_target, minor changes in code. Remove add_target_in_identifiers_target. * tta/C/main/targets.c (register_label_element): use DOCUMENT in argument. Update caller. * tta/C/main/targets.c (register_label_element) (add_element_to_identifiers_target): set F_DOCM_labels_list in modified information in register_label_element where the labels list is actually modified. * tta/C/main/targets.c (register_label_in_list), tta/C/parsetexi/labels.c (check_register_target_element_label): merge code from register_label in label.c to register_label_in_list in targets.c and use register_label_in_list in check_register_target_element_label. Remove register_label. * tta/C/parsetexi/labels.c (set_labels_identifiers_target): separate a first loop to determine if there is any non NULL identifier and initialize hashmap.
diff --git a/ChangeLog b/ChangeLog index 11dbe3d..bcc015e 100644 --- a/ChangeLog +++ b/ChangeLog
@@ -1,5 +1,31 @@ 2025-04-06 Patrice Dumas <pertusus@free.fr> + * tta/C/main/targets.c: move find_identifier_target code up. + + * tta/C/main/targets.c (add_element_to_identifiers_target): inline + add_target_in_identifiers_target, minor changes in code. Remove + add_target_in_identifiers_target. + + * tta/C/main/targets.c (register_label_element): use DOCUMENT in + argument. Update caller. + + * tta/C/main/targets.c (register_label_element) + (add_element_to_identifiers_target): set F_DOCM_labels_list in + modified information in register_label_element where the labels list + is actually modified. + + * tta/C/main/targets.c (register_label_in_list), + tta/C/parsetexi/labels.c (check_register_target_element_label): merge + code from register_label in label.c to register_label_in_list in + targets.c and use register_label_in_list in + check_register_target_element_label. Remove register_label. + + * tta/C/parsetexi/labels.c (set_labels_identifiers_target): separate a + first loop to determine if there is any non NULL identifier and + initialize hashmap. + +2025-04-06 Patrice Dumas <pertusus@free.fr> + * tta/C/main/build_perl_info.c (build_identifiers_target): move variables definition up. @@ -45,7 +71,7 @@ identifiers_target_number_l, find_identifier_target_l, add_target_in_identifiers_target_l and set_labels_identifiers_target_l. Remove now unused compare_targets and - sort_labels_identifiers_target. + sort_labels_identifiers_target. 2025-04-05 Patrice Dumas <pertusus@free.fr> @@ -525,7 +551,7 @@ tta/perl/Texinfo/Convert/DocBook.pm (%defaults), tta/perl/Texinfo/Convert/IXINSXML.pm (%defaults), tta/perl/Texinfo/Convert/LaTeX.pm (%defaults), - tta/perl/Texinfo/Convert/Plaintext.pm (%defaults), + tta/perl/Texinfo/Convert/Plaintext.pm (%defaults), tta/perl/Texinfo/Convert/TexinfoSXML.pm (%defaults), tta/perl/Texinfo/Convert/TexinfoXML.pm (%defaults): remove default documentlanguage setting to undef, as it is the default everywhere. @@ -635,7 +661,7 @@ 2025-03-27 Patrice Dumas <pertusus@free.fr> - * tta/C/main/manipulate_tree.c (itemize_item_prepended_element), + * tta/C/main/manipulate_tree.c (itemize_item_prepended_element), tta/perl/Texinfo/Common.pm (itemize_item_prepended_element: rename itemize_block_line_argument_command as itemize_item_prepended_element. Rename associated variables. Update callers. @@ -723,7 +749,7 @@ tta/perl/Texinfo/Common.pm (find_float_caption_shortcaption): add to find caption and shortcaption of float based on tree information. - * tta/C/convert/format_html.c (html_convert_listoffloats_command), + * tta/C/convert/format_html.c (html_convert_listoffloats_command), tta/perl/Texinfo/Convert/Converter.pm (float_name_caption), tta/C/convert/converter.c (float_name_caption), tta/C/main/floats.c (print_listoffloats_types), tta/perl/Texinfo/Convert/HTML.pm @@ -1818,7 +1844,7 @@ * tta/perl/Makefile.tres, tta/perl/t/30sectioning.t (automatic_menu_with_heading), tta/perl/t/html_tests.t (heading_node_after_chap, headings_nodes_before_chapter) - (node_heading_between, heading_between): tests of @*heading and + (node_heading_between, heading_between): tests of @*heading and splitting and automatic menus. Mainly from Gavin. * tta/perl/t/test_utils.pl (test): use is_diff instead of is for
diff --git a/tta/C/main/targets.c b/tta/C/main/targets.c index ce0bbee..b90d311 100644 --- a/tta/C/main/targets.c +++ b/tta/C/main/targets.c
@@ -45,6 +45,20 @@ return 0; } +ELEMENT * +find_identifier_target (const struct C_HASHMAP *identifiers_target, + const char *normalized) +{ + int found; + ELEMENT *result; + + /* discard const */ + result = (ELEMENT *)c_hashmap_value (identifiers_target, normalized, &found); + + return result; +} + +/* unused */ int compare_labels (const void *a, const void *b) { @@ -68,60 +82,59 @@ return 1; } -static void +void register_label_in_list (LABEL_LIST *labels_list, ELEMENT *element, - char *normalized) + const char *normalized) { - size_t labels_number = labels_list->number; - if (labels_number == labels_list->space) + LABEL *label; + + if (labels_list->number == labels_list->space) { labels_list->space += 1; labels_list->space *= 1.5; labels_list->list = realloc (labels_list->list, - labels_list->space * sizeof (LABEL)); + labels_list->space * sizeof (LABEL)); if (!labels_list->list) fatal ("realloc failed"); } - labels_list->list[labels_number].element = element; - labels_list->list[labels_number].label_number = labels_number; - labels_list->list[labels_number].identifier = normalized; + label = &labels_list->list[labels_list->number]; + + label->element = element; + label->label_number = labels_list->number; + label->identifier = normalized; + label->reference = 0; + labels_list->number++; } -void -add_target_in_identifiers_target (C_HASHMAP *identifiers_target, - ELEMENT *element, char *normalized) -{ - c_hashmap_register (identifiers_target, normalized, - element); -} - /* *STATUS 0 means success, 1 or 2 means error */ -static char * +static const char * add_element_to_identifiers_target (DOCUMENT *document, ELEMENT *element, int *status) { - char *normalized = lookup_extra_string (element, AI_key_normalized); - *status = 2; + const char *normalized = lookup_extra_string (element, AI_key_normalized); + if (normalized) { C_HASHMAP *identifiers_target = &document->identifiers_target; - ELEMENT *target = find_identifier_target (identifiers_target, - normalized); + const ELEMENT *target = find_identifier_target (identifiers_target, + normalized); if (!target) { element->flags |= EF_is_target; - add_target_in_identifiers_target (identifiers_target, - element, normalized); + c_hashmap_register (identifiers_target, normalized, + element); + + document->modified_information |= F_DOCM_identifiers_target; *status = 0; - document->modified_information |= F_DOCM_labels_list - | F_DOCM_identifiers_target; - return normalized; } - *status = 1; + else + *status = 1; } + else + *status = 2; return normalized; } @@ -130,7 +143,8 @@ target element with the same normalized identifier. */ static void -existing_label_error (DOCUMENT *document, ELEMENT *element, char *normalized, +existing_label_error (const DOCUMENT *document, const ELEMENT *element, + const char *normalized, ERROR_MESSAGE_LIST *error_messages) { if (normalized && error_messages) @@ -155,32 +169,22 @@ /* return value is 1 for success, 0 for failure */ int -register_label_element (size_t document_descriptor, ELEMENT *element, +register_label_element (DOCUMENT *document, ELEMENT *element, ERROR_MESSAGE_LIST *error_messages) { int status; - DOCUMENT *document = retrieve_document (document_descriptor); - char *normalized = add_element_to_identifiers_target (document, element, - &status); + const char *normalized + = add_element_to_identifiers_target (document, element, &status); if (status) { existing_label_error (document, element, normalized, error_messages); } + register_label_in_list (&document->labels_list, element, normalized); + document->modified_information |= F_DOCM_labels_list; + return !status; } -ELEMENT * -find_identifier_target (const struct C_HASHMAP *identifiers_target, - const char *normalized) -{ - int found; - ELEMENT *result; - - /* discard const */ - result = (ELEMENT *)c_hashmap_value (identifiers_target, normalized, &found); - - return result; -}
diff --git a/tta/C/main/targets.h b/tta/C/main/targets.h index 24b862c..77e6cb7 100644 --- a/tta/C/main/targets.h +++ b/tta/C/main/targets.h
@@ -7,9 +7,10 @@ #include "tree_types.h" #include "document_types.h" -int register_label_element (size_t document_descriptor, ELEMENT *element, +void register_label_in_list (LABEL_LIST *labels_list, ELEMENT *element, + const char *normalized); +int register_label_element (DOCUMENT *document, ELEMENT *element, ERROR_MESSAGE_LIST *error_messages); -int compare_labels (const void *a, const void *b); size_t identifiers_target_number (const struct C_HASHMAP *identifiers_target); ELEMENT *find_identifier_target (const struct C_HASHMAP *identifiers_target,
diff --git a/tta/C/parsetexi/labels.c b/tta/C/parsetexi/labels.c index 59ac7f4..f6f92e8 100644 --- a/tta/C/parsetexi/labels.c +++ b/tta/C/parsetexi/labels.c
@@ -28,10 +28,10 @@ #include "hashmap.h" /* for whitespace_chars count_multibyte */ #include "utils.h" +/* for register_label_in_list */ +#include "targets.h" /* for parse_node_manual */ #include "manipulate_tree.h" -/* for compare_labels */ -#include "targets.h" #include "convert_to_texinfo.h" #include "node_name_normalization.h" #include "errors_parser.h" @@ -44,29 +44,6 @@ a reference and must be unique in the document. Corresponds to @node, @*anchor, and @float (float label corresponds to the second argument). */ void -register_label (ELEMENT *target_element, char *normalized) -{ - LABEL_LIST *labels_list = &parsed_document->labels_list; - LABEL *label; - /* register the element in the list. */ - if (labels_list->number == labels_list->space) - { - labels_list->space += 1; - labels_list->space *= 1.5; - labels_list->list = realloc (labels_list->list, - labels_list->space * sizeof (LABEL)); - if (!labels_list) - fatal ("realloc failed"); - } - label = &labels_list->list[labels_list->number]; - label->element = target_element; - label->label_number = labels_list->number; - label->identifier = normalized; - label->reference = 0; - labels_list->number++; -} - -void check_register_target_element_label (ELEMENT *label_element, ELEMENT *target_element) { @@ -102,7 +79,9 @@ add_extra_string (target_element, AI_key_normalized, normalized); } } - register_label (target_element, normalized); + + register_label_in_list (&parsed_document->labels_list, target_element, + normalized); } /* called from parser */ @@ -113,18 +92,28 @@ size_t i; size_t labels_number = labels->number; + /* determine if there is a non NULL identifier to initialize hashmap */ for (i = 0; i < labels_number; i++) { LABEL *l = &labels->list[i]; + + if (l->identifier == 0) + continue; + + init_c_hashmap (hashmap, labels_number); + break; + } + + /* process labels */ + for (; i < labels_number; i++) + { + LABEL *l = &labels->list[i]; const ELEMENT *found_element; int found; if (l->identifier == 0) continue; - if (!hashmap->arena) - init_c_hashmap (hashmap, labels_number); - found_element = c_hashmap_value (hashmap, l->identifier, &found); if (found)
diff --git a/tta/C/structuring_transfo/transformations.c b/tta/C/structuring_transfo/transformations.c index 95affad..18ecebd 100644 --- a/tta/C/structuring_transfo/transformations.c +++ b/tta/C/structuring_transfo/transformations.c
@@ -589,7 +589,6 @@ DOCUMENT *document) { const C_HASHMAP *identifiers_target = &document->identifiers_target; - size_t document_descriptor = document->descriptor; int empty_node = 0; int appended_number; int new_line_at_end = 0; @@ -715,7 +714,7 @@ add_extra_string (node, AI_key_normalized, normalized); - register_label_element (document_descriptor, node, error_messages); + register_label_element (document, node, error_messages); free (spaces_after_argument.text);