PostgreSQL Source Code
git master
bsearch_arg.c
Go to the documentation of this file.
1
/*
2
* bsearch_arg.c: bsearch variant with a user-supplied pointer
3
*
4
* Copyright (c) 2021-2024, PostgreSQL Global Development Group
5
* Copyright (c) 1990 Regents of the University of California.
6
* All rights reserved.
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
10
* are met:
11
* 1. Redistributions of source code must retain the above copyright
12
* notice, this list of conditions and the following disclaimer.
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
16
* 3. [rescinded 22 July 1999]
17
* 4. Neither the name of the University nor the names of its contributors
18
* may be used to endorse or promote products derived from this software
19
* without specific prior written permission.
20
*
21
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31
* SUCH DAMAGE.
32
*
33
* src/port/bsearch_arg.c
34
*/
35
36
#include "
c.h
"
37
38
/*
39
* Perform a binary search.
40
*
41
* The code below is a bit sneaky. After a comparison fails, we
42
* divide the work in half by moving either left or right. If lim
43
* is odd, moving left simply involves halving lim: e.g., when lim
44
* is 5 we look at item 2, so we change lim to 2 so that we will
45
* look at items 0 & 1. If lim is even, the same applies. If lim
46
* is odd, moving right again involves halving lim, this time moving
47
* the base up one item past p: e.g., when lim is 5 we change base
48
* to item 3 and make lim 2 so that we will look at items 3 and 4.
49
* If lim is even, however, we have to shrink it by one before
50
* halving: e.g., when lim is 4, we still looked at item 2, so we
51
* have to make lim 3, then halve, obtaining 1, so that we will only
52
* look at item 3.
53
*/
54
void
*
55
bsearch_arg
(
const
void
*
key
,
const
void
*base0,
56
size_t
nmemb,
size_t
size
,
57
int
(*compar) (
const
void
*,
const
void
*,
void
*),
58
void
*
arg
)
59
{
60
const
char
*base = (
const
char
*) base0;
61
size_t
lim;
62
int
cmp
;
63
const
void
*p;
64
65
for
(lim = nmemb; lim != 0; lim >>= 1)
66
{
67
p = base + (lim >> 1) *
size
;
68
cmp
= (*compar) (
key
, p,
arg
);
69
if
(
cmp
== 0)
70
return
(
void
*) p;
71
if
(
cmp
> 0)
72
{
/* key > p: move right */
73
base = (
const
char
*) p +
size
;
74
lim--;
75
}
/* else move left */
76
}
77
return
(NULL);
78
}
bsearch_arg
void * bsearch_arg(const void *key, const void *base0, size_t nmemb, size_t size, int(*compar)(const void *, const void *, void *), void *arg)
Definition:
bsearch_arg.c:55
c.h
sort-test.key
key
Definition:
sort-test.py:19
arg
void * arg
Definition:
pg_backup_utils.c:29
cmp
static int cmp(const chr *x, const chr *y, size_t len)
Definition:
regc_locale.c:743
size
static pg_noinline void Size size
Definition:
slab.c:607
src
port
bsearch_arg.c
Generated on Mon Dec 9 2024 00:13:26 for PostgreSQL Source Code by
1.9.1