Root/
Source at commit 2054 created 11 years 10 months ago. By zef, Fixed source indent. | |
---|---|
1 | /*␊ |
2 | * Copyright (c) 1999-2003 Apple Computer, Inc. All rights reserved.␊ |
3 | *␊ |
4 | * @APPLE_LICENSE_HEADER_START@␊ |
5 | * ␊ |
6 | * Portions Copyright (c) 1999-2003 Apple Computer, Inc. All Rights␊ |
7 | * Reserved. This file contains Original Code and/or Modifications of␊ |
8 | * Original Code as defined in and that are subject to the Apple Public␊ |
9 | * Source License Version 2.0 (the "License"). You may not use this file␊ |
10 | * except in compliance with the License. Please obtain a copy of the␊ |
11 | * License at http://www.apple.com/publicsource and read it before using␊ |
12 | * this file.␊ |
13 | * ␊ |
14 | * The Original Code and all software distributed under the License are␊ |
15 | * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER␊ |
16 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,␊ |
17 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,␊ |
18 | * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the␊ |
19 | * License for the specific language governing rights and limitations␊ |
20 | * under the License.␊ |
21 | * ␊ |
22 | * @APPLE_LICENSE_HEADER_END@␊ |
23 | */␊ |
24 | /*␊ |
25 | * Copyright (c) 1992, 1993␊ |
26 | *␉The Regents of the University of California. All rights reserved.␊ |
27 | *␊ |
28 | * Redistribution and use in source and binary forms, with or without␊ |
29 | * modification, are permitted provided that the following conditions␊ |
30 | * are met:␊ |
31 | * 1. Redistributions of source code must retain the above copyright␊ |
32 | * notice, this list of conditions and the following disclaimer.␊ |
33 | * 2. Redistributions in binary form must reproduce the above copyright␊ |
34 | * notice, this list of conditions and the following disclaimer in the␊ |
35 | * documentation and/or other materials provided with the distribution.␊ |
36 | * 3. All advertising materials mentioning features or use of this software␊ |
37 | * must display the following acknowledgement:␊ |
38 | *␉This product includes software developed by the University of␊ |
39 | *␉California, Berkeley and its contributors.␊ |
40 | * 4. Neither the name of the University nor the names of its contributors␊ |
41 | * may be used to endorse or promote products derived from this software␊ |
42 | * without specific prior written permission.␊ |
43 | *␊ |
44 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND␊ |
45 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE␊ |
46 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE␊ |
47 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE␊ |
48 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL␊ |
49 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS␊ |
50 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)␊ |
51 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT␊ |
52 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY␊ |
53 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF␊ |
54 | * SUCH DAMAGE.␊ |
55 | */␊ |
56 | ␊ |
57 | ␊ |
58 | #include <sys/types.h>␊ |
59 | #include <stdlib.h>␊ |
60 | #include <sys/param.h>␊ |
61 | ␊ |
62 | static inline char␉*med3 __P((char *, char *, char *, int (*)()));␊ |
63 | static inline void␉ swapfunc __P((char *, char *, int, int));␊ |
64 | ␊ |
65 | /*␊ |
66 | * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".␊ |
67 | */␊ |
68 | #define swapcode(TYPE, parmi, parmj, n) { ␉␉\␊ |
69 | ␉long i = (n) / sizeof (TYPE); ␉␉␉\␊ |
70 | ␉register TYPE *pi = (TYPE *) (parmi); ␉␉\␊ |
71 | ␉register TYPE *pj = (TYPE *) (parmj); ␉␉\␊ |
72 | ␉do { ␉␉␉␉␉␉\␊ |
73 | ␉␉register TYPE␉t = *pi;␉␉\␊ |
74 | ␉␉*pi++ = *pj;␉␉␉␉\␊ |
75 | ␉␉*pj++ = t;␉␉␉␉\␊ |
76 | } while (--i > 0);␉␉␉␉\␊ |
77 | }␊ |
78 | ␊ |
79 | #define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \␊ |
80 | ␉es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;␊ |
81 | ␊ |
82 | static inline void␊ |
83 | swapfunc(a, b, n, swaptype)␊ |
84 | ␉char *a, *b;␊ |
85 | ␉int n, swaptype;␊ |
86 | {␊ |
87 | ␉if(swaptype <= 1) ␊ |
88 | ␉␉swapcode(long, a, b, n)␊ |
89 | ␉else␊ |
90 | ␉␉swapcode(char, a, b, n)␊ |
91 | }␊ |
92 | ␊ |
93 | #define swap(a, b)␉␉␉␉␉\␊ |
94 | ␉if (swaptype == 0) {␉␉␉␉\␊ |
95 | ␉␉long t = *(long *)(a);␉␉␉\␊ |
96 | ␉␉*(long *)(a) = *(long *)(b);␉␉\␊ |
97 | ␉␉*(long *)(b) = t;␉␉␉\␊ |
98 | ␉} else␉␉␉␉␉␉\␊ |
99 | ␉␉swapfunc(a, b, es, swaptype)␊ |
100 | ␊ |
101 | #define vecswap(a, b, n) ␉if ((n) > 0) swapfunc(a, b, n, swaptype)␊ |
102 | ␊ |
103 | static inline char *␊ |
104 | med3(a, b, c, cmp)␊ |
105 | ␉char *a, *b, *c;␊ |
106 | ␉int (*cmp)();␊ |
107 | {␊ |
108 | ␉return cmp(a, b) < 0 ?␊ |
109 | ␉ (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a ))␊ |
110 | :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c ));␊ |
111 | }␊ |
112 | ␊ |
113 | void␊ |
114 | qsort(a, n, es, cmp)␊ |
115 | ␉void *a;␊ |
116 | ␉size_t n, es;␊ |
117 | ␉int (*cmp)();␊ |
118 | {␊ |
119 | ␉char *pa, *pb, *pc, *pd, *pl, *pm, *pn;␊ |
120 | ␉int d, r, swaptype, swap_cnt;␊ |
121 | ␊ |
122 | loop:␉SWAPINIT(a, es);␊ |
123 | ␉swap_cnt = 0;␊ |
124 | ␉if (n < 7) {␊ |
125 | ␉␉for (pm = a + es; pm < (char *) a + n * es; pm += es)␊ |
126 | ␉␉␉for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;␊ |
127 | ␉␉␉ pl -= es)␊ |
128 | ␉␉␉␉swap(pl, pl - es);␊ |
129 | ␉␉return;␊ |
130 | ␉}␊ |
131 | ␉pm = a + (n / 2) * es;␊ |
132 | ␉if (n > 7) {␊ |
133 | ␉␉pl = a;␊ |
134 | ␉␉pn = a + (n - 1) * es;␊ |
135 | ␉␉if (n > 40) {␊ |
136 | ␉␉␉d = (n / 8) * es;␊ |
137 | ␉␉␉pl = med3(pl, pl + d, pl + 2 * d, cmp);␊ |
138 | ␉␉␉pm = med3(pm - d, pm, pm + d, cmp);␊ |
139 | ␉␉␉pn = med3(pn - 2 * d, pn - d, pn, cmp);␊ |
140 | ␉␉}␊ |
141 | ␉␉pm = med3(pl, pm, pn, cmp);␊ |
142 | ␉}␊ |
143 | ␉swap(a, pm);␊ |
144 | ␉pa = pb = a + es;␊ |
145 | ␊ |
146 | ␉pc = pd = a + (n - 1) * es;␊ |
147 | ␉for (;;) {␊ |
148 | ␉␉while (pb <= pc && (r = cmp(pb, a)) <= 0) {␊ |
149 | ␉␉␉if (r == 0) {␊ |
150 | ␉␉␉␉swap_cnt = 1;␊ |
151 | ␉␉␉␉swap(pa, pb);␊ |
152 | ␉␉␉␉pa += es;␊ |
153 | ␉␉␉}␊ |
154 | ␉␉␉pb += es;␊ |
155 | ␉␉}␊ |
156 | ␉␉while (pb <= pc && (r = cmp(pc, a)) >= 0) {␊ |
157 | ␉␉␉if (r == 0) {␊ |
158 | ␉␉␉␉swap_cnt = 1;␊ |
159 | ␉␉␉␉swap(pc, pd);␊ |
160 | ␉␉␉␉pd -= es;␊ |
161 | ␉␉␉}␊ |
162 | ␉␉␉pc -= es;␊ |
163 | ␉␉}␊ |
164 | ␉␉if (pb > pc)␊ |
165 | ␉␉␉break;␊ |
166 | ␉␉swap(pb, pc);␊ |
167 | ␉␉swap_cnt = 1;␊ |
168 | ␉␉pb += es;␊ |
169 | ␉␉pc -= es;␊ |
170 | ␉}␊ |
171 | ␉if (swap_cnt == 0) { /* Switch to insertion sort */␊ |
172 | ␉␉for (pm = a + es; pm < (char *) a + n * es; pm += es)␊ |
173 | ␉␉␉for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0; ␊ |
174 | ␉␉␉ pl -= es)␊ |
175 | ␉␉␉␉swap(pl, pl - es);␊ |
176 | ␉␉return;␊ |
177 | ␉}␊ |
178 | ␊ |
179 | ␉pn = a + n * es;␊ |
180 | ␉r = MIN(pa - (char *)a, pb - pa);␊ |
181 | ␉vecswap(a, pb - r, r);␊ |
182 | ␉r = MIN(pd - pc, (pn - pd) - (int)es);␊ |
183 | ␉vecswap(pb, pn - r, r);␊ |
184 | ␉if ((r = pb - pa) > (int)es)␊ |
185 | ␉␉qsort(a, r / es, es, cmp);␊ |
186 | ␉if ((r = pd - pc) > (int)es) { ␊ |
187 | ␉␉/* Iterate rather than recurse to save stack space */␊ |
188 | ␉␉a = pn - r;␊ |
189 | ␉␉n = r / es;␊ |
190 | ␉␉goto loop;␊ |
191 | ␉}␊ |
192 | /*␉␉qsort(pn - r, r / es, es, cmp);*/␊ |
193 | }␊ |
194 |