diff options
Diffstat (limited to 'src/lib/libc/stdlib/radixsort.c')
| -rw-r--r-- | src/lib/libc/stdlib/radixsort.c | 66 |
1 files changed, 21 insertions, 45 deletions
diff --git a/src/lib/libc/stdlib/radixsort.c b/src/lib/libc/stdlib/radixsort.c index dd51013c94..49d03b52d5 100644 --- a/src/lib/libc/stdlib/radixsort.c +++ b/src/lib/libc/stdlib/radixsort.c | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | /* $OpenBSD: radixsort.c,v 1.9 2007/09/02 15:19:17 deraadt Exp $ */ | ||
| 1 | /*- | 2 | /*- |
| 2 | * Copyright (c) 1990, 1993 | 3 | * Copyright (c) 1990, 1993 |
| 3 | * The Regents of the University of California. All rights reserved. | 4 | * The Regents of the University of California. All rights reserved. |
| @@ -13,11 +14,7 @@ | |||
| 13 | * 2. Redistributions in binary form must reproduce the above copyright | 14 | * 2. Redistributions in binary form must reproduce the above copyright |
| 14 | * notice, this list of conditions and the following disclaimer in the | 15 | * notice, this list of conditions and the following disclaimer in the |
| 15 | * documentation and/or other materials provided with the distribution. | 16 | * documentation and/or other materials provided with the distribution. |
| 16 | * 3. All advertising materials mentioning features or use of this software | 17 | * 3. Neither the name of the University nor the names of its contributors |
| 17 | * must display the following acknowledgement: | ||
| 18 | * This product includes software developed by the University of | ||
| 19 | * California, Berkeley and its contributors. | ||
| 20 | * 4. Neither the name of the University nor the names of its contributors | ||
| 21 | * may be used to endorse or promote products derived from this software | 18 | * may be used to endorse or promote products derived from this software |
| 22 | * without specific prior written permission. | 19 | * without specific prior written permission. |
| 23 | * | 20 | * |
| @@ -34,11 +31,6 @@ | |||
| 34 | * SUCH DAMAGE. | 31 | * SUCH DAMAGE. |
| 35 | */ | 32 | */ |
| 36 | 33 | ||
| 37 | #if defined(LIBC_SCCS) && !defined(lint) | ||
| 38 | /*static char sccsid[] = "from: @(#)radixsort.c 8.1 (Berkeley) 6/4/93";*/ | ||
| 39 | static char *rcsid = "$Id: radixsort.c,v 1.1.1.1 1995/10/18 08:42:19 deraadt Exp $"; | ||
| 40 | #endif /* LIBC_SCCS and not lint */ | ||
| 41 | |||
| 42 | /* | 34 | /* |
| 43 | * Radixsort routines. | 35 | * Radixsort routines. |
| 44 | * | 36 | * |
| @@ -61,11 +53,11 @@ typedef struct { | |||
| 61 | int sn, si; | 53 | int sn, si; |
| 62 | } stack; | 54 | } stack; |
| 63 | 55 | ||
| 64 | static inline void simplesort | 56 | static __inline void simplesort |
| 65 | __P((const u_char **, int, int, const u_char *, u_int)); | 57 | (const u_char **, int, int, const u_char *, u_int); |
| 66 | static void r_sort_a __P((const u_char **, int, int, const u_char *, u_int)); | 58 | static void r_sort_a(const u_char **, int, int, const u_char *, u_int); |
| 67 | static void r_sort_b __P((const u_char **, | 59 | static void r_sort_b(const u_char **, |
| 68 | const u_char **, int, int, const u_char *, u_int)); | 60 | const u_char **, int, int, const u_char *, u_int); |
| 69 | 61 | ||
| 70 | #define THRESHOLD 20 /* Divert to simplesort(). */ | 62 | #define THRESHOLD 20 /* Divert to simplesort(). */ |
| 71 | #define SIZE 512 /* Default stack size. */ | 63 | #define SIZE 512 /* Default stack size. */ |
| @@ -90,10 +82,7 @@ static void r_sort_b __P((const u_char **, | |||
| 90 | } | 82 | } |
| 91 | 83 | ||
| 92 | int | 84 | int |
| 93 | radixsort(a, n, tab, endch) | 85 | radixsort(const u_char **a, int n, const u_char *tab, u_int endch) |
| 94 | const u_char **a, *tab; | ||
| 95 | int n; | ||
| 96 | u_int endch; | ||
| 97 | { | 86 | { |
| 98 | const u_char *tr; | 87 | const u_char *tr; |
| 99 | int c; | 88 | int c; |
| @@ -105,10 +94,7 @@ radixsort(a, n, tab, endch) | |||
| 105 | } | 94 | } |
| 106 | 95 | ||
| 107 | int | 96 | int |
| 108 | sradixsort(a, n, tab, endch) | 97 | sradixsort(const u_char **a, int n, const u_char *tab, u_int endch) |
| 109 | const u_char **a, *tab; | ||
| 110 | int n; | ||
| 111 | u_int endch; | ||
| 112 | { | 98 | { |
| 113 | const u_char *tr, **ta; | 99 | const u_char *tr, **ta; |
| 114 | int c; | 100 | int c; |
| @@ -118,7 +104,7 @@ sradixsort(a, n, tab, endch) | |||
| 118 | if (n < THRESHOLD) | 104 | if (n < THRESHOLD) |
| 119 | simplesort(a, n, 0, tr, endch); | 105 | simplesort(a, n, 0, tr, endch); |
| 120 | else { | 106 | else { |
| 121 | if ((ta = malloc(n * sizeof(a))) == NULL) | 107 | if ((ta = calloc(n, sizeof(a))) == NULL) |
| 122 | return (-1); | 108 | return (-1); |
| 123 | r_sort_b(a, ta, n, 0, tr, endch); | 109 | r_sort_b(a, ta, n, 0, tr, endch); |
| 124 | free(ta); | 110 | free(ta); |
| @@ -133,15 +119,11 @@ sradixsort(a, n, tab, endch) | |||
| 133 | 119 | ||
| 134 | /* Unstable, in-place sort. */ | 120 | /* Unstable, in-place sort. */ |
| 135 | void | 121 | void |
| 136 | r_sort_a(a, n, i, tr, endch) | 122 | r_sort_a(const u_char **a, int n, int i, const u_char *tr, u_int endch) |
| 137 | const u_char **a; | ||
| 138 | int n, i; | ||
| 139 | const u_char *tr; | ||
| 140 | u_int endch; | ||
| 141 | { | 123 | { |
| 142 | static int count[256], nc, bmin; | 124 | static int count[256], nc, bmin; |
| 143 | register int c; | 125 | int c; |
| 144 | register const u_char **ak, *r; | 126 | const u_char **ak, *r; |
| 145 | stack s[SIZE], *sp, *sp0, *sp1, temp; | 127 | stack s[SIZE], *sp, *sp0, *sp1, temp; |
| 146 | int *cp, bigc; | 128 | int *cp, bigc; |
| 147 | const u_char **an, *t, **aj, **top[256]; | 129 | const u_char **an, *t, **aj, **top[256]; |
| @@ -224,15 +206,12 @@ r_sort_a(a, n, i, tr, endch) | |||
| 224 | 206 | ||
| 225 | /* Stable sort, requiring additional memory. */ | 207 | /* Stable sort, requiring additional memory. */ |
| 226 | void | 208 | void |
| 227 | r_sort_b(a, ta, n, i, tr, endch) | 209 | r_sort_b(const u_char **a, const u_char **ta, int n, int i, const u_char *tr, |
| 228 | const u_char **a, **ta; | 210 | u_int endch) |
| 229 | int n, i; | ||
| 230 | const u_char *tr; | ||
| 231 | u_int endch; | ||
| 232 | { | 211 | { |
| 233 | static int count[256], nc, bmin; | 212 | static int count[256], nc, bmin; |
| 234 | register int c; | 213 | int c; |
| 235 | register const u_char **ak, **ai; | 214 | const u_char **ak, **ai; |
| 236 | stack s[512], *sp, *sp0, *sp1, temp; | 215 | stack s[512], *sp, *sp0, *sp1, temp; |
| 237 | const u_char **top[256]; | 216 | const u_char **top[256]; |
| 238 | int *cp, bigc; | 217 | int *cp, bigc; |
| @@ -295,14 +274,11 @@ r_sort_b(a, ta, n, i, tr, endch) | |||
| 295 | } | 274 | } |
| 296 | } | 275 | } |
| 297 | 276 | ||
| 298 | static inline void | 277 | static __inline void |
| 299 | simplesort(a, n, b, tr, endch) /* insertion sort */ | 278 | simplesort(const u_char **a, int n, int b, const u_char *tr, u_int endch) |
| 300 | register const u_char **a; | 279 | /* insertion sort */ |
| 301 | int n, b; | ||
| 302 | register const u_char *tr; | ||
| 303 | u_int endch; | ||
| 304 | { | 280 | { |
| 305 | register u_char ch; | 281 | u_char ch; |
| 306 | const u_char **ak, **ai, *s, *t; | 282 | const u_char **ak, **ai, *s, *t; |
| 307 | 283 | ||
| 308 | for (ak = a+1; --n >= 1; ak++) | 284 | for (ak = a+1; --n >= 1; ak++) |
