hcreate, hdestroy, hsearch, hcreate_r, hdestroy_r, hsearch_r — hash table management
#include <search.h>
int
            hcreate( | 
            size_t | nel); | 
          
ENTRY
            *hsearch( | 
            ENTRY | item, | 
| ACTION | action); | 
          
void
            hdestroy( | 
            void); | 
            
#define _GNU_SOURCE #include <search.h>
int
            hcreate_r( | 
            size_t | nel, | 
| struct hsearch_data * | tab); | 
          
int
            hsearch_r( | 
            ENTRY | item, | 
| ACTION | action, | |
| ENTRY ** | ret, | |
| struct hsearch_data * | tab); | 
          
void
            hdestroy_r( | 
            struct hsearch_data * | tab); | 
          
The three functions hcreate(), hsearch(), and hdestroy() allow the user to create a hash
      table (only one at a time) which associates a key with any
      data.
First the table must be created with the function
      hcreate(). The argument
      nel is an estimate of
      the maximum number of entries in the table. The function
      hcreate() may adjust this value
      upward to improve the performance of the resulting hash
      table.
The corresponding function hdestroy() frees the memory occupied by the
      hash table so that a new table can be constructed.
The argument item
      is of type ENTRY, which is a
      typedef defined in <search.h>
      and includes these elements:
typedef struct entry { char * key;void * data;} ENTRY; 
The field key
      points to the null-terminated string which is the search key.
      The field data points
      to the data associated with that key. The function
      hsearch() searches the hash
      table for an item with the same key as item (where "the same" is
      determined using strcmp(3)), and if
      successful returns a pointer to it. The argument action determines what
      hsearch() does after an
      unsuccessful search. A value of ENTER instructs it to insert a copy of
      item, while a value
      of FIND means to return
      NULL.
The three functions hcreate_r(), hsearch_r(), hdestroy_r() are reentrant versions that
      allow the use of more than one table. The last argument used
      identifies the table. The struct it points to must be zeroed
      before the first call to hcreate_r().
hcreate() and hcreate_r() return 0 when allocation of the
      memory for the hash table fails, nonzero otherwise.
hsearch() returns NULL if
      action is
      ENTER and the hash table is
      full, or action is
      FIND and item cannot be found in the
      hash table.
hsearch_r() returns 0 if
      action is
      ENTER and the hash table is
      full, and nonzero otherwise.
POSIX documents
Out of memory.
The glibc implementation will return the following two errors.
Table full with action set to
            ENTER.
The action
            parameter is FIND and no
            corresponding element is found in the table.
The functions hcreate(),
      hsearch(), and hdestroy() are from SVr4, and are described
      in POSIX.1-2001. The functions hcreate_r(), hsearch_r(), hdestroy_r() are GNU extensions.
SVr4 and POSIX.1-2001 specify that action is significant only for
      unsuccessful searches, so that an ENTER should not do anything for a
      successful search. The libc and glibc implementations update
      the data for the
      given key in this
      case.
Individual hash table entries can be added, but not deleted.
The following program inserts 24 items in to a hash table, then prints some of them.
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
char *data[] = { "alpha", "bravo", "charlie", "delta",
     "echo", "foxtrot", "golf", "hotel", "india", "juliet",
     "kilo", "lima", "mike", "november", "oscar", "papa",
     "quebec", "romeo", "sierra", "tango", "uniform",
     "victor", "whisky", "x−ray", "yankee", "zulu"
};
int
main(void)
{
    ENTRY e, *ep;
    int i;
    /* starting with small table, and letting it grow does not work */
    hcreate(30);
    for (i = 0; i < 24; i++) {
        e.key = data[i];
        /* data is just an integer, instead of a
           pointer to something */
        e.data = (void *) i;
        ep = hsearch(e, ENTER);
        /* there should be no failures */
        if (ep == NULL) {
            fprintf(stderr, "entry failed\n");
            exit(EXIT_FAILURE);
        }
    }
    for (i = 22; i < 26; i++) {
        /* print two entries from the table, and
           show that two are not in the table */
        e.key = data[i];
        ep = hsearch(e, FIND);
        printf("%9.9s −> %9.9s:%d\n", e.key,
               ep ? ep−>key : "NULL", ep ? (int)(ep−>data) : 0);
    }
    exit(EXIT_SUCCESS);
}
      This page is part of release 2.79 of the Linux man-pages project. A
      description of the project, and information about reporting
      bugs, can be found at
      http://www.kernel.org/doc/man-pages/.
| 
                 Copyright 1993 Ulrich Drepper (drepperkarlsruhe.gmd.de) This is free documentation; you can redistribute it and/or modify it under the terms of the GNU 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 General Public License's references to "object code" and "executables" are to be interpreted as the output of any document formatting or typesetting system, including intermediate and printed output. This manual 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this manual; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. References consulted: SunOS 4.1.1 man pages Modified Sat Sep 30 21:52:01 1995 by Jim Van Zandt <jrvvanzandt.mv.com> Remarks from dhwgamgee.acad.emich.edu Fri Jun 19 06:46:31 1998 Modified 2001-12-26, 2003-11-28, 2004-05-20, aeb  |