/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1996-2011 AT&T Intellectual Property *
* and is licensed under the *
* Eclipse Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* Phong Vo <kpv@research.att.com> *
* Glenn Fowler <gsf@research.att.com> *
* *
***********************************************************************/
#include "rshdr.h"
/* Get a list of objects from a sorting context.
** Derived contexts will be unionized.
**
** Written by Kiem-Phong Vo (07/19/96)
*/
typedef struct _union_s
int pos;
} Union_t;
/* Lists are kept in reverse order to ease data movement.
** Ties are broken by list positions to preserve stability.
*/
#if __STD_C
#else
int n;
#endif
{
r = (l = list) + n;
if(n > 4)
{ while(l != r)
{ m = l + (r-l)/2;
o = (*m)->obj;
if(cmp == 0)
l = r = m;
else if(cmp > 0)
l = l == m ? r : m;
else r = m;
}
}
else
{ o = (*r)->obj;
if(cmp > 0)
{ l = r+1; break; }
else if(cmp == 0)
{ l = r; break; }
}
}
if(cmp == 0)
break;
else *l = un;
}
else
{ for(r = list+n; r > l; --r)
*r = *(r-1);
n += 1;
}
return n;
}
#if __STD_C
#else
int n;
#endif
{
}
for(p = 0, n_list = 0; p < n; ++p)
{ /* set up header data for quick comparisons */
}
while(n_list > 0)
}
for(;;)
if(!(un = u) )
break;
/* union with equal list of obj */
else e->left = o;
}
if(n_list == 0)
}
else /* at least 2 distinct lists are left */
break;
else
if(cmp >= 0)
break;
}
}
if(obj)
{ if(cmp > 0) /* new min element */
if(p == 0)
{ n_list = 2;
}
else n_list += 1;
}
else /*if(cmp == 0) -- new equivalence class */
break;
}
}
}
}
return list;
}
#if __STD_C
#else
#endif
{
}
}
if((e = r->equal) )
}
else
{ t = r->right;
if(!(e = r->equal) )
{ p = r;
continue;
}
/* resort using whole data */
r->right = e;
if(type&RS_DSAMELEN)
for(; r; r = next)
k = r->key;
r->data = k;
n = r->keylen;
r->datalen = n;
}
if(p)
p->right = r;
else list = r;
p = r->left;
p->right = t;
for(; r != t; r = r->right)
{ k = r->key;
r->data = k;
n = r->keylen;
r->datalen = n;
if((e = r->equal) )
for(; e; e = e->right)
{ k = e->key;
e->data = k;
n = e->keylen;
e->datalen = n;
}
}
}
}
}
if((type&RS_REVERSE) )
{ t = r->right;
if((e = r->equal) ) /* invert equal list */
list = e;
}
}
r->right = p;
p = r;
}
list = p;
}
return list;
}