summaryrefslogtreecommitdiff
path: root/lib/libc/stdlib
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2019-07-17 19:29:55 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2019-07-17 19:29:55 +0000
commit345e740a1bd30cd8511dfc0957dc0eaef4353d5c (patch)
treefbd5f56cd41d399ff1ca246a514568e25a586f3c /lib/libc/stdlib
parentc73bd00a147bd24cb3cc05a16cfff9a971df97d1 (diff)
Notes
Diffstat (limited to 'lib/libc/stdlib')
-rw-r--r--lib/libc/stdlib/bsearch.347
1 files changed, 28 insertions, 19 deletions
diff --git a/lib/libc/stdlib/bsearch.3 b/lib/libc/stdlib/bsearch.3
index 87f4cc862204..9b93cb6164ed 100644
--- a/lib/libc/stdlib/bsearch.3
+++ b/lib/libc/stdlib/bsearch.3
@@ -32,7 +32,7 @@
.\" @(#)bsearch.3 8.3 (Berkeley) 4/19/94
.\" $FreeBSD$
.\"
-.Dd May 15, 2019
+.Dd July 17, 2019
.Dt BSEARCH 3
.Os
.Sh NAME
@@ -93,26 +93,29 @@ A sample program that searches people by age in a sorted array:
#include <string.h>
struct person {
- char name[5];
- int age;
+ const char *name;
+ int age;
};
-int
-compare(const void *key, const void *array_member)
+static int
+compare(const void *a, const void *b)
{
- int age = (intptr_t) key;
- struct person person = *(struct person *) array_member;
+ const int *age;
+ const struct person *person;
- return (age - person.age);
+ age = a;
+ person = b;
+
+ return (*age - person->age);
}
int
-main()
+main(void)
{
struct person *friend;
-
+ int age;
/* Sorted array */
- struct person friends[6] = {
+ const struct person friends[] = {
{ "paul", 22 },
{ "anne", 25 },
{ "fred", 25 },
@@ -120,22 +123,28 @@ main()
{ "mark", 35 },
{ "bill", 50 }
};
+ const size_t len = sizeof(friends) / sizeof(friends[0]);
- size_t array_size = sizeof(friends) / sizeof(struct person);
-
- friend = bsearch((void *)22, &friends, array_size, sizeof(struct person), compare);
+ age = 22;
+ friend = bsearch(&age, friends, len, sizeof(friends[0]), compare);
assert(strcmp(friend->name, "paul") == 0);
printf("name: %s\enage: %d\en", friend->name, friend->age);
- friend = bsearch((void *)25, &friends, array_size, sizeof(struct person), compare);
- assert(strcmp(friend->name, "fred") == 0 || strcmp(friend->name, "anne") == 0);
+ age = 25;
+ friend = bsearch(&age, friends, len, sizeof(friends[0]), compare);
+
+ /*
+ * For multiple elements with the same key, it is implementation
+ * defined which will be returned
+ */
+ assert(strcmp(friend->name, "fred") == 0 ||
+ strcmp(friend->name, "anne") == 0);
printf("name: %s\enage: %d\en", friend->name, friend->age);
- friend = bsearch((void *)30, &friends, array_size, sizeof(struct person), compare);
+ age = 30;
+ friend = bsearch(&age, friends, len, sizeof(friends[0]), compare);
assert(friend == NULL);
printf("friend aged 30 not found\en");
-
- return (EXIT_SUCCESS);
}
.Ed
.Sh SEE ALSO