/* a-wada/qsortlib/ccg/qsorta.c Nov. 19, 1999 */ /* Copyright (c) 1999 Akira Wada */ /* <<< Example of QSORTBASE to generate sort subroutine >>> */ /* A template of the tailor-made quick sort for an application */ /** define the object to be sorted **/ typedef struct { int nmb; char *grp; double sum; int klg; char text[108];} typeA; /** specify the sorting parameters **/ #include #define QSNAME qsorta #define ARGSM typeA A[], int N #define KLG1 16 #define COMPM(i, j) ((cmp = strncmp ( \ A[i].grp, A[j].grp, KLG1)) != 0 ? cmp : ( \ A[i].sum > A[j].sum ? -1 : ( \ A[i].sum < A[j].sum ? 1 : 0 ))) \ /* A[i].nmb - A[j].nmb <- uniquekey for stability */ #define SWAPM(i, j) SWAPW (i, j) #define ROTATEM(i, j, k) ROTATEW (i, j, k) /** call the sorting algorithm (QSORTBASE) << not necessary to change >> **/ #define ARGS ARGSM typedef int PTRTYP; #define DFWRK STACK; SWAPWK #define VALID N > 1 #define HSKP l = 0, r = N - 1 #define ESZ 1 #define COMP(i, j) COMPM (i, j) #define SWAP(i, j) SWAPM (i, j) #define ROTATE(i, j, k) ROTATEM (i, j, k) #define CLNUP /* NOTHING */ #define STACK PTRTYP s[STKSZ], *p = s #define STKSZ sizeof (int) * 8 * 2 #define PUSH(x, y) *(p++) = x, *(p++) = y #define EMPTY (s >= p) #define POP(y, x) y = *(--p), x = *(--p) #define SWAPWK char *a, *b, *c, u; \ int d, e = ((int) A | SZA) & (SZI - 1), t #define SZA sizeof (typeA) #define SZI sizeof (int) #define SWAPW(i, j) do { \ a = (char*) &A[i], b = (char*) &A[j], d = SZA; \ if (e == 0) do \ d -= SZI, t = *((int*) (a + d)), \ *((int*) (a + d)) = *((int*) (b + d)), \ *((int*) (b + d)) = t; while (d > 0); \ else do \ --d, u = *(a + d), *(a + d) = *(b + d), *(b + d) = u; \ while (d > 0);} while (0) #define ROTATEW(i, j, k) do { \ a = (char*) &A[i], b = (char*) &A[j], c = (char*) &A[k], d = SZA; \ if (e == 0) do \ d -= SZI, t = *((int*) (a + d)), \ *((int*) (a + d)) = *((int*) (b + d)), \ *((int*) (b + d)) = *((int*) (c + d)), \ *((int*) (c + d)) = t; while (d > 0); \ else do \ --d, u = *(a + d), *(a + d) = *(b + d), *(b + d) = *(c + d), \ *(c + d) = u; while (d > 0);} while (0) #include "qsortbase.h" QSORTBASE (QSNAME) /* a-wada/qsortlib/ccg/qsorta.c end */