Blame misc/search.h

Packit Service 82fcde
/* Declarations for System V style searching functions.
Packit Service 82fcde
   Copyright (C) 1995-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#ifndef _SEARCH_H
Packit Service 82fcde
#define	_SEARCH_H 1
Packit Service 82fcde
Packit Service 82fcde
#include <features.h>
Packit Service 82fcde
Packit Service 82fcde
#define __need_size_t
Packit Service 82fcde
#include <stddef.h>
Packit Service 82fcde
Packit Service 82fcde
__BEGIN_DECLS
Packit Service 82fcde
Packit Service 82fcde
#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
Packit Service 82fcde
/* Prototype structure for a linked-list data structure.
Packit Service 82fcde
   This is the type used by the `insque' and `remque' functions.  */
Packit Service 82fcde
Packit Service 82fcde
# ifdef __USE_GNU
Packit Service 82fcde
struct qelem
Packit Service 82fcde
  {
Packit Service 82fcde
    struct qelem *q_forw;
Packit Service 82fcde
    struct qelem *q_back;
Packit Service 82fcde
    char q_data[1];
Packit Service 82fcde
  };
Packit Service 82fcde
# endif
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Insert ELEM into a doubly-linked list, after PREV.  */
Packit Service 82fcde
extern void insque (void *__elem, void *__prev) __THROW;
Packit Service 82fcde
Packit Service 82fcde
/* Unlink ELEM from the doubly-linked list that it is in.  */
Packit Service 82fcde
extern void remque (void *__elem) __THROW;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* For use with hsearch(3).  */
Packit Service 82fcde
#ifndef __COMPAR_FN_T
Packit Service 82fcde
# define __COMPAR_FN_T
Packit Service 82fcde
typedef int (*__compar_fn_t) (const void *, const void *);
Packit Service 82fcde
Packit Service 82fcde
# ifdef	__USE_GNU
Packit Service 82fcde
typedef __compar_fn_t comparison_fn_t;
Packit Service 82fcde
# endif
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Action which shall be performed in the call the hsearch.  */
Packit Service 82fcde
typedef enum
Packit Service 82fcde
  {
Packit Service 82fcde
    FIND,
Packit Service 82fcde
    ENTER
Packit Service 82fcde
  }
Packit Service 82fcde
ACTION;
Packit Service 82fcde
Packit Service 82fcde
typedef struct entry
Packit Service 82fcde
  {
Packit Service 82fcde
    char *key;
Packit Service 82fcde
    void *data;
Packit Service 82fcde
  }
Packit Service 82fcde
ENTRY;
Packit Service 82fcde
Packit Service 82fcde
/* Opaque type for internal use.  */
Packit Service 82fcde
struct _ENTRY;
Packit Service 82fcde
Packit Service 82fcde
/* Family of hash table handling functions.  The functions also
Packit Service 82fcde
   have reentrant counterparts ending with _r.  The non-reentrant
Packit Service 82fcde
   functions all work on a signle internal hashing table.  */
Packit Service 82fcde
Packit Service 82fcde
/* Search for entry matching ITEM.key in internal hash table.  If
Packit Service 82fcde
   ACTION is `FIND' return found entry or signal error by returning
Packit Service 82fcde
   NULL.  If ACTION is `ENTER' replace existing data (if any) with
Packit Service 82fcde
   ITEM.data.  */
Packit Service 82fcde
extern ENTRY *hsearch (ENTRY __item, ACTION __action) __THROW;
Packit Service 82fcde
Packit Service 82fcde
/* Create a new hashing table which will at most contain NEL elements.  */
Packit Service 82fcde
extern int hcreate (size_t __nel) __THROW;
Packit Service 82fcde
Packit Service 82fcde
/* Destroy current internal hashing table.  */
Packit Service 82fcde
extern void hdestroy (void) __THROW;
Packit Service 82fcde
Packit Service 82fcde
#ifdef __USE_GNU
Packit Service 82fcde
/* Data type for reentrant functions.  */
Packit Service 82fcde
struct hsearch_data
Packit Service 82fcde
  {
Packit Service 82fcde
    struct _ENTRY *table;
Packit Service 82fcde
    unsigned int size;
Packit Service 82fcde
    unsigned int filled;
Packit Service 82fcde
  };
Packit Service 82fcde
Packit Service 82fcde
/* Reentrant versions which can handle multiple hashing tables at the
Packit Service 82fcde
   same time.  */
Packit Service 82fcde
extern int hsearch_r (ENTRY __item, ACTION __action, ENTRY **__retval,
Packit Service 82fcde
		      struct hsearch_data *__htab) __THROW;
Packit Service 82fcde
extern int hcreate_r (size_t __nel, struct hsearch_data *__htab) __THROW;
Packit Service 82fcde
extern void hdestroy_r (struct hsearch_data *__htab) __THROW;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* The tsearch routines are very interesting. They make many
Packit Service 82fcde
   assumptions about the compiler.  It assumes that the first field
Packit Service 82fcde
   in node must be the "key" field, which points to the datum.
Packit Service 82fcde
   Everything depends on that.  */
Packit Service 82fcde
/* For tsearch */
Packit Service 82fcde
typedef enum
Packit Service 82fcde
{
Packit Service 82fcde
  preorder,
Packit Service 82fcde
  postorder,
Packit Service 82fcde
  endorder,
Packit Service 82fcde
  leaf
Packit Service 82fcde
}
Packit Service 82fcde
VISIT;
Packit Service 82fcde
Packit Service 82fcde
/* Search for an entry matching the given KEY in the tree pointed to
Packit Service 82fcde
   by *ROOTP and insert a new element if not found.  */
Packit Service 82fcde
extern void *tsearch (const void *__key, void **__rootp,
Packit Service 82fcde
		      __compar_fn_t __compar);
Packit Service 82fcde
Packit Service 82fcde
/* Search for an entry matching the given KEY in the tree pointed to
Packit Service 82fcde
   by *ROOTP.  If no matching entry is available return NULL.  */
Packit Service 82fcde
extern void *tfind (const void *__key, void *const *__rootp,
Packit Service 82fcde
		    __compar_fn_t __compar);
Packit Service 82fcde
Packit Service 82fcde
/* Remove the element matching KEY from the tree pointed to by *ROOTP.  */
Packit Service 82fcde
extern void *tdelete (const void *__restrict __key,
Packit Service 82fcde
		      void **__restrict __rootp,
Packit Service 82fcde
		      __compar_fn_t __compar);
Packit Service 82fcde
Packit Service 82fcde
#ifndef __ACTION_FN_T
Packit Service 82fcde
# define __ACTION_FN_T
Packit Service 82fcde
typedef void (*__action_fn_t) (const void *__nodep, VISIT __value,
Packit Service 82fcde
			       int __level);
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Walk through the whole tree and call the ACTION callback for every node
Packit Service 82fcde
   or leaf.  */
Packit Service 82fcde
extern void twalk (const void *__root, __action_fn_t __action);
Packit Service 82fcde
Packit Service 82fcde
#ifdef __USE_GNU
Packit Service 82fcde
/* Callback type for function to free a tree node.  If the keys are atomic
Packit Service 82fcde
   data this function should do nothing.  */
Packit Service 82fcde
typedef void (*__free_fn_t) (void *__nodep);
Packit Service 82fcde
Packit Service 82fcde
/* Destroy the whole tree, call FREEFCT for each node or leaf.  */
Packit Service 82fcde
extern void tdestroy (void *__root, __free_fn_t __freefct);
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Perform linear search for KEY by comparing by COMPAR in an array
Packit Service 82fcde
   [BASE,BASE+NMEMB*SIZE).  */
Packit Service 82fcde
extern void *lfind (const void *__key, const void *__base,
Packit Service 82fcde
		    size_t *__nmemb, size_t __size, __compar_fn_t __compar);
Packit Service 82fcde
Packit Service 82fcde
/* Perform linear search for KEY by comparing by COMPAR function in
Packit Service 82fcde
   array [BASE,BASE+NMEMB*SIZE) and insert entry if not found.  */
Packit Service 82fcde
extern void *lsearch (const void *__key, void *__base,
Packit Service 82fcde
		      size_t *__nmemb, size_t __size, __compar_fn_t __compar);
Packit Service 82fcde
Packit Service 82fcde
__END_DECLS
Packit Service 82fcde
Packit Service 82fcde
#endif /* search.h */