00001
00029 static void
00030 internal_quick_sort(char *left, char *right, int size, int (*compare)(const void *, const void *, void *), void *pointer)
00031 {
00032 char *p = left;
00033 char *q = right;
00034 char *t = left;
00035
00036 while (1) {
00037 while ((*compare)(p, t, pointer) < 0)
00038 p += size;
00039 while ((*compare)(q, t, pointer) > 0)
00040 q -= size;
00041 if (p > q)
00042 break;
00043 if (p < q) {
00044 int i;
00045 for (i = 0; i < size; i++) {
00046 char x = p[i];
00047 p[i] = q[i];
00048 q[i] = x;
00049 }
00050 if (t == p)
00051 t = q;
00052 else if (t == q)
00053 t = p;
00054 }
00055 p += size;
00056 q -= size;
00057 if (p > q) break;
00058 }
00059 if (left < q)
00060 internal_quick_sort(left, q, size, compare, pointer);
00061 if (p < right)
00062 internal_quick_sort(p, right, size, compare, pointer);
00063 }
00064
00076 void
00077 qsort_reentrant(void *base, int count, int size, int (*compare)(const void *, const void *, void *), void *pointer)
00078 {
00079 if (count > 1) {
00080 internal_quick_sort((char *) base, (char *) base + (count-1)*size, size, compare, pointer);
00081 }
00082 }
00083
00084