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

Context-free sorting function. More...

#include "config.h"
#include <stddef.h>
#include <stdlib.h>
#include "qsort_r.h"
#include <assert.h>
+ Include dependency graph for qsort_r.c:

Go to the source code of this file.

Typedefs

typedef int(* qsort_compar_t) (const void *a, const void *b)
 

Functions

static int relay_compar (const void *a, const void *b)
 Shim to pass context through to real comparator. More...
 
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...
 

Variables

static qsort_r_compar_t global_compar = NULL
 Original comparator in fallback implementation. More...
 
static void * global_data = NULL
 Original opaque data in fallback implementation. More...
 

Detailed Description

Context-free sorting function.

Authors
  • 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 http://www.gnu.org/licenses/.

Definition in file qsort_r.c.

Typedef Documentation

◆ qsort_compar_t

typedef int(* qsort_compar_t) (const void *a, const void *b)

Definition at line 34 of file qsort_r.c.

Function Documentation

◆ relay_compar()

static int relay_compar ( const void *  a,
const void *  b 
)
static

Shim to pass context through to real comparator.

Parameters
aFirst item to be compared
bSecond item to be compared
Return values
<0a sorts before b
0a and b sort equally (sort stability not guaranteed)
>0a sorts after b

Definition at line 51 of file qsort_r.c.

52 {
53  return global_compar(a, b, global_data);
54 }
static qsort_r_compar_t global_compar
Original comparator in fallback implementation.
Definition: qsort_r.c:39
static void * global_data
Original opaque data in fallback implementation.
Definition: qsort_r.c:41
+ Here is the caller graph for this function:

◆ 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.

Parameters
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
Note
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 (https://www.austingroupbugs.net/view.php?id=900) */
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:

Variable Documentation

◆ global_compar

qsort_r_compar_t global_compar = NULL
static

Original comparator in fallback implementation.

Definition at line 39 of file qsort_r.c.

◆ global_data

void* global_data = NULL
static

Original opaque data in fallback implementation.

Definition at line 41 of file qsort_r.c.