* 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);