The algorithm used to sort index elements is 'qsort', which is unstable, which means the output from makeinfo is non-deterministic. The following patch addresses the issue (assuming not more than 1 index entry is allowed per line.)
Apart from the inherent desirability of having a deterministic tool, the non-deterministic approach can lead to duplicated index items for the same node if these index items are made non-adjacent during the search.
When this occurs the netry is not detected as duplicate in the make_index_entries_unique function.
Thanks,
Benno
diff --git a/makeinfo/index.c b/makeinfo/index.c index 65d7484..b34025c 100644 --- a/makeinfo/index.c
+++ b/makeinfo/index.c @@ -505,10 +505,23 @@ cm_tindex (void) /* Data Type index. */ static int index_element_compare (const void *element1, const void *element2) { + int cmp; INDEX_ELT **elt1 = (INDEX_ELT **) element1;
INDEX_ELT **elt2 = (INDEX_ELT **) element2;
- return index_compare_fn ((*elt1)->entry, (*elt2)->entry); + cmp = index_compare_fn ((*elt1)->entry, (*elt2)->entry); + if (cmp != 0) + {
+ return cmp; + } + /* entries are equal, should compare node names */ + cmp = index_compare_fn ((*elt1)->node, (*elt2)->node); + if (cmp != 0) + { + return cmp; + } + /* entries and nodes are equal, finally compare by line number */
+ return (*elt1)->defining_line - (*elt2)->defining_line; }