diff options
Diffstat (limited to 'libc/misc/search/lsearch.c')
-rw-r--r-- | libc/misc/search/lsearch.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/libc/misc/search/lsearch.c b/libc/misc/search/lsearch.c new file mode 100644 index 000000000..2a9996d47 --- /dev/null +++ b/libc/misc/search/lsearch.c @@ -0,0 +1,46 @@ +/* + * This file lifted in toto from 'Dlibs' on the atari ST (RdeBath) + * + * + * Dale Schumacher 399 Beacon Ave. + * (alias: Dalnefre') St. Paul, MN 55104 + * dal@syntel.UUCP United States of America + * "It's not reality that's important, but how you perceive things." + */ + +#include <string.h> +#include <stdio.h> +#include <search.h> + +#ifdef L_lfind + +void *lfind(const void *key, const void *base, size_t *nmemb, + size_t size, int (*compar)(const void *, const void *)) +{ + register int n = *nmemb; + + while (n--) { + if ((*compar) (base, key) == 0) + return ((void*)base); + base += size; + } + return (NULL); +} + +#endif + +#ifdef L_lsearch + +void *lsearch(const void *key, void *base, size_t *nmemb, + size_t size, int (*compar)(const void *, const void *)) +{ + register char *p; + + if ((p = lfind(key, base, nmemb, size, compar)) == NULL) { + p = memcpy((base + (size * (*nmemb))), key, size); + ++(*nmemb); + } + return (p); +} + +#endif |