]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/kern/qsort.c
xnu-2782.20.48.tar.gz
[apple/xnu.git] / bsd / kern / qsort.c
index d1505f175c7bdd5d3e79ea02f846164c79576d6d..70ded5774dea3e2945758313ef988559608a15b7 100644 (file)
@@ -1,23 +1,29 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /*
  * Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved
 #include <sys/types.h>
 //#include <stdlib.h>
 
-static inline char     *med3 __P((char *, char *, char *, int (*)()));
-static inline void      swapfunc __P((char *, char *, int, int));
+__private_extern__
+void
+qsort(void *a, size_t n, size_t es, int (*cmp)(const void *, const void *));
+
+static inline char     *med3(char *, char *, char *, int (*)(const void *, const void *));
+static inline void      swapfunc(char *, char *, int, int);
 
 #define min(a, b)      (a) < (b) ? a : b
 
@@ -70,10 +80,10 @@ static inline void   swapfunc __P((char *, char *, int, int));
  */
 #define swapcode(TYPE, parmi, parmj, n) {              \
        long i = (n) / sizeof (TYPE);                   \
-       register TYPE *pi = (TYPE *) (parmi);           \
-       register TYPE *pj = (TYPE *) (parmj);           \
+       TYPE *pi = (TYPE *) (parmi);                    \
+       TYPE *pj = (TYPE *) (parmj);                    \
        do {                                            \
-               register TYPE   t = *pi;                \
+               TYPE    t = *pi;                        \
                *pi++ = *pj;                            \
                *pj++ = t;                              \
         } while (--i > 0);                             \
@@ -83,9 +93,7 @@ static inline void     swapfunc __P((char *, char *, int, int));
        es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;
 
 static inline void
-swapfunc(a, b, n, swaptype)
-       char *a, *b;
-       int n, swaptype;
+swapfunc(char *a, char *b, int n, int swaptype)
 {
        if(swaptype <= 1) 
                swapcode(long, a, b, n)
@@ -104,9 +112,7 @@ swapfunc(a, b, n, swaptype)
 #define vecswap(a, b, n)       if ((n) > 0) swapfunc(a, b, n, swaptype)
 
 static inline char *
-med3(a, b, c, cmp)
-       char *a, *b, *c;
-       int (*cmp)();
+med3(char *a, char *b, char *c, int (*cmp)(const void *, const void *))
 {
        return cmp(a, b) < 0 ?
               (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a ))
@@ -115,27 +121,25 @@ med3(a, b, c, cmp)
 
 __private_extern__
 void
-qsort(a, n, es, cmp)
-       void *a;
-       size_t n, es;
-       int (*cmp)();
+qsort(void *a, size_t n, size_t es, int (*cmp)(const void *, const void *))
 {
        char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
-       int d, r, swaptype, swap_cnt;
+       int d, swaptype, swap_cnt;
+       int r;
 
 loop:  SWAPINIT(a, es);
        swap_cnt = 0;
        if (n < 7) {
-               for (pm = a + es; pm < (char *) a + n * es; pm += es)
+               for (pm = (char *)a + es; pm < (char *) a + n * es; pm += es)
                        for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
                             pl -= es)
                                swap(pl, pl - es);
                return;
        }
-       pm = a + (n / 2) * es;
+       pm = (char *)a + (n / 2) * es;
        if (n > 7) {
                pl = a;
-               pn = a + (n - 1) * es;
+               pn = (char *)a + (n - 1) * es;
                if (n > 40) {
                        d = (n / 8) * es;
                        pl = med3(pl, pl + d, pl + 2 * d, cmp);
@@ -145,9 +149,9 @@ loop:       SWAPINIT(a, es);
                pm = med3(pl, pm, pn, cmp);
        }
        swap(a, pm);
-       pa = pb = a + es;
+       pa = pb = (char *)a + es;
 
-       pc = pd = a + (n - 1) * es;
+       pc = pd = (char *)a + (n - 1) * es;
        for (;;) {
                while (pb <= pc && (r = cmp(pb, a)) <= 0) {
                        if (r == 0) {
@@ -173,21 +177,21 @@ loop:     SWAPINIT(a, es);
                pc -= es;
        }
        if (swap_cnt == 0) {  /* Switch to insertion sort */
-               for (pm = a + es; pm < (char *) a + n * es; pm += es)
+               for (pm = (char *)a + es; pm < (char *) a + n * es; pm += es)
                        for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0; 
                             pl -= es)
                                swap(pl, pl - es);
                return;
        }
 
-       pn = a + n * es;
+       pn = (char *)a + n * es;
        r = min(pa - (char *)a, pb - pa);
        vecswap(a, pb - r, r);
-       r = min(pd - pc, pn - pd - es);
+       r = min((size_t)(pd - pc), pn - pd - es);
        vecswap(pb, pn - r, r);
-       if ((r = pb - pa) > es)
+       if ((size_t)(r = pb - pa) > es)
                qsort(a, r / es, es, cmp);
-       if ((r = pd - pc) > es) { 
+       if ((size_t)(r = pd - pc) > es) { 
                /* Iterate rather than recurse to save stack space */
                a = pn - r;
                n = r / es;