xref: /dragonfly/lib/libc/stdlib/hcreate.3 (revision 984263bc)
1.\" $FreeBSD: src/lib/libc/stdlib/hcreate.3,v 1.2.2.2 2003/04/05 13:53:05 dwmalone Exp $
2.\"
3.Dd May 8, 2001
4.Os
5.Dt HCREATE 3
6.Sh NAME
7.Nm hcreate , hdestroy , hsearch
8.Nd manage hash search table
9.Sh LIBRARY
10.Lb libc
11.Sh SYNOPSIS
12.In search.h
13.Ft int
14.Fn hcreate "size_t nel"
15.Ft void
16.Fn hdestroy void
17.Ft ENTRY *
18.Fn hsearch "ENTRY item" "ACTION action"
19.Sh DESCRIPTION
20The
21.Fn hcreate ,
22.Fn hdestroy ,
23and
24.Fn hsearch
25functions manage hash search tables.
26.Pp
27The
28.Fn hcreate
29function allocates sufficient space for the table, and the application should
30ensure it is called before
31.Fn hsearch
32is used.
33The
34.Fa nel
35argument is an estimate of the maximum
36number of entries that the table should contain.
37This number may be adjusted upward by the
38algorithm in order to obtain certain mathematically favorable circumstances.
39.Pp
40The
41.Fn hdestroy
42function disposes of the search table, and may be followed by another call to
43.Fn hcreate .
44After the call to
45.Fn hdestroy ,
46the data can no longer be considered accessible.
47The
48.Fn hdestroy
49function calls
50.Xr free 3
51for each comparison key in the search table
52but not the data item associated with the key.
53.Pp
54The
55.Fn hsearch
56function is a hash-table search routine.
57It returns a pointer into a hash table
58indicating the location at which an entry can be found.
59The
60.Fa item
61argument is a structure of type
62.Vt ENTRY
63(defined in the
64.Aq Pa search.h
65header) containing two pointers:
66.Fa item.key
67points to the comparison key (a
68.Vt "char *" ) ,
69and
70.Fa item.data
71(a
72.Vt "void *" )
73points to any other data to be associated with
74that key.
75The comparison function used by
76.Fn hsearch
77is
78.Xr strcmp 3 .
79The
80.Fa action
81argument is a
82member of an enumeration type
83.Vt ACTION
84indicating the disposition of the entry if it cannot be
85found in the table.
86.Dv ENTER
87indicates that the
88.Fa item
89should be inserted in the table at an
90appropriate point.
91.Dv FIND
92indicates that no entry should be made.
93Unsuccessful resolution is
94indicated by the return of a
95.Dv NULL
96pointer.
97.Pp
98The comparison key (passed to
99.Fn hsearch
100as
101.Fa item.key )
102must be allocated using
103.Xr malloc 3
104if
105.Fa action
106is
107.Dv ENTER
108and
109.Fn hdestroy
110is called.
111.Sh RETURN VALUES
112The
113.Fn hcreate
114function returns 0 if it cannot allocate sufficient space for the table;
115otherwise, it returns non-zero.
116.Pp
117The
118.Fn hdestroy
119function does not return a value.
120.Pp
121The
122.Fn hsearch
123function returns a
124.Dv NULL
125pointer if either the
126.Fa action
127is
128.Dv FIND
129and the
130.Fa item
131could not be found or the
132.Fa action
133is
134.Dv ENTER
135and the table is full.
136.Sh ERRORS
137The
138.Fn hcreate
139and
140.Fn hsearch
141functions may fail if:
142.Bl -tag -width Er
143.It Bq Er ENOMEM
144Insufficient storage space is available.
145.El
146.Sh EXAMPLES
147The following example reads in strings followed by two numbers
148and stores them in a hash table, discarding duplicates.
149It then reads in strings and finds the matching entry in the hash
150table and prints it out.
151.Bd -literal
152#include <stdio.h>
153#include <search.h>
154#include <string.h>
155#include <stdlib.h>
156
157struct info {			/* This is the info stored in the table */
158	int age, room;		/* other than the key. */
159};
160
161#define NUM_EMPL	5000	/* # of elements in search table. */
162
163int
164main(void)
165{
166	char str[BUFSIZ]; /* Space to read string */
167	struct info info_space[NUM_EMPL]; /* Space to store employee info. */
168	struct info *info_ptr = info_space; /* Next space in info_space. */
169	ENTRY item;
170	ENTRY *found_item; /* Name to look for in table. */
171	char name_to_find[30];
172	int i = 0;
173
174	/* Create table; no error checking is performed. */
175	(void) hcreate(NUM_EMPL);
176
177	while (scanf("%s%d%d", str, &info_ptr->age,
178	    &info_ptr->room) != EOF && i++ < NUM_EMPL) {
179		/* Put information in structure, and structure in item. */
180		item.key = strdup(str);
181		item.data = info_ptr;
182		info_ptr++;
183		/* Put item into table. */
184		(void) hsearch(item, ENTER);
185	}
186
187	/* Access table. */
188	item.key = name_to_find;
189	while (scanf("%s", item.key) != EOF) {
190		if ((found_item = hsearch(item, FIND)) != NULL) {
191			/* If item is in the table. */
192			(void)printf("found %s, age = %d, room = %d\en",
193			    found_item->key,
194			    ((struct info *)found_item->data)->age,
195			    ((struct info *)found_item->data)->room);
196		} else
197			(void)printf("no such employee %s\en", name_to_find);
198	}
199	hdestroy();
200	return 0;
201}
202.Ed
203.Sh SEE ALSO
204.Xr bsearch 3 ,
205.Xr lsearch 3 ,
206.Xr malloc 3 ,
207.Xr strcmp 3 ,
208.Xr tsearch 3
209.Sh STANDARDS
210The
211.Fn hcreate ,
212.Fn hdestroy ,
213and
214.Fn hsearch
215functions conform to
216.St -xpg4.2 .
217.Sh HISTORY
218The
219.Fn hcreate ,
220.Fn hdestroy ,
221and
222.Fn hsearch
223functions first appeared in
224.At V .
225.Sh BUGS
226The interface permits the use of only one hash table at a time.
227