mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 18:38:08 +01:00
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:
parent
356ad39271
commit
4f82acce17
1 changed files with 5 additions and 1 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue