NeoMutt  2024-04-25-89-g194907
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
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.

Typedefs

typedef int(* sort_t) (const void *a, const void *b, void *sdata)
 

Functions

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

Detailed Description

Context-free sorting function.

Authors
  • Eric Blake
  • Richard Russon

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

Typedef Documentation

◆ sort_t

typedef int(* sort_t) (const void *a, const void *b, void *sdata)

Definition at line 41 of file qsort_r.h.

Function Documentation

◆ mutt_qsort_r()

void mutt_qsort_r ( void *  base,
size_t  nmemb,
size_t  size,
sort_t  compar,
void *  sdata 
)

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
sdataOpaque 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 67 of file qsort_r.c.

68{
69#ifdef HAVE_QSORT_S
70 /* FreeBSD 13, where qsort_r had incompatible signature but qsort_s works */
71 qsort_s(base, nmemb, size, compar, sdata);
72#elif defined(HAVE_QSORT_R)
73 /* glibc, POSIX (https://www.austingroupbugs.net/view.php?id=900) */
74 qsort_r(base, nmemb, size, compar, sdata);
75#else
76 /* This fallback is not re-entrant. */
78 GlobalCompar = compar;
79 GlobalData = sdata;
80 qsort(base, nmemb, size, relay_compar);
81 GlobalCompar = NULL;
82 GlobalData = NULL;
83#endif
84}
static sort_t GlobalCompar
Original comparator in fallback implementation.
Definition: qsort_r.c:38
static int relay_compar(const void *a, const void *b)
Shim to pass context through to real comparator.
Definition: qsort_r.c:50
static void * GlobalData
Original opaque data in fallback implementation.
Definition: qsort_r.c:40
#define ASSERT(COND)
Definition: signal2.h:58
+ Here is the call graph for this function:
+ Here is the caller graph for this function: