From 1be6ec30336a318dd50f9d9a45c8066860ec07f2 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Fri, 7 Jun 1996 04:36:10 +0000 Subject: Fri Jun 7 1996 05:29:32 Ulrich Drepper * misc/lsearch.c: New file. Implementation of lfind and lsearch functions. * misc/search.h: Add prototype for functions from tsearch family with __ prefix. Correct prototype for lsearch: BASE parameter must not be const. * misc/tsearch.c: prepend all global function names with __ and make normal names weak aliases. Fri Jun 7 00:15:24 1996 Roland McGrath * Make-dist (sysdep_dirs): Skip CVS dirs. --- misc/lsearch.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 misc/lsearch.c (limited to 'misc/lsearch.c') diff --git a/misc/lsearch.c b/misc/lsearch.c new file mode 100644 index 0000000000..f062a6882b --- /dev/null +++ b/misc/lsearch.c @@ -0,0 +1,58 @@ +/* Linear search functions. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper , 1996. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include +#include + + +void * +lsearch (const void *key, void *base, size_t *nmemb, size_t size, + __compar_fn_t compar) +{ + void *result; + + /* Try to find it. */ + result = lfind (key, base, nmemb, size, compar); + if (result == NULL) + { + /* Not available. Insert at the end. */ + memcpy (base + (*nmemb) * size, key, size); + ++(*nmemb); + } + + return result; +} + + +void * +lfind (const void *key, const void *base, size_t *nmemb, size_t size, + __compar_fn_t compar) +{ + const void *result = base; + size_t cnt = 0; + + while (cnt < *nmemb && (*compar) (key, result) != 0) + { + result += size; + ++cnt; + } + + return cnt < *nmemb ? (void *) result : NULL; +} -- cgit 1.4.1