/* A quicksort I think / Profezzorn */
#incldue "machine.h"
#include "main.h"
static void *tmp;
static int (*cpfun)(const void *, const void *);
static long size;
void qsort(base,elms,elmSize, cmpfunc)
void *base;
long elms;
long elmSize;
int (*cmpfunc)(const void *, const void *);
{
long e;
void *a,*b;
if (!tmp = xalloc(elmSize)) return;
cpfun=cmpfunc;
size=elmSize;
qsort2(base,&elms[elms-1]);
free(tmp);
}
void qsort2(void *bas,void *last)
{
register void *a,*b,*c;
if(bas>=last) return;
a=bas+size;
if(a==last)
{
if(*(cmpfunc)(bas,last) > 0) swap(bas,last);
return;
}
b=last;
while(a<b)
{
while(a<=b && *(cmpfunc)(bas,a) >= 0) a+=size;
while(a< b && *(cmpfunc)(b,bas) >= 0) b-=size;
if(a<b) swap(a,b);
}
swap(bas,a-size);
if(a>bas) qsort2(bas,a-(size<<1));
if(b<last) qsort2(b,last);
}
void INLINE swap(void *a,void *b)
{
MEMCPY(a,tmp,size);
MEMCPY(b,a,size);
MEMCPY(tmp,b,size);
}