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