1ec7d1254SRuslan Ermilov.\" $FreeBSD$ 2ec7d1254SRuslan Ermilov.\" 3ec7d1254SRuslan Ermilov.Dd May 8, 2001 4ec7d1254SRuslan Ermilov.Os 5ec7d1254SRuslan Ermilov.Dt HCREATE 3 6ec7d1254SRuslan Ermilov.Sh NAME 7ec7d1254SRuslan Ermilov.Nm hcreate , hdestroy , hsearch 8ec7d1254SRuslan Ermilov.Nd manage hash search table 9ec7d1254SRuslan Ermilov.Sh LIBRARY 10ec7d1254SRuslan Ermilov.Lb libc 11ec7d1254SRuslan Ermilov.Sh SYNOPSIS 12ec7d1254SRuslan Ermilov.In search.h 13ec7d1254SRuslan Ermilov.Ft int 14ec7d1254SRuslan Ermilov.Fn hcreate "size_t nel" 15ec7d1254SRuslan Ermilov.Ft void 16ec7d1254SRuslan Ermilov.Fn hdestroy void 17ec7d1254SRuslan Ermilov.Ft ENTRY * 18ec7d1254SRuslan Ermilov.Fn hsearch "ENTRY item" "ACTION action" 19ec7d1254SRuslan Ermilov.Sh DESCRIPTION 20ec7d1254SRuslan ErmilovThe 21ec7d1254SRuslan Ermilov.Fn hcreate , 22ec7d1254SRuslan Ermilov.Fn hdestroy , 23ec7d1254SRuslan Ermilovand 24ec7d1254SRuslan Ermilov.Fn hsearch 25ec7d1254SRuslan Ermilovfunctions manage hash search tables. 26ec7d1254SRuslan Ermilov.Pp 27ec7d1254SRuslan ErmilovThe 28ec7d1254SRuslan Ermilov.Fn hcreate 29ec7d1254SRuslan Ermilovfunction allocates sufficient space for the table, and the application should 30ec7d1254SRuslan Ermilovensure it is called before 31ec7d1254SRuslan Ermilov.Fn hsearch 32ec7d1254SRuslan Ermilovis used. 33ec7d1254SRuslan ErmilovThe 34ec7d1254SRuslan Ermilov.Fa nel 35ec7d1254SRuslan Ermilovargument is an estimate of the maximum 36ec7d1254SRuslan Ermilovnumber of entries that the table should contain. 37ec7d1254SRuslan ErmilovThis number may be adjusted upward by the 38ec7d1254SRuslan Ermilovalgorithm in order to obtain certain mathematically favorable circumstances. 39ec7d1254SRuslan Ermilov.Pp 40ec7d1254SRuslan ErmilovThe 41ec7d1254SRuslan Ermilov.Fn hdestroy 42ec7d1254SRuslan Ermilovfunction disposes of the search table, and may be followed by another call to 43ec7d1254SRuslan Ermilov.Fn hcreate . 44ec7d1254SRuslan ErmilovAfter the call to 45ec7d1254SRuslan Ermilov.Fn hdestroy , 46ec7d1254SRuslan Ermilovthe data can no longer be considered accessible. 475560a5abSDavid MaloneThe 485560a5abSDavid Malone.Fn hdestroy 495560a5abSDavid Malonefunction calls 505560a5abSDavid Malone.Xr free 3 515560a5abSDavid Malonefor each comparison key in the search table 525560a5abSDavid Malonebut not the data item associated with the key. 53ec7d1254SRuslan Ermilov.Pp 54ec7d1254SRuslan ErmilovThe 55ec7d1254SRuslan Ermilov.Fn hsearch 56ec7d1254SRuslan Ermilovfunction is a hash-table search routine. 57ec7d1254SRuslan ErmilovIt returns a pointer into a hash table 58ec7d1254SRuslan Ermilovindicating the location at which an entry can be found. 59ec7d1254SRuslan ErmilovThe 60ec7d1254SRuslan Ermilov.Fa item 61ec7d1254SRuslan Ermilovargument is a structure of type 62ec7d1254SRuslan Ermilov.Vt ENTRY 63ec7d1254SRuslan Ermilov(defined in the 64fe08efe6SRuslan Ermilov.In search.h 65ec7d1254SRuslan Ermilovheader) containing two pointers: 66ec7d1254SRuslan Ermilov.Fa item.key 67ec7d1254SRuslan Ermilovpoints to the comparison key (a 68ec7d1254SRuslan Ermilov.Vt "char *" ) , 69ec7d1254SRuslan Ermilovand 70ec7d1254SRuslan Ermilov.Fa item.data 71ec7d1254SRuslan Ermilov(a 72ec7d1254SRuslan Ermilov.Vt "void *" ) 73ec7d1254SRuslan Ermilovpoints to any other data to be associated with 74ec7d1254SRuslan Ermilovthat key. 75ec7d1254SRuslan ErmilovThe comparison function used by 76ec7d1254SRuslan Ermilov.Fn hsearch 77ec7d1254SRuslan Ermilovis 78ec7d1254SRuslan Ermilov.Xr strcmp 3 . 79ec7d1254SRuslan ErmilovThe 80ec7d1254SRuslan Ermilov.Fa action 81ec7d1254SRuslan Ermilovargument is a 82ec7d1254SRuslan Ermilovmember of an enumeration type 83ec7d1254SRuslan Ermilov.Vt ACTION 84ec7d1254SRuslan Ermilovindicating the disposition of the entry if it cannot be 85ec7d1254SRuslan Ermilovfound in the table. 86ec7d1254SRuslan Ermilov.Dv ENTER 87ec7d1254SRuslan Ermilovindicates that the 88ec7d1254SRuslan Ermilov.Fa item 89ec7d1254SRuslan Ermilovshould be inserted in the table at an 90ec7d1254SRuslan Ermilovappropriate point. 91ec7d1254SRuslan Ermilov.Dv FIND 92ec7d1254SRuslan Ermilovindicates that no entry should be made. 93ec7d1254SRuslan ErmilovUnsuccessful resolution is 94ec7d1254SRuslan Ermilovindicated by the return of a 95ec7d1254SRuslan Ermilov.Dv NULL 96ec7d1254SRuslan Ermilovpointer. 975560a5abSDavid Malone.Pp 985560a5abSDavid MaloneThe comparison key (passed to 995560a5abSDavid Malone.Fn hsearch 1005560a5abSDavid Maloneas 1015560a5abSDavid Malone.Fa item.key ) 1025560a5abSDavid Malonemust be allocated using 1035560a5abSDavid Malone.Xr malloc 3 1045560a5abSDavid Maloneif 1055560a5abSDavid Malone.Fa action 1065560a5abSDavid Maloneis 1075560a5abSDavid Malone.Dv ENTER 1085560a5abSDavid Maloneand 1095560a5abSDavid Malone.Fn hdestroy 1105560a5abSDavid Maloneis called. 111ec7d1254SRuslan Ermilov.Sh RETURN VALUES 112ec7d1254SRuslan ErmilovThe 113ec7d1254SRuslan Ermilov.Fn hcreate 114ec7d1254SRuslan Ermilovfunction returns 0 if it cannot allocate sufficient space for the table; 115ec7d1254SRuslan Ermilovotherwise, it returns non-zero. 116ec7d1254SRuslan Ermilov.Pp 117ec7d1254SRuslan ErmilovThe 118ec7d1254SRuslan Ermilov.Fn hdestroy 119ec7d1254SRuslan Ermilovfunction does not return a value. 120ec7d1254SRuslan Ermilov.Pp 121ec7d1254SRuslan ErmilovThe 122ec7d1254SRuslan Ermilov.Fn hsearch 123ec7d1254SRuslan Ermilovfunction returns a 124ec7d1254SRuslan Ermilov.Dv NULL 125ec7d1254SRuslan Ermilovpointer if either the 126ec7d1254SRuslan Ermilov.Fa action 127ec7d1254SRuslan Ermilovis 128ec7d1254SRuslan Ermilov.Dv FIND 129ec7d1254SRuslan Ermilovand the 130ec7d1254SRuslan Ermilov.Fa item 131ec7d1254SRuslan Ermilovcould not be found or the 132ec7d1254SRuslan Ermilov.Fa action 133ec7d1254SRuslan Ermilovis 134ec7d1254SRuslan Ermilov.Dv ENTER 135ec7d1254SRuslan Ermilovand the table is full. 136ec7d1254SRuslan Ermilov.Sh ERRORS 137ec7d1254SRuslan ErmilovThe 138ec7d1254SRuslan Ermilov.Fn hcreate 139ec7d1254SRuslan Ermilovand 140ec7d1254SRuslan Ermilov.Fn hsearch 141ec7d1254SRuslan Ermilovfunctions may fail if: 142ec7d1254SRuslan Ermilov.Bl -tag -width Er 143ec7d1254SRuslan Ermilov.It Bq Er ENOMEM 144ec7d1254SRuslan ErmilovInsufficient storage space is available. 145ec7d1254SRuslan Ermilov.El 146ec7d1254SRuslan Ermilov.Sh EXAMPLES 147ec7d1254SRuslan ErmilovThe following example reads in strings followed by two numbers 148ec7d1254SRuslan Ermilovand stores them in a hash table, discarding duplicates. 149ec7d1254SRuslan ErmilovIt then reads in strings and finds the matching entry in the hash 150ec7d1254SRuslan Ermilovtable and prints it out. 151ec7d1254SRuslan Ermilov.Bd -literal 152ec7d1254SRuslan Ermilov#include <stdio.h> 153ec7d1254SRuslan Ermilov#include <search.h> 154ec7d1254SRuslan Ermilov#include <string.h> 1555560a5abSDavid Malone#include <stdlib.h> 156ec7d1254SRuslan Ermilov 157ec7d1254SRuslan Ermilovstruct info { /* This is the info stored in the table */ 158ec7d1254SRuslan Ermilov int age, room; /* other than the key. */ 159ec7d1254SRuslan Ermilov}; 160ec7d1254SRuslan Ermilov 161ec7d1254SRuslan Ermilov#define NUM_EMPL 5000 /* # of elements in search table. */ 162ec7d1254SRuslan Ermilov 163ec7d1254SRuslan Ermilovint 164ec7d1254SRuslan Ermilovmain(void) 165ec7d1254SRuslan Ermilov{ 1665560a5abSDavid Malone char str[BUFSIZ]; /* Space to read string */ 167ec7d1254SRuslan Ermilov struct info info_space[NUM_EMPL]; /* Space to store employee info. */ 168ec7d1254SRuslan Ermilov struct info *info_ptr = info_space; /* Next space in info_space. */ 169ec7d1254SRuslan Ermilov ENTRY item; 170ec7d1254SRuslan Ermilov ENTRY *found_item; /* Name to look for in table. */ 171ec7d1254SRuslan Ermilov char name_to_find[30]; 172ec7d1254SRuslan Ermilov int i = 0; 173ec7d1254SRuslan Ermilov 174ec7d1254SRuslan Ermilov /* Create table; no error checking is performed. */ 175ec7d1254SRuslan Ermilov (void) hcreate(NUM_EMPL); 176ec7d1254SRuslan Ermilov 1775560a5abSDavid Malone while (scanf("%s%d%d", str, &info_ptr->age, 178ec7d1254SRuslan Ermilov &info_ptr->room) != EOF && i++ < NUM_EMPL) { 179ec7d1254SRuslan Ermilov /* Put information in structure, and structure in item. */ 1805560a5abSDavid Malone item.key = strdup(str); 181ec7d1254SRuslan Ermilov item.data = info_ptr; 182ec7d1254SRuslan Ermilov info_ptr++; 183ec7d1254SRuslan Ermilov /* Put item into table. */ 184ec7d1254SRuslan Ermilov (void) hsearch(item, ENTER); 185ec7d1254SRuslan Ermilov } 186ec7d1254SRuslan Ermilov 187ec7d1254SRuslan Ermilov /* Access table. */ 188ec7d1254SRuslan Ermilov item.key = name_to_find; 189ec7d1254SRuslan Ermilov while (scanf("%s", item.key) != EOF) { 190ec7d1254SRuslan Ermilov if ((found_item = hsearch(item, FIND)) != NULL) { 191ec7d1254SRuslan Ermilov /* If item is in the table. */ 192e25e8ab4SRuslan Ermilov (void)printf("found %s, age = %d, room = %d\en", 193ec7d1254SRuslan Ermilov found_item->key, 194ec7d1254SRuslan Ermilov ((struct info *)found_item->data)->age, 195ec7d1254SRuslan Ermilov ((struct info *)found_item->data)->room); 196ec7d1254SRuslan Ermilov } else 197e25e8ab4SRuslan Ermilov (void)printf("no such employee %s\en", name_to_find); 198ec7d1254SRuslan Ermilov } 1995560a5abSDavid Malone hdestroy(); 200ec7d1254SRuslan Ermilov return 0; 201ec7d1254SRuslan Ermilov} 202ec7d1254SRuslan Ermilov.Ed 203ec7d1254SRuslan Ermilov.Sh SEE ALSO 204ec7d1254SRuslan Ermilov.Xr bsearch 3 , 205ec7d1254SRuslan Ermilov.Xr lsearch 3 , 206ec7d1254SRuslan Ermilov.Xr malloc 3 , 207ec7d1254SRuslan Ermilov.Xr strcmp 3 , 208ec7d1254SRuslan Ermilov.Xr tsearch 3 209ec7d1254SRuslan Ermilov.Sh STANDARDS 210ec7d1254SRuslan ErmilovThe 211ec7d1254SRuslan Ermilov.Fn hcreate , 212ec7d1254SRuslan Ermilov.Fn hdestroy , 213ec7d1254SRuslan Ermilovand 214ec7d1254SRuslan Ermilov.Fn hsearch 215ec7d1254SRuslan Ermilovfunctions conform to 216ec7d1254SRuslan Ermilov.St -xpg4.2 . 217ec7d1254SRuslan Ermilov.Sh HISTORY 218ec7d1254SRuslan ErmilovThe 219ec7d1254SRuslan Ermilov.Fn hcreate , 220ec7d1254SRuslan Ermilov.Fn hdestroy , 221ec7d1254SRuslan Ermilovand 222ec7d1254SRuslan Ermilov.Fn hsearch 223ec7d1254SRuslan Ermilovfunctions first appeared in 224ec7d1254SRuslan Ermilov.At V . 225ec7d1254SRuslan Ermilov.Sh BUGS 226ec7d1254SRuslan ErmilovThe interface permits the use of only one hash table at a time. 227