]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Initial implementation: | |
3 | * Copyright (c) 2002 Robert Drehmel | |
4 | * All rights reserved. | |
5 | * | |
6 | * As long as the above copyright statement and this notice remain | |
7 | * unchanged, you can do what ever you want with this file. | |
8 | */ | |
9 | #include <sys/types.h> | |
10 | #include <sys/cdefs.h> | |
11 | __FBSDID("$FreeBSD: src/lib/libc/stdlib/lsearch.c,v 1.1 2002/10/16 14:29:22 robert Exp $"); | |
12 | ||
13 | #define _SEARCH_PRIVATE | |
14 | #include <search.h> | |
15 | #include <stdint.h> /* for uint8_t */ | |
16 | #include <stdlib.h> /* for NULL */ | |
17 | #include <string.h> /* for memcpy() prototype */ | |
18 | ||
19 | static void *lwork(const void *, const void *, size_t *, size_t, | |
20 | int (*)(const void *, const void *), int); | |
21 | ||
22 | void *lsearch(const void *key, void *base, size_t *nelp, size_t width, | |
23 | int (*compar)(const void *, const void *)) | |
24 | { | |
25 | ||
26 | return (lwork(key, base, nelp, width, compar, 1)); | |
27 | } | |
28 | ||
29 | void *lfind(const void *key, const void *base, size_t *nelp, size_t width, | |
30 | int (*compar)(const void *, const void *)) | |
31 | { | |
32 | ||
33 | return (lwork(key, base, nelp, width, compar, 0)); | |
34 | } | |
35 | ||
36 | static void * | |
37 | lwork(const void *key, const void *base, size_t *nelp, size_t width, | |
38 | int (*compar)(const void *, const void *), int addelem) | |
39 | { | |
40 | uint8_t *ep, *endp; | |
41 | ||
42 | /* | |
43 | * Cast to an integer value first to avoid the warning for removing | |
44 | * 'const' via a cast. | |
45 | */ | |
46 | ep = (uint8_t *)(uintptr_t)base; | |
47 | for (endp = (uint8_t *)(ep + width * *nelp); ep < endp; ep += width) { | |
48 | if (compar(key, ep) == 0) | |
49 | return (ep); | |
50 | } | |
51 | ||
52 | /* lfind() shall return when the key was not found. */ | |
53 | if (!addelem) | |
54 | return (NULL); | |
55 | ||
56 | /* | |
57 | * lsearch() adds the key to the end of the table and increments | |
58 | * the number of elements. | |
59 | */ | |
60 | memcpy(endp, key, width); | |
61 | ++*nelp; | |
62 | ||
63 | return (endp); | |
64 | } |