]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man3/hsearch.3
getent.1, _syscall.2, acct.2, adjtimex.2, bdflush.2, brk.2, cacheflush.2, getsid...
[thirdparty/man-pages.git] / man3 / hsearch.3
CommitLineData
fea681da 1.\" Copyright 1993 Ulrich Drepper (drepper@karlsruhe.gmd.de)
fc5911e1
MK
2.\" and Copyright 2008, Linux Foundation, written by Michael Kerrisk
3.\" <mtk.manpages@gmail.com>
fea681da 4.\"
6a8d8745 5.\" %%%LICENSE_START(GPLv2+_doc_full)
fea681da
MK
6.\" This is free documentation; you can redistribute it and/or
7.\" modify it under the terms of the GNU General Public License as
8.\" published by the Free Software Foundation; either version 2 of
9.\" the License, or (at your option) any later version.
10.\"
11.\" The GNU General Public License's references to "object code"
12.\" and "executables" are to be interpreted as the output of any
13.\" document formatting or typesetting system, including
14.\" intermediate and printed output.
15.\"
16.\" This manual is distributed in the hope that it will be useful,
17.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
18.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19.\" GNU General Public License for more details.
20.\"
21.\" You should have received a copy of the GNU General Public
c715f741
MK
22.\" License along with this manual; if not, see
23.\" <http://www.gnu.org/licenses/>.
6a8d8745 24.\" %%%LICENSE_END
fea681da
MK
25.\"
26.\" References consulted:
27.\" SunOS 4.1.1 man pages
28.\" Modified Sat Sep 30 21:52:01 1995 by Jim Van Zandt <jrv@vanzandt.mv.com>
29.\" Remarks from dhw@gamgee.acad.emich.edu Fri Jun 19 06:46:31 1998
30.\" Modified 2001-12-26, 2003-11-28, 2004-05-20, aeb
4f5aae84 31.\" 2008-09-02, mtk: various additions and rewrites
74f7e82a
MK
32.\" 2008-09-03, mtk, restructured somewhat, in part after suggestions from
33.\" Timothy S. Nelson <wayland@wayland.id.au>
fea681da 34.\"
c658470d 35.TH HSEARCH 3 2011-09-10 "GNU" "Linux Programmer's Manual"
fea681da 36.SH NAME
ffd18676
MK
37hcreate, hdestroy, hsearch, hcreate_r, hdestroy_r,
38hsearch_r \- hash table management
fea681da 39.SH SYNOPSIS
b9f02710 40.nf
fea681da
MK
41.B #include <search.h>
42.sp
43.BI "int hcreate(size_t " nel );
44.sp
45.BI "ENTRY *hsearch(ENTRY " item ", ACTION " action );
46.sp
47.B "void hdestroy(void);"
cf0a9ace 48.sp
b80f966b 49.BR "#define _GNU_SOURCE" " /* See feature_test_macros(7) */"
fea681da
MK
50.br
51.B #include <search.h>
52.sp
fc5911e1 53.BI "int hcreate_r(size_t " nel ", struct hsearch_data *" htab );
fea681da 54.sp
fc5911e1
MK
55.BI "int hsearch_r(ENTRY " item ", ACTION " action ", ENTRY **" retval ,
56.BI " struct hsearch_data *" htab );
fea681da 57.sp
fc5911e1 58.BI "void hdestroy_r(struct hsearch_data *" htab );
b9f02710 59.fi
fea681da
MK
60.SH DESCRIPTION
61The three functions
e511ffb6
MK
62.BR hcreate (),
63.BR hsearch (),
fea681da 64and
e511ffb6 65.BR hdestroy ()
0927f4c5
MK
66allow the caller to create and manage a hash search table
67containing entries consisting of a key (a string) and associated data.
fe80e23e 68Using these functions, only one hash table can be used at a time.
fc5911e1
MK
69
70The three functions
71.BR hcreate_r (),
72.BR hsearch_r (),
73.BR hdestroy_r ()
74are reentrant versions that allow a program to use
0927f4c5 75more than one hash search table at the same time.
fc5911e1
MK
76The last argument,
77.IR htab ,
78points to a structure that describes the table
79on which the function is to operate.
80The programmer should treat this structure as opaque
81(i.e., do not attempt to directly access or modify
82the fields in this structure).
83
84First a hash table must be created using
60a90ecd 85.BR hcreate ().
fe80e23e 86The argument \fInel\fP specifies the maximum number of entries
fea681da 87in the table.
fe80e23e 88(This maximum cannot be changed later, so choose it wisely.)
fc5911e1 89The implementation may adjust this value upward to improve the
fea681da 90performance of the resulting hash table.
fe80e23e 91.\" e.g., in glibc it is raised to the next higher prime number
fc5911e1
MK
92
93The
94.BR hcreate_r ()
95function performs the same task as
96.BR hcreate (),
97but for the table described by the structure
98.IR *htab .
99The structure pointed to by
100.I htab
101must be zeroed before the first call to
102.BR hcreate_r ().
103
104The function
60a90ecd 105.BR hdestroy ()
fc5911e1
MK
106frees the memory occupied by the hash table that was created by
107.BR hcreate ().
fe80e23e
MK
108After calling
109.BR hdestroy ()
110a new hash table can be created using
111.BR hcreate ().
fc5911e1
MK
112The
113.BR hdestroy_r ()
0927f4c5
MK
114function performs the analogous task for a hash table described by
115.IR *htab ,
116which was previously created using
117.BR hcreate_r ().
fe80e23e 118
fc5911e1 119The
fe80e23e 120.BR hsearch ()
fc5911e1 121function searches the hash table for an
fe80e23e
MK
122item with the same key as \fIitem\fP (where "the same" is determined using
123.BR strcmp (3)),
124and if successful returns a pointer to it.
125
126The argument \fIitem\fP is of type \fIENTRY\fP, which is defined in
127\fI<search.h>\fP as follows:
bd191423 128.in +4n
fea681da
MK
129.sp
130.nf
c13182ef 131typedef struct entry {
a08ea57c
MK
132 char *key;
133 void *data;
7295b7ed 134} ENTRY;
bd191423 135.in
fea681da
MK
136.fi
137.sp
fe80e23e 138The field \fIkey\fP points to a null-terminated string which is the
fea681da 139search key.
fe80e23e
MK
140The field \fIdata\fP points to data that is associated with that key.
141
60a90ecd
MK
142The argument \fIaction\fP determines what
143.BR hsearch ()
fe80e23e
MK
144does after an unsuccessful search.
145This argument must either have the value
146.BR ENTER ,
147meaning insert a copy of
fc5911e1
MK
148.IR item
149(and return a pointer to the new hash table entry as the function result),
fe80e23e
MK
150or the value
151.BR FIND ,
152meaning that NULL should be returned.
153(If
154.I action
155is
156.BR FIND ,
157then
158.I data
159is ignored.)
fc5911e1
MK
160
161The
162.BR hsearch_r ()
163function is like
164.BR hsearch ()
165but operates on the hash table described by
166.IR *htab .
fe80e23e
MK
167The
168.BR hsearch_r ()
169function differs from
170.BR hsearch ()
171in that a pointer to the found item is returned in
fc5911e1 172.IR *retval ,
fe80e23e 173rather than as the function result.
47297adb 174.SH RETURN VALUE
60a90ecd
MK
175.BR hcreate ()
176and
177.BR hcreate_r ()
c7094399 178return nonzero on success.
fe80e23e
MK
179They return 0 on error.
180
181On success,
182.BR hsearch ()
183returns a pointer to an entry in the hash table.
60a90ecd 184.BR hsearch ()
fe80e23e
MK
185returns NULL on error, that is,
186if \fIaction\fP is \fBENTER\fP and
fea681da
MK
187the hash table is full, or \fIaction\fP is \fBFIND\fP and \fIitem\fP
188cannot be found in the hash table.
60a90ecd 189.BR hsearch_r ()
c7094399 190returns nonzero on success, and 0 on error.
fea681da 191.SH ERRORS
fea681da 192.LP
fe80e23e 193.BR hcreate_r ()
c658470d
SL
194and
195.BR hdestroy_r ()
fe80e23e
MK
196can fail for the following reasons:
197.TP
198.B EINVAL
fc5911e1 199.I htab
fe80e23e 200is NULL.
fe80e23e
MK
201.PP
202.BR hsearch ()
203and
204.BR hsearch_r ()
205can fail for the following reasons:
206.TP
207.B ENOMEM
208.I action
209was
210.BR ENTER ,
211.I key
212was not found in the table,
213and there was no room in the table to add a new entry.
214.TP
215.B ESRCH
216.I action
217was
7a4076fa 218.BR FIND ,
fe80e23e
MK
219and
220.I key
221was not found in the table.
222.PP
223POSIX.1-2001 only specifies the
224.B ENOMEM
225error.
47297adb 226.SH CONFORMING TO
fea681da 227The functions
e511ffb6
MK
228.BR hcreate (),
229.BR hsearch (),
fea681da 230and
e511ffb6 231.BR hdestroy ()
68e1685c 232are from SVr4, and are described in POSIX.1-2001.
fea681da 233The functions
e511ffb6
MK
234.BR hcreate_r (),
235.BR hsearch_r (),
fc5911e1 236and
e511ffb6 237.BR hdestroy_r ()
fea681da 238are GNU extensions.
fe80e23e
MK
239.SH NOTES
240Hash table implementations are usually more efficient when the
241table contains enough free space to minimize collisions.
242Typically, this means that
243.I nel
244should be at least 25% larger than the maximum number of elements
245that the caller expects to store in the table.
246
247The
248.BR hdestroy ()
fc5911e1 249and
0cf28c34 250.BR hdestroy_r ()
fc5911e1 251functions do not free the buffers pointed to by the
fe80e23e
MK
252.I key
253and
254.I data
255elements of the hash table entries.
fc5911e1
MK
256(It can't do this because it doesn't know
257whether these buffers were allocated dynamically.)
fe80e23e
MK
258If these buffers need to be freed (perhaps because the program
259is repeatedly creating and destroying hash tables,
260rather than creating a single table whose lifetime
261matches that of the program),
262then the program must maintain bookkeeping data structures that
263allow it to free them.
fea681da 264.SH BUGS
68e1685c 265SVr4 and POSIX.1-2001 specify that \fIaction\fP
d9a10d9d 266is significant only for unsuccessful searches, so that an \fBENTER\fP
c13182ef 267should not do anything for a successful search.
fc5911e1
MK
268In libc and glibc (before version 2.3), the
269implementation violates the specification,
270updating the \fIdata\fP for the given \fIkey\fP in this case.
fe80e23e 271
fea681da
MK
272Individual hash table entries can be added, but not deleted.
273.SH EXAMPLE
274.PP
fe80e23e 275The following program inserts 24 items into a hash table, then prints
fea681da
MK
276some of them.
277.nf
278
cf0a9ace
MK
279#include <stdio.h>
280#include <stdlib.h>
281#include <search.h>
c13182ef 282
cf0a9ace
MK
283char *data[] = { "alpha", "bravo", "charlie", "delta",
284 "echo", "foxtrot", "golf", "hotel", "india", "juliet",
285 "kilo", "lima", "mike", "november", "oscar", "papa",
286 "quebec", "romeo", "sierra", "tango", "uniform",
29059a65 287 "victor", "whisky", "x\-ray", "yankee", "zulu"
cf0a9ace 288};
fea681da 289
c13182ef
MK
290int
291main(void)
41798314 292{
cf0a9ace
MK
293 ENTRY e, *ep;
294 int i;
c13182ef 295
cf0a9ace 296 hcreate(30);
fe80e23e 297
cf0a9ace 298 for (i = 0; i < 24; i++) {
c13182ef
MK
299 e.key = data[i];
300 /* data is just an integer, instead of a
cf0a9ace 301 pointer to something */
0c535394 302 e.data = (void *) i;
cf0a9ace
MK
303 ep = hsearch(e, ENTER);
304 /* there should be no failures */
305 if (ep == NULL) {
fea681da 306 fprintf(stderr, "entry failed\\n");
4c44ffe5 307 exit(EXIT_FAILURE);
cf0a9ace 308 }
fea681da 309 }
fe80e23e 310
cf0a9ace
MK
311 for (i = 22; i < 26; i++) {
312 /* print two entries from the table, and
313 show that two are not in the table */
314 e.key = data[i];
315 ep = hsearch(e, FIND);
316 printf("%9.9s \-> %9.9s:%d\\n", e.key,
29059a65 317 ep ? ep\->key : "NULL", ep ? (int)(ep\->data) : 0);
cf0a9ace 318 }
ed7bbec7 319 hdestroy();
5bc8c34c 320 exit(EXIT_SUCCESS);
cf0a9ace 321}
fea681da 322.fi
47297adb 323.SH SEE ALSO
fea681da
MK
324.BR bsearch (3),
325.BR lsearch (3),
326.BR malloc (3),
0a4f8b7b 327.BR tsearch (3)