diff options
author | otto <> | 2010-02-08 11:04:07 +0000 |
---|---|---|
committer | otto <> | 2010-02-08 11:04:07 +0000 |
commit | 2f8099199567a7110e7f8796aa42725ee02c3228 (patch) | |
tree | 72f9b455fc823d14d0b230fc9a8dbcf948b3c446 /src | |
parent | 4f004dc5b722b4416b1caa9b67a193262b76772e (diff) | |
download | openbsd-2f8099199567a7110e7f8796aa42725ee02c3228.tar.gz openbsd-2f8099199567a7110e7f8796aa42725ee02c3228.tar.bz2 openbsd-2f8099199567a7110e7f8796aa42725ee02c3228.zip |
Use size_t in appropriate places; fixes sorting of big arrays;
after the diff was written, I made it similar to the freebsd fix of
the same code; pr6287 ok millert@ guenther@
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libc/stdlib/qsort.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/lib/libc/stdlib/qsort.c b/src/lib/libc/stdlib/qsort.c index bb4a9a11f2..f28449fb5b 100644 --- a/src/lib/libc/stdlib/qsort.c +++ b/src/lib/libc/stdlib/qsort.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: qsort.c,v 1.10 2005/08/08 08:05:37 espie Exp $ */ | 1 | /* $OpenBSD: qsort.c,v 1.11 2010/02/08 11:04:07 otto Exp $ */ |
2 | /*- | 2 | /*- |
3 | * Copyright (c) 1992, 1993 | 3 | * Copyright (c) 1992, 1993 |
4 | * The Regents of the University of California. All rights reserved. | 4 | * The Regents of the University of California. All rights reserved. |
@@ -32,7 +32,7 @@ | |||
32 | #include <stdlib.h> | 32 | #include <stdlib.h> |
33 | 33 | ||
34 | static __inline char *med3(char *, char *, char *, int (*)(const void *, const void *)); | 34 | static __inline char *med3(char *, char *, char *, int (*)(const void *, const void *)); |
35 | static __inline void swapfunc(char *, char *, int, int); | 35 | static __inline void swapfunc(char *, char *, size_t, int); |
36 | 36 | ||
37 | #define min(a, b) (a) < (b) ? a : b | 37 | #define min(a, b) (a) < (b) ? a : b |
38 | 38 | ||
@@ -40,7 +40,7 @@ static __inline void swapfunc(char *, char *, int, int); | |||
40 | * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". | 40 | * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". |
41 | */ | 41 | */ |
42 | #define swapcode(TYPE, parmi, parmj, n) { \ | 42 | #define swapcode(TYPE, parmi, parmj, n) { \ |
43 | long i = (n) / sizeof (TYPE); \ | 43 | size_t i = (n) / sizeof (TYPE); \ |
44 | TYPE *pi = (TYPE *) (parmi); \ | 44 | TYPE *pi = (TYPE *) (parmi); \ |
45 | TYPE *pj = (TYPE *) (parmj); \ | 45 | TYPE *pj = (TYPE *) (parmj); \ |
46 | do { \ | 46 | do { \ |
@@ -54,7 +54,7 @@ static __inline void swapfunc(char *, char *, int, int); | |||
54 | es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; | 54 | es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; |
55 | 55 | ||
56 | static __inline void | 56 | static __inline void |
57 | swapfunc(char *a, char *b, int n, int swaptype) | 57 | swapfunc(char *a, char *b, size_t n, int swaptype) |
58 | { | 58 | { |
59 | if (swaptype <= 1) | 59 | if (swaptype <= 1) |
60 | swapcode(long, a, b, n) | 60 | swapcode(long, a, b, n) |
@@ -84,7 +84,8 @@ void | |||
84 | qsort(void *aa, size_t n, size_t es, int (*cmp)(const void *, const void *)) | 84 | qsort(void *aa, size_t n, size_t es, int (*cmp)(const void *, const void *)) |
85 | { | 85 | { |
86 | char *pa, *pb, *pc, *pd, *pl, *pm, *pn; | 86 | char *pa, *pb, *pc, *pd, *pl, *pm, *pn; |
87 | int d, r, swaptype, swap_cnt; | 87 | int cmp_result, swaptype, swap_cnt; |
88 | size_t d, r; | ||
88 | char *a = aa; | 89 | char *a = aa; |
89 | 90 | ||
90 | loop: SWAPINIT(a, es); | 91 | loop: SWAPINIT(a, es); |
@@ -113,16 +114,16 @@ loop: SWAPINIT(a, es); | |||
113 | 114 | ||
114 | pc = pd = (char *)a + (n - 1) * es; | 115 | pc = pd = (char *)a + (n - 1) * es; |
115 | for (;;) { | 116 | for (;;) { |
116 | while (pb <= pc && (r = cmp(pb, a)) <= 0) { | 117 | while (pb <= pc && (cmp_result = cmp(pb, a)) <= 0) { |
117 | if (r == 0) { | 118 | if (cmp_result == 0) { |
118 | swap_cnt = 1; | 119 | swap_cnt = 1; |
119 | swap(pa, pb); | 120 | swap(pa, pb); |
120 | pa += es; | 121 | pa += es; |
121 | } | 122 | } |
122 | pb += es; | 123 | pb += es; |
123 | } | 124 | } |
124 | while (pb <= pc && (r = cmp(pc, a)) >= 0) { | 125 | while (pb <= pc && (cmp_result = cmp(pc, a)) >= 0) { |
125 | if (r == 0) { | 126 | if (cmp_result == 0) { |
126 | swap_cnt = 1; | 127 | swap_cnt = 1; |
127 | swap(pc, pd); | 128 | swap(pc, pd); |
128 | pd -= es; | 129 | pd -= es; |