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. 47ec7d1254SRuslan Ermilov.Pp 48ec7d1254SRuslan ErmilovThe 49ec7d1254SRuslan Ermilov.Fn hsearch 50ec7d1254SRuslan Ermilovfunction is a hash-table search routine. 51ec7d1254SRuslan ErmilovIt returns a pointer into a hash table 52ec7d1254SRuslan Ermilovindicating the location at which an entry can be found. 53ec7d1254SRuslan ErmilovThe 54ec7d1254SRuslan Ermilov.Fa item 55ec7d1254SRuslan Ermilovargument is a structure of type 56ec7d1254SRuslan Ermilov.Vt ENTRY 57ec7d1254SRuslan Ermilov(defined in the 58ec7d1254SRuslan Ermilov.Aq Pa search.h 59ec7d1254SRuslan Ermilovheader) containing two pointers: 60ec7d1254SRuslan Ermilov.Fa item.key 61ec7d1254SRuslan Ermilovpoints to the comparison key (a 62ec7d1254SRuslan Ermilov.Vt "char *" ) , 63ec7d1254SRuslan Ermilovand 64ec7d1254SRuslan Ermilov.Fa item.data 65ec7d1254SRuslan Ermilov(a 66ec7d1254SRuslan Ermilov.Vt "void *" ) 67ec7d1254SRuslan Ermilovpoints to any other data to be associated with 68ec7d1254SRuslan Ermilovthat key. 69ec7d1254SRuslan ErmilovThe comparison function used by 70ec7d1254SRuslan Ermilov.Fn hsearch 71ec7d1254SRuslan Ermilovis 72ec7d1254SRuslan Ermilov.Xr strcmp 3 . 73ec7d1254SRuslan ErmilovThe 74ec7d1254SRuslan Ermilov.Fa action 75ec7d1254SRuslan Ermilovargument is a 76ec7d1254SRuslan Ermilovmember of an enumeration type 77ec7d1254SRuslan Ermilov.Vt ACTION 78ec7d1254SRuslan Ermilovindicating the disposition of the entry if it cannot be 79ec7d1254SRuslan Ermilovfound in the table. 80ec7d1254SRuslan Ermilov.Dv ENTER 81ec7d1254SRuslan Ermilovindicates that the 82ec7d1254SRuslan Ermilov.Fa item 83ec7d1254SRuslan Ermilovshould be inserted in the table at an 84ec7d1254SRuslan Ermilovappropriate point. 85ec7d1254SRuslan Ermilov.Dv FIND 86ec7d1254SRuslan Ermilovindicates that no entry should be made. 87ec7d1254SRuslan ErmilovUnsuccessful resolution is 88ec7d1254SRuslan Ermilovindicated by the return of a 89ec7d1254SRuslan Ermilov.Dv NULL 90ec7d1254SRuslan Ermilovpointer. 91ec7d1254SRuslan Ermilov.Sh RETURN VALUES 92ec7d1254SRuslan ErmilovThe 93ec7d1254SRuslan Ermilov.Fn hcreate 94ec7d1254SRuslan Ermilovfunction returns 0 if it cannot allocate sufficient space for the table; 95ec7d1254SRuslan Ermilovotherwise, it returns non-zero. 96ec7d1254SRuslan Ermilov.Pp 97ec7d1254SRuslan ErmilovThe 98ec7d1254SRuslan Ermilov.Fn hdestroy 99ec7d1254SRuslan Ermilovfunction does not return a value. 100ec7d1254SRuslan Ermilov.Pp 101ec7d1254SRuslan ErmilovThe 102ec7d1254SRuslan Ermilov.Fn hsearch 103ec7d1254SRuslan Ermilovfunction returns a 104ec7d1254SRuslan Ermilov.Dv NULL 105ec7d1254SRuslan Ermilovpointer if either the 106ec7d1254SRuslan Ermilov.Fa action 107ec7d1254SRuslan Ermilovis 108ec7d1254SRuslan Ermilov.Dv FIND 109ec7d1254SRuslan Ermilovand the 110ec7d1254SRuslan Ermilov.Fa item 111ec7d1254SRuslan Ermilovcould not be found or the 112ec7d1254SRuslan Ermilov.Fa action 113ec7d1254SRuslan Ermilovis 114ec7d1254SRuslan Ermilov.Dv ENTER 115ec7d1254SRuslan Ermilovand the table is full. 116ec7d1254SRuslan Ermilov.Sh ERRORS 117ec7d1254SRuslan ErmilovThe 118ec7d1254SRuslan Ermilov.Fn hcreate 119ec7d1254SRuslan Ermilovand 120ec7d1254SRuslan Ermilov.Fn hsearch 121ec7d1254SRuslan Ermilovfunctions may fail if: 122ec7d1254SRuslan Ermilov.Bl -tag -width Er 123ec7d1254SRuslan Ermilov.It Bq Er ENOMEM 124ec7d1254SRuslan ErmilovInsufficient storage space is available. 125ec7d1254SRuslan Ermilov.El 126ec7d1254SRuslan Ermilov.Sh EXAMPLES 127ec7d1254SRuslan ErmilovThe following example reads in strings followed by two numbers 128ec7d1254SRuslan Ermilovand stores them in a hash table, discarding duplicates. 129ec7d1254SRuslan ErmilovIt then reads in strings and finds the matching entry in the hash 130ec7d1254SRuslan Ermilovtable and prints it out. 131ec7d1254SRuslan Ermilov.Bd -literal 132ec7d1254SRuslan Ermilov#include <stdio.h> 133ec7d1254SRuslan Ermilov#include <search.h> 134ec7d1254SRuslan Ermilov#include <string.h> 135ec7d1254SRuslan Ermilov 136ec7d1254SRuslan Ermilovstruct info { /* This is the info stored in the table */ 137ec7d1254SRuslan Ermilov int age, room; /* other than the key. */ 138ec7d1254SRuslan Ermilov}; 139ec7d1254SRuslan Ermilov 140ec7d1254SRuslan Ermilov#define NUM_EMPL 5000 /* # of elements in search table. */ 141ec7d1254SRuslan Ermilov 142ec7d1254SRuslan Ermilovint 143ec7d1254SRuslan Ermilovmain(void) 144ec7d1254SRuslan Ermilov{ 145ec7d1254SRuslan Ermilov char string_space[NUM_EMPL*20]; /* Space to store strings. */ 146ec7d1254SRuslan Ermilov struct info info_space[NUM_EMPL]; /* Space to store employee info. */ 147ec7d1254SRuslan Ermilov char *str_ptr = string_space; /* Next space in string_space. */ 148ec7d1254SRuslan Ermilov struct info *info_ptr = info_space; /* Next space in info_space. */ 149ec7d1254SRuslan Ermilov ENTRY item; 150ec7d1254SRuslan Ermilov ENTRY *found_item; /* Name to look for in table. */ 151ec7d1254SRuslan Ermilov char name_to_find[30]; 152ec7d1254SRuslan Ermilov int i = 0; 153ec7d1254SRuslan Ermilov 154ec7d1254SRuslan Ermilov /* Create table; no error checking is performed. */ 155ec7d1254SRuslan Ermilov (void) hcreate(NUM_EMPL); 156ec7d1254SRuslan Ermilov 157ec7d1254SRuslan Ermilov while (scanf("%s%d%d", str_ptr, &info_ptr->age, 158ec7d1254SRuslan Ermilov &info_ptr->room) != EOF && i++ < NUM_EMPL) { 159ec7d1254SRuslan Ermilov /* Put information in structure, and structure in item. */ 160ec7d1254SRuslan Ermilov item.key = str_ptr; 161ec7d1254SRuslan Ermilov item.data = info_ptr; 162ec7d1254SRuslan Ermilov str_ptr += strlen(str_ptr) + 1; 163ec7d1254SRuslan Ermilov info_ptr++; 164ec7d1254SRuslan Ermilov /* Put item into table. */ 165ec7d1254SRuslan Ermilov (void) hsearch(item, ENTER); 166ec7d1254SRuslan Ermilov } 167ec7d1254SRuslan Ermilov 168ec7d1254SRuslan Ermilov /* Access table. */ 169ec7d1254SRuslan Ermilov item.key = name_to_find; 170ec7d1254SRuslan Ermilov while (scanf("%s", item.key) != EOF) { 171ec7d1254SRuslan Ermilov if ((found_item = hsearch(item, FIND)) != NULL) { 172ec7d1254SRuslan Ermilov /* If item is in the table. */ 173e25e8ab4SRuslan Ermilov (void)printf("found %s, age = %d, room = %d\en", 174ec7d1254SRuslan Ermilov found_item->key, 175ec7d1254SRuslan Ermilov ((struct info *)found_item->data)->age, 176ec7d1254SRuslan Ermilov ((struct info *)found_item->data)->room); 177ec7d1254SRuslan Ermilov } else 178e25e8ab4SRuslan Ermilov (void)printf("no such employee %s\en", name_to_find); 179ec7d1254SRuslan Ermilov } 180ec7d1254SRuslan Ermilov return 0; 181ec7d1254SRuslan Ermilov} 182ec7d1254SRuslan Ermilov.Ed 183ec7d1254SRuslan Ermilov.Sh SEE ALSO 184ec7d1254SRuslan Ermilov.Xr bsearch 3 , 185ec7d1254SRuslan Ermilov.Xr lsearch 3 , 186ec7d1254SRuslan Ermilov.Xr malloc 3 , 187ec7d1254SRuslan Ermilov.Xr strcmp 3 , 188ec7d1254SRuslan Ermilov.Xr tsearch 3 189ec7d1254SRuslan Ermilov.Sh STANDARDS 190ec7d1254SRuslan ErmilovThe 191ec7d1254SRuslan Ermilov.Fn hcreate , 192ec7d1254SRuslan Ermilov.Fn hdestroy , 193ec7d1254SRuslan Ermilovand 194ec7d1254SRuslan Ermilov.Fn hsearch 195ec7d1254SRuslan Ermilovfunctions conform to 196ec7d1254SRuslan Ermilov.St -xpg4.2 . 197ec7d1254SRuslan Ermilov.Sh HISTORY 198ec7d1254SRuslan ErmilovThe 199ec7d1254SRuslan Ermilov.Fn hcreate , 200ec7d1254SRuslan Ermilov.Fn hdestroy , 201ec7d1254SRuslan Ermilovand 202ec7d1254SRuslan Ermilov.Fn hsearch 203ec7d1254SRuslan Ermilovfunctions first appeared in 204ec7d1254SRuslan Ermilov.At V . 205ec7d1254SRuslan Ermilov.Sh BUGS 206ec7d1254SRuslan ErmilovThe interface permits the use of only one hash table at a time. 207