xref: /freebsd/lib/libc/stdlib/bsearch.3 (revision 3494f7c0)
1.\" Copyright (c) 1990, 1991, 1993, 1994
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" This code is derived from software contributed to Berkeley by
5.\" the American National Standards Committee X3, on Information
6.\" Processing Systems.
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. Neither the name of the University nor the names of its contributors
17.\"    may be used to endorse or promote products derived from this software
18.\"    without specific prior written permission.
19.\"
20.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30.\" SUCH DAMAGE.
31.\"
32.Dd July 17, 2019
33.Dt BSEARCH 3
34.Os
35.Sh NAME
36.Nm bsearch
37.Nd binary search of a sorted table
38.Sh LIBRARY
39.Lb libc
40.Sh SYNOPSIS
41.In stdlib.h
42.Ft void *
43.Fn bsearch "const void *key" "const void *base" "size_t nmemb" "size_t size" "int (*compar) (const void *, const void *)"
44.Sh DESCRIPTION
45The
46.Fn bsearch
47function searches an array of
48.Fa nmemb
49objects, the initial member of which is
50pointed to by
51.Fa base ,
52for a member that matches the object pointed to by
53.Fa key .
54The size of each member of the array is specified by
55.Fa size .
56.Pp
57The contents of the array should be in ascending sorted order according
58to the comparison function referenced by
59.Fa compar .
60The
61.Fa compar
62routine
63is expected to have
64two arguments which point to the
65.Fa key
66object and to an array member, in that order, and should return an integer
67less than, equal to, or greater than zero if the
68.Fa key
69object is found, respectively, to be less than, to match, or be
70greater than the array member.
71See the
72.Fa int_compare
73sample function in
74.Xr qsort 3
75for a comparison function that is also compatible with
76.Fn bsearch .
77.Sh RETURN VALUES
78The
79.Fn bsearch
80function returns a pointer to a matching member of the array, or a null
81pointer if no match is found.
82If two members compare as equal, which member is matched is unspecified.
83.Sh EXAMPLES
84A sample program that searches people by age in a sorted array:
85.Bd -literal
86#include <assert.h>
87#include <stdint.h>
88#include <stdio.h>
89#include <stdlib.h>
90#include <string.h>
91
92struct person {
93	const char 	*name;
94	int 		age;
95};
96
97static int
98compare(const void *a, const void *b)
99{
100	const int *age;
101	const struct person *person;
102
103	age = a;
104	person = b;
105
106	return (*age - person->age);
107}
108
109int
110main(void)
111{
112	struct person *friend;
113	int age;
114	/* Sorted array */
115	const struct person friends[] = {
116		{ "paul", 22 },
117		{ "anne", 25 },
118		{ "fred", 25 },
119		{ "mary", 27 },
120		{ "mark", 35 },
121		{ "bill", 50 }
122	};
123	const size_t len = sizeof(friends) / sizeof(friends[0]);
124
125	age = 22;
126	friend = bsearch(&age, friends, len, sizeof(friends[0]), compare);
127	assert(strcmp(friend->name, "paul") == 0);
128	printf("name: %s\enage: %d\en", friend->name, friend->age);
129
130	age = 25;
131	friend = bsearch(&age, friends, len, sizeof(friends[0]), compare);
132
133	/*
134	 * For multiple elements with the same key, it is implementation
135	 * defined which will be returned
136	 */
137	assert(strcmp(friend->name, "fred") == 0 ||
138	    strcmp(friend->name, "anne") == 0);
139	printf("name: %s\enage: %d\en", friend->name, friend->age);
140
141	age = 30;
142	friend = bsearch(&age, friends, len, sizeof(friends[0]), compare);
143	assert(friend == NULL);
144	printf("friend aged 30 not found\en");
145}
146.Ed
147.Sh SEE ALSO
148.Xr db 3 ,
149.Xr lsearch 3 ,
150.Xr qsort 3
151.\" .Xr tsearch 3
152.Sh STANDARDS
153The
154.Fn bsearch
155function conforms to
156.St -isoC .
157