-static int (*func) (char *, char *);
-static int globv;
-
-static void glob3(char *i, char *j, char *k)
-{
- char *index1, *index2, *index3;
- int c;
- int m;
-
- m = globv;
- index1 = i;
- index2 = j;
- index3 = k;
- do {
- c = *index1;
- *index1++ = *index3;
- *index3++ = *index2;
- *index2++ = c;
- } while (--m);
-}
-
-static void glob2(char *i, char *j)
-{
- char *index1, *index2, c;
- int m;
-
- m = globv;
- index1 = i;
- index2 = j;
- do {
- c = *index1;
- *index1++ = *index2;
- *index2++ = c;
- } while (--m);
-}
-
-static void glob1(char *base, char *lim)
-{
- char *i, *j;
- int v2;
- char *lptr, *hptr;
- int c;
- unsigned n;
-
- v2 = globv;
-
- top:
- n = (int) (lim - base);
- if (n <= v2)
- return;
- n = v2 * (n / (2 * v2));
- hptr = lptr = base + n;
- i = base;
- j = lim - v2;
- for (;;) {
- if (i < lptr) {
- c = (*func) (i, lptr);
- if (c == 0) {
- lptr -= v2;
- glob2(i, lptr);
- continue;
- }
- if (c < 0) {
- i += v2;
- continue;
- }
- }
-
- begin:
- if (j > hptr) {
- c = (*func) (hptr, j);
- if (c == 0) {
- hptr += v2;
- glob2(hptr, j);
- goto begin;
- }
- if (c > 0) {
- if (i == lptr) {
- hptr += v2;
- glob3(i, hptr, j);
- i = (lptr += v2);
- goto begin;
- }
- glob2(i, j);
- j -= v2;
- i += v2;
- continue;
- }
- j -= v2;
- goto begin;
- }
-
-
- if (i == lptr) {
- if (lptr - base >= lim - hptr) {
- glob1(hptr + v2, lim);
- lim = lptr;
- } else {
- glob1(base, lptr);
- base = hptr + v2;
- }
- goto top;
- }
-
- lptr -= v2;
- glob3(j, lptr, i);
- j = (hptr -= v2);
- }
-}
-
-static void glob0(char *a0, unsigned a1, int a2, int (*a3) (char *, char *))
-{
- func = a3;
- globv = a2;
- glob1(a0, a0 + a1 * a2);
-}
-