summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorotto <>2010-02-08 11:04:07 +0000
committerotto <>2010-02-08 11:04:07 +0000
commit2f8099199567a7110e7f8796aa42725ee02c3228 (patch)
tree72f9b455fc823d14d0b230fc9a8dbcf948b3c446 /src
parent4f004dc5b722b4416b1caa9b67a193262b76772e (diff)
downloadopenbsd-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.c19
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
34static __inline char *med3(char *, char *, char *, int (*)(const void *, const void *)); 34static __inline char *med3(char *, char *, char *, int (*)(const void *, const void *));
35static __inline void swapfunc(char *, char *, int, int); 35static __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
56static __inline void 56static __inline void
57swapfunc(char *a, char *b, int n, int swaptype) 57swapfunc(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
84qsort(void *aa, size_t n, size_t es, int (*cmp)(const void *, const void *)) 84qsort(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
90loop: SWAPINIT(a, es); 91loop: 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;