2 * This file lifted in toto from 'Dlibs' on the atari ST (RdeBath)
5 * Dale Schumacher 399 Beacon Ave.
6 * (alias: Dalnefre') St. Paul, MN 55104
7 * dal@syntel.UUCP United States of America
8 * "It's not reality that's important, but how you perceive things."
12 * Sun Feb 8 21:02:15 EST 1998 claudio@pos.inf.ufpr.br (Claudio Matsuoka)
13 * Changed sort direction
18 char *_qbuf
= 0; /* pointer to storage for qsort() */
20 #define PIVOT ((i+j)>>1)
21 #define moveitem(dst,src,size) if(dst != src) memcpy(dst, src, size)
24 _wqsort(base
, lo
, hi
, cmp
)
28 register int (*cmp
) ();
44 while (((*cmp
) ((base
+ j
), p
)) <= 0)
47 while ((i
< j
) && (((*cmp
) ((base
+ i
), p
)) > 0))
52 if ((i
- lo
) < (hi
- i
))
54 _wqsort(base
, lo
, (i
- 1), cmp
);
59 _wqsort(base
, (i
+ 1), hi
, cmp
);
66 _lqsort(base
, lo
, hi
, cmp
)
70 register int (*cmp
) ();
74 register long *p
= &k
;
86 while (((*cmp
) ((base
+ j
), p
)) <= 0)
89 while ((i
< j
) && (((*cmp
) ((base
+ i
), p
)) > 0))
94 if ((i
- lo
) < (hi
- i
))
96 _lqsort(base
, lo
, (i
- 1), cmp
);
101 _lqsort(base
, (i
+ 1), hi
, cmp
);
108 _nqsort(base
, lo
, hi
, size
, cmp
)
113 register int (*cmp
) ();
116 register char *p
= _qbuf
;
122 p
= (base
+ size
* PIVOT
);
123 moveitem(_qbuf
, p
, size
);
124 moveitem(p
, (base
+ size
* i
), size
);
125 moveitem((base
+ size
* i
), _qbuf
, size
);
129 while (((*cmp
) ((base
+ size
* j
), p
)) <= 0)
131 moveitem((base
+ size
* i
), (base
+ size
* j
), size
);
132 while ((i
< j
) && (((*cmp
) ((base
+ size
* i
), p
)) > 0))
134 moveitem((base
+ size
* j
), (base
+ size
* i
), size
);
136 moveitem((base
+ size
* i
), p
, size
);
137 if ((i
- lo
) < (hi
- i
))
139 _nqsort(base
, lo
, (i
- 1), size
, cmp
);
144 _nqsort(base
, (i
+ 1), hi
, size
, cmp
);
150 qsort(base
, num
, size
, cmp
)
160 if (size
> sizeof(_qtemp
))/* records too large! */
165 _wqsort(base
, 0, num
- 1, cmp
);
167 _lqsort(base
, 0, num
- 1, cmp
);
169 _nqsort(base
, 0, num
- 1, size
, cmp
);