about summary refs log tree commit diff
path: root/misc
diff options
context:
space:
mode:
Diffstat (limited to 'misc')
-rw-r--r--misc/lsearch.c58
-rw-r--r--misc/search.h23
-rw-r--r--misc/tsearch.c22
3 files changed, 88 insertions, 15 deletions
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 <drepper@cygnus.com>, 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 <search.h>
+#include <string.h>
+
+
+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;
+}
diff --git a/misc/search.h b/misc/search.h
index 31c4f03a1f..5e237a2791 100644
--- a/misc/search.h
+++ b/misc/search.h
@@ -1,5 +1,5 @@
 /* search.h -- declarations for System V style searching functions.
-Copyright (C) 1995 Free Software Foundation, Inc.
+Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -106,12 +106,18 @@ VISIT;
 
 extern void *tsearch __P ((__const void * __key, void **__rootp,
 			   __compar_fn_t compar));
+extern void *__tsearch __P ((__const void * __key, void **__rootp,
+			     __compar_fn_t compar));
 
 extern void *tfind __P ((__const void * __key, __const void ** __rootp,
 			 __compar_fn_t compar));
+extern void *__tfind __P ((__const void * __key, __const void ** __rootp,
+			   __compar_fn_t compar));
 
 extern void *tdelete __P ((__const void * __key, void ** __rootp,
 			   __compar_fn_t compar));
+extern void *__tdelete __P ((__const void * __key, void ** __rootp,
+			     __compar_fn_t compar));
 
 #ifndef __ACTION_FN_T
 #define __ACTION_FN_T
@@ -122,14 +128,19 @@ typedef void (*__action_fn_t) __P ((__const void *__nodep,
 
 extern void twalk __P ((__const void * __root, __action_fn_t action));
 
+extern void __twalk __P ((__const void * __root, __action_fn_t action));
+
 
-extern void * lfind __P ((__const void * __key, __const void * __base,
-			  size_t * __nmemb, size_t __size,
+/* Perform linear search for KEY by comparing by COMPAR in an array
+   [BASE,BASE+NMEMB*SIZE).  */
+extern void * lfind __P ((__const void *__key, __const void *__base,
+			  size_t *__nmemb, size_t __size,
 			  __compar_fn_t __compar));
 
-extern void * lsearch __P ((__const void * __key, __const void * __base,
-			    size_t * __nmemb, size_t __size,
-			    __compar_fn_t __compar));
+/* Perform linear search for KEY by comparing by COMPAR function in
+   array [BASE,BASE+NMEMB*SIZE) and insert entry if not found.  */
+extern void * lsearch __P ((__const void *__key, void *__base, size_t *__nmemb,
+			    size_t __size, __compar_fn_t __compar));
 
 __END_DECLS
 
diff --git a/misc/tsearch.c b/misc/tsearch.c
index cb06b7d8c8..deff96c478 100644
--- a/misc/tsearch.c
+++ b/misc/tsearch.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -18,11 +18,11 @@ Boston, MA 02111-1307, USA.  */
 
 /* Tree search generalized from Knuth (6.2.2) Algorithm T just like
    the AT&T man page says.
-  
+
    The node_t structure is for internal use only, lint doesn't grok it.
-  
+
    Written by reading the System V Interface Definition, not the code.
-  
+
    Totally public domain.  */
 /*LINTLIBRARY*/
 
@@ -52,7 +52,7 @@ node	**rootp;	 address of tree root
 int	(*compar)();	 ordering function
 */
 void *
-tsearch (key, vrootp, compar)
+__tsearch (key, vrootp, compar)
      const void *key;
      void **vrootp;
      __compar_fn_t compar;
@@ -85,10 +85,11 @@ tsearch (key, vrootp, compar)
 
   return q;
 }
+weak_alias (__tsearch, tsearch)
 
 
 void *
-tfind (key, vrootp, compar)
+__tfind (key, vrootp, compar)
      const void *key;
      const void **vrootp;
      __compar_fn_t compar;
@@ -112,6 +113,7 @@ tfind (key, vrootp, compar)
     }
     return NULL;
 }
+weak_alias (__tfind, tfind)
 
 
 /* delete node with given key
@@ -120,7 +122,7 @@ node	**rootp;	address of the root of tree
 int	(*compar)();	comparison function
 */
 void *
-tdelete (key, vrootp, compar)
+__tdelete (key, vrootp, compar)
      const void *key;
      void **vrootp;
      __compar_fn_t compar;
@@ -168,6 +170,7 @@ tdelete (key, vrootp, compar)
   *rootp = q;				/* link parent to new node */
   return p;
 }
+weak_alias (__tfind, tfind)
 
 
 /* Walk the nodes of a tree
@@ -198,13 +201,13 @@ trecurse (vroot, action, level)
 }
 
 
-/* void twalk(root, action)	Walk the nodes of a tree 
+/* void twalk(root, action)	Walk the nodes of a tree
 node	*root;			Root of the tree to be walked
 void	(*action)();		Function to be called at each node
 PTR
 */
 void
-twalk (vroot, action)
+__twalk (vroot, action)
      const void *vroot;
      __action_fn_t action;
 {
@@ -213,3 +216,4 @@ twalk (vroot, action)
   if (root != NULL && action != NULL)
     trecurse (root, action, 0);
 }
+weak_alias (__twalk, twalk)