/* a-wada/qsortlib/ccg/qsortb.c Nov. 17, 2006 */ /* Copyright (c) 2006 Akira Wada */ /* <<< Example of QSORTBASE to generate sort subroutine >>> */ /* Quick sort compatible with "qsort in stdlib.h" (1) */ /* efficiency by reducing the times of key comparisons and */ /* word_mode_swapping for word_aligned object */ /* prevention from the degeneration caused by peculiar input */ /* This qsort is not stable, but could avoid the degeneration caused by */ /* equal sortkeys. For stability, add a unique-key to compare-function. */ #define QSNAME qsort #define ARGS void *A, size_t N, size_t es, \ int (*cf) (const void *, const void *) typedef char * PTRTYP; #define DFWRK int al, t, w; PTRTYP s[STKSZ], *p = s + STKSZ #define VALID N > 1 && es > 0 #define HSKP al = ((int) A | es) & (SZI - 1); \ l = (char *) A, r = l + (N - 1) * es #define ESZ es #define COMP(i, j) (*cf) (i, j) #define SWAP(i, j) SWAPB (i, j) #define ROTATE(i, j, k) ROTATEB (i, j, k) #define PUSH(x, y) p -= 2, *(p + 1) = x, *p = y #define EMPTY (p >= s + STKSZ) #define POP(y, x) y = *p, x = *(p + 1), p += 2 #define CLNUP /* NOTHING */ #define STKSZ sizeof (size_t) * 8 * 2 #define SZI sizeof (int) #define WD(i) *((int *) (i + w)) #define CH(i) *(i + w) #define SWAPB(i, j) do { \ w = es; if (al <= 0) do w -= SZI, \ t = WD(i), WD(i) = WD(j), WD(j) = t; while (w > 0); \ else do --w, \ t = CH(i), CH(i) = CH(j), CH(j) = t; while (w > 0);} \ while (0) #define ROTATEB(i, j, k) do { \ w = es; if (al <= 0) do w -= SZI, \ t = WD(i), WD(i) = WD(j), WD(j) = WD(k), WD(k) = t; \ while (w > 0); \ else do --w, \ t = CH(i), CH(i) = CH(j), CH(j) = CH(k), CH(k) = t; \ while (w > 0);} while (0) #include "qsortbase.h" QSORTBASE (QSNAME) /* a-wada/qsortlib/ccg/qsortb.c end */