/* Declarations for System V style searching functions.
   Copyright (C) 1995-1999, 2000 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
   modify it under the terms of the GNU Lesser General Public License as
   published by the Free Software Foundation; either version 2.1 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser 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.  */

#ifndef _SEARCH_H
#define	_SEARCH_H 1

#include <features.h>

#define __need_size_t
#include <stddef.h>

__BEGIN_DECLS

#if defined __USE_SVID || defined __USE_XOPEN_EXTENDED
/* Prototype structure for a linked-list data structure.
   This is the type used by the `insque' and `remque' functions.  */

# ifdef __USE_GNU
struct qelem
  {
    struct qelem *q_forw;
    struct qelem *q_back;
    char q_data[1];
  };
# endif


/* Insert ELEM into a doubly-linked list, after PREV.  */
extern void insque __P ((void *__elem, void *__prev));

/* Unlink ELEM from the doubly-linked list that it is in.  */
extern void remque __P ((void *__elem));
#endif


/* For use with hsearch(3).  */
#ifndef __COMPAR_FN_T
# define __COMPAR_FN_T
typedef int (*__compar_fn_t) __PMT ((__const __ptr_t, __const __ptr_t));

# ifdef	__USE_GNU
typedef __compar_fn_t comparison_fn_t;
# endif
#endif

/* Action which shall be performed in the call the hsearch.  */
typedef enum
  {
    FIND,
    ENTER
  }
ACTION;

typedef struct entry
  {
    char *key;
    void *data;
  }
ENTRY;

/* Opaque type for internal use.  */
struct _ENTRY;

/* Family of hash table handling functions.  The functions also
   have reentrant counterparts ending with _r.  The non-reentrant
   functions all work on a single internal hashing table.  */

/* Search for entry matching ITEM.key in internal hash table.  If
   ACTION is `FIND' return found entry or signal error by returning
   NULL.  If ACTION is `ENTER' replace existing data (if any) with
   ITEM.data.  */
extern ENTRY *hsearch __P ((ENTRY __item, ACTION __action));

/* Create a new hashing table which will at most contain NEL elements.  */
extern int hcreate __P ((size_t __nel));

/* Destroy current internal hashing table.  */
extern void hdestroy __P ((void));

#ifdef __USE_GNU
/* Data type for reentrant functions.  */
struct hsearch_data
  {
    struct _ENTRY *table;
    unsigned int size;
    unsigned int filled;
  };

/* Reentrant versions which can handle multiple hashing tables at the
   same time.  */
extern int hsearch_r __P ((ENTRY __item, ACTION __action, ENTRY **__retval,
			   struct hsearch_data *__htab));
extern int hcreate_r __P ((size_t __nel, struct hsearch_data *__htab));
extern void hdestroy_r __P ((struct hsearch_data *__htab));
#endif


/* The tsearch routines are very interesting. They make many
   assumptions about the compiler.  It assumes that the first field
   in node must be the "key" field, which points to the datum.
   Everything depends on that.  */
/* For tsearch */
typedef enum
{
  preorder,
  postorder,
  endorder,
  leaf
}
VISIT;

/* Search for an entry matching the given KEY in the tree pointed to
   by *ROOTP and insert a new element if not found.  */
extern void *tsearch __PMT ((__const void *__key, void **__rootp,
			     __compar_fn_t __compar));

/* Search for an entry matching the given KEY in the tree pointed to
   by *ROOTP.  If no matching entry is available return NULL.  */
extern void *tfind __PMT ((__const void *__key, void *__const *__rootp,
			   __compar_fn_t __compar));

/* Remove the element matching KEY from the tree pointed to by *ROOTP.  */
extern void *tdelete __PMT ((__const void *__key, void **__rootp,
			     __compar_fn_t __compar));

#ifndef __ACTION_FN_T
# define __ACTION_FN_T
typedef void (*__action_fn_t) __PMT ((__const void *__nodep,
				      VISIT __value,
				      int __level));
#endif

/* Walk through the whole tree and call the ACTION callback for every node
   or leaf.  */
extern void twalk __PMT ((__const void *__root, __action_fn_t __action));

#ifdef __USE_GNU
/* Callback type for function to free a tree node.  If the keys are atomic
   data this function should do nothing.  */
typedef void (*__free_fn_t) __PMT ((void *__nodep));

/* Destroy the whole tree, call FREEFCT for each node or leaf.  */
extern void tdestroy __PMT ((void *__root, __free_fn_t __freefct));
#endif


/* Perform linear search for KEY by comparing by COMPAR in an array
   [BASE,BASE+NMEMB*SIZE).  */
extern void *lfind __PMT ((__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 __PMT ((__const void *__key, void *__base,
			     size_t *__nmemb, size_t __size,
			     __compar_fn_t __compar));

__END_DECLS

#endif /* search.h */
