lpc4/lib/
lpc4/lib/doc/efun/
lpc4/lib/doc/lfun/
lpc4/lib/doc/operators/
lpc4/lib/doc/simul_efuns/
lpc4/lib/doc/types/
lpc4/lib/etc/
lpc4/lib/include/
lpc4/lib/include/arpa/
lpc4/lib/obj/d/
lpc4/lib/save/
lpc4/lib/secure/
lpc4/lib/std/
lpc4/lib/std/living/
/* 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);
}