lib/string_map: simulate stable sorting

qsort(3) does not promise stability, and recent versions of glibc have
been showing more unstable behaviour [2]. Michael Gruber observed [1] test
breakage due to changing output order for message properties.

We provide a sorting order of (key,value) pairs that _looks_ stable by
breaking ties based on value if keys are equal. Internally there may
be some instability in the case of duplicate (key,value) pairs, but it
should not be observable via the iterator API.

[1]: id:CAA19uiSHjVFmwH0pMC7WwDYCOSzu3yqNbuYhu3ZMeNNRh313eA@mail.gmail.com
[2]: id:87msv3i44u.fsf@oldenburg.str.redhat.com
This commit is contained in:
David Bremner 2023-11-25 08:33:52 -04:00
parent 356ad39271
commit 4f82acce17

View file

@ -86,10 +86,14 @@ _notmuch_string_map_append (notmuch_string_map_t *map,
static int static int
cmppair (const void *pa, const void *pb) cmppair (const void *pa, const void *pb)
{ {
int cmp = 0;
notmuch_string_pair_t *a = (notmuch_string_pair_t *) pa; notmuch_string_pair_t *a = (notmuch_string_pair_t *) pa;
notmuch_string_pair_t *b = (notmuch_string_pair_t *) pb; notmuch_string_pair_t *b = (notmuch_string_pair_t *) pb;
return strcmp (a->key, b->key); cmp = strcmp (a->key, b->key);
if (cmp == 0)
cmp = strcmp (a->value, b->value);
return cmp;
} }
static void static void