NeoMutt  2021-02-05-666-ge300cd
Teaching an old dog new tricks
qsort_r.h File Reference

Context-free sorting function. More...

#include <stddef.h>
+ Include dependency graph for qsort_r.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.


typedef int(* qsort_r_compar_t) (const void *a, const void *b, void *arg)


void mutt_qsort_r (void *base, size_t nmemb, size_t size, qsort_r_compar_t compar, void *arg)
 Sort an array, where the comparator has access to opaque data rather than requiring global variables. More...

Detailed Description

Context-free sorting function.

  • Eric Blake

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see

Definition in file qsort_r.h.

Typedef Documentation

◆ qsort_r_compar_t

typedef int(* qsort_r_compar_t) (const void *a, const void *b, void *arg)

Definition at line 28 of file qsort_r.h.

Function Documentation

◆ mutt_qsort_r()

void mutt_qsort_r ( void *  base,
size_t  nmemb,
size_t  size,
qsort_r_compar_t  compar,
void *  arg 

Sort an array, where the comparator has access to opaque data rather than requiring global variables.

baseStart of the array to be sorted
nmembNumber of elements in the array
sizeSize of each array element
comparComparison function, return <0/0/>0 to compare two elements
argOpaque argument to pass to compar
This implementation might not be re-entrant: signal handlers and compar must not call mutt_qsort_r().

Definition at line 68 of file qsort_r.c.

69 {
70 #ifdef HAVE_QSORT_S
71  /* FreeBSD 13, where qsort_r had incompatible signature but qsort_s works */
72  qsort_s(base, nmemb, size, compar, arg);
73 #elif defined(HAVE_QSORT_R)
74  /* glibc, POSIX ( */
75  qsort_r(base, nmemb, size, compar, arg);
76 #else
77  /* This fallback is not re-entrant. */
78  assert((global_compar == NULL) && (global_data == NULL));
79  global_compar = compar;
80  global_data = arg;
81  qsort(base, nmemb, size, relay_compar);
82  global_compar = NULL;
83  global_data = NULL;
84 #endif
85 }
static qsort_r_compar_t global_compar
Original comparator in fallback implementation.
Definition: qsort_r.c:39
static int relay_compar(const void *a, const void *b)
Shim to pass context through to real comparator.
Definition: qsort_r.c:51
static void * global_data
Original opaque data in fallback implementation.
Definition: qsort_r.c:41
+ Here is the call graph for this function:
+ Here is the caller graph for this function: