50 static char *
med3(
char *a,
char *b,
char *
c,
52 static void swapfunc(
char *,
char *,
size_t,
int);
70 #define swapcode(TYPE, parmi, parmj, n) \ 72 size_t i = (n) / sizeof (TYPE); \ 73 TYPE *pi = (TYPE *)(void *)(parmi); \ 74 TYPE *pj = (TYPE *)(void *)(parmj); \ 82 #define SWAPINIT(a, es) swaptype = ((char *)(a) - (char *)0) % sizeof(long) || \ 83 (es) % sizeof(long) ? 2 : (es) == sizeof(long)? 0 : 1 86 swapfunc(
char *a,
char *b,
size_t n,
int swaptype)
95 if (swaptype == 0) { \ 96 long t = *(long *)(void *)(a); \ 97 *(long *)(void *)(a) = *(long *)(void *)(b); \ 98 *(long *)(void *)(b) = t; \ 100 swapfunc(a, b, es, swaptype) 102 #define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) 107 return cmp(a, b, arg) < 0 ?
108 (
cmp(b, c, arg) < 0 ? b : (
cmp(a, c, arg) < 0 ?
c : a))
109 : (
cmp(b, c, arg) > 0 ? b : (
cmp(a, c, arg) < 0 ? a :
c));
131 for (pm = (
char *) a + es; pm < (
char *) a + n * es; pm += es)
132 for (pl = pm; pl > (
char *) a &&
cmp(pl - es, pl, arg) > 0;
138 for (pm = (
char *) a + es; pm < (
char *) a + n * es; pm += es)
140 if (
cmp(pm - es, pm, arg) > 0)
148 pm = (
char *) a + (n / 2) * es;
152 pn = (
char *) a + (n - 1) * es;
155 size_t d = (n / 8) * es;
157 pl =
med3(pl, pl + d, pl + 2 * d, cmp, arg);
158 pm =
med3(pm - d, pm, pm + d, cmp, arg);
159 pn =
med3(pn - 2 * d, pn - d, pn, cmp, arg);
161 pm =
med3(pl, pm, pn, cmp, arg);
164 pa = pb = (
char *) a + es;
165 pc = pd = (
char *) a + (n - 1) * es;
168 while (pb <= pc && (r =
cmp(pb, a, arg)) <= 0)
177 while (pb <= pc && (r =
cmp(pc, a, arg)) >= 0)
192 pn = (
char *) a + n * es;
193 d1 =
Min(pa - (
char *) a, pb - pa);
195 d1 =
Min(pd - pc, pn - pd - es);
217 qsort_arg(pn - d2, d2 / es, es, cmp, arg);
int(* qsort_arg_comparator)(const void *a, const void *b, void *arg)
void qsort_arg(void *a, size_t n, size_t es, qsort_arg_comparator cmp, void *arg)
static char * med3(char *a, char *b, char *c, qsort_arg_comparator cmp, void *arg)
static void swapfunc(char *, char *, size_t, int)
#define swapcode(TYPE, parmi, parmj, n)
static int cmp(const chr *x, const chr *y, size_t len)