mirror of
https://github.com/PDP-10/its.git
synced 2026-04-03 21:02:59 +00:00
121 lines
1.4 KiB
C
121 lines
1.4 KiB
C
/*
|
|
* Note: probably should be replaced by qsort from the "useful" library
|
|
*/
|
|
|
|
int (*qs__cmp)();
|
|
static int size;
|
|
|
|
qsort(a, n, es, fc)
|
|
char *a;
|
|
int n, es;
|
|
int (*fc)();
|
|
{
|
|
qs__cmp = fc;
|
|
size = es;
|
|
q_sort(a, a+n*es);
|
|
}
|
|
|
|
q_sort(a, l)
|
|
char *a, *l;
|
|
{
|
|
register char *i, *j;
|
|
register int es;
|
|
char *lp, *hp;
|
|
int n, c;
|
|
|
|
|
|
es = size;
|
|
|
|
start:
|
|
if((n=l-a) <= es)
|
|
return;
|
|
n = es * ( n/(2*es));
|
|
hp = lp = a+n;
|
|
i = a;
|
|
j = l-es;
|
|
for(;;) {
|
|
if(i < lp) {
|
|
if((c = (*qs__cmp)(i, lp)) == 0) {
|
|
q_exc(i, lp -= es);
|
|
continue;
|
|
}
|
|
if(c < 0) {
|
|
i += es;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
loop:
|
|
if(j > hp) {
|
|
if((c = (*qs__cmp)(hp, j)) == 0) {
|
|
q_exc(hp += es, j);
|
|
goto loop;
|
|
}
|
|
if(c > 0) {
|
|
if(i == lp) {
|
|
q_tex(i, hp += es, j);
|
|
i = lp += es;
|
|
goto loop;
|
|
}
|
|
q_exc(i, j);
|
|
j -= es;
|
|
i += es;
|
|
continue;
|
|
}
|
|
j -= es;
|
|
goto loop;
|
|
}
|
|
|
|
|
|
if(i == lp) {
|
|
if(lp-a >= l-hp) {
|
|
q_sort(hp+es, l);
|
|
l = lp;
|
|
} else {
|
|
q_sort(a, lp);
|
|
a = hp+es;
|
|
}
|
|
goto start;
|
|
}
|
|
|
|
|
|
q_tex(j, lp -= es, i);
|
|
j = hp -= es;
|
|
}
|
|
}
|
|
|
|
q_exc(i, j)
|
|
char *i, *j;
|
|
{
|
|
register char *ri, *rj, c;
|
|
int n;
|
|
|
|
n = size;
|
|
ri = i;
|
|
rj = j;
|
|
do {
|
|
c = *ri;
|
|
*ri++ = *rj;
|
|
*rj++ = c;
|
|
} while(--n);
|
|
}
|
|
|
|
q_tex(i, j, k)
|
|
char *i, *j, *k;
|
|
{
|
|
register char *ri, *rj, *rk;
|
|
int c;
|
|
int n;
|
|
|
|
n = size;
|
|
ri = i;
|
|
rj = j;
|
|
rk = k;
|
|
do {
|
|
c = *ri;
|
|
*ri++ = *rk;
|
|
*rk++ = *rj;
|
|
*rj++ = c;
|
|
} while(--n);
|
|
}
|