xref: /freebsd/lib/libc/stdlib/hcreate.3 (revision fe08efe680f6705e0c60beabe3e39629c655e743)
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