/****Copyright (c) 1997-2009 All rights reserved
 ****A. V. Gerbessiotis 
 ****Permission to use, copy, modify, and distribute this software,
 ****and to incorporate it, in whole or in part, into 
 ****other software,is hereby granted without fee, provided that
 ****  (1) the above copyright notice and this permission 
 ****      notice appear in all copies of the source code, and 
 ****      the above copyright notice appear in clearly visible 
 ****      form on all supporting documentation and distribution 
 ****      media, and
 ****     (2) any redistribution of the software, in original
 ****         or modified form, be without fee and subject to
 ****         these same conditions.
 ****   No guarantee, whatsoever, is offered that the code works as
 ****   advertised or is absent of any, even damaging,
 ****   side-effects. Use this code at your own personal risk.
 ****/
#include "ssrt.h"

/* This is was g76heapx.c Similar tog g36heapx.c */

void g37(void *akeys,int n,int size,int (*compare)(const void*,const void*),int l,int r)
{
 register int i,j,z,M;
 register char	*x, *keys,*SRC,*DES;

 keys = (char *) akeys;
 x = (char *) malloc(size*sizeof(char));
 i=l;j=2*i+1;

 MEMCPY(x,&keys[i*size],size);

 while ( j <= r) {
   
   if (j < r) { 
     if (compare(&keys[(j)*size],&keys[(j+1)*size]) < 0) {
       j++;
     }
   }
   if (compare(x,&keys[(j)*size]) >= 0)
	break;

   MEMCPY(&keys[(i)*size],&keys[(j)*size],size);
   i=j;j=2*i+1;
 }
 MEMCPY(&keys[(i)*size],x,size);
}
	

void g37heapx(void *akeys, int n, int size, int (*compare) (const void*,const void*))
{
 register int l,r,m,c;
 register char	*keys,*pi,*pj;

 keys=(char *)akeys;
 l = n/2+1; r=n-1;
 while (l > 0) {
   l--;
   g37(keys,n,size,compare,l,r);
 }
 while (r > 0) {
   m=size;pi=keys, pj=keys+r*size;
   do {
    c= *pi;
    *pi++ = *pj;
    *pj++ = c;
   } while (--m);
   r--;
   g37(keys,n,size,compare,l,r);
 }

}
