Cygwin: mmap: allow remapping part of an existing anonymous mapping
[newlib-cygwin.git] / newlib / libc / search / hcreate.3
blob1619c98921be8ef1c1ebbd304fb8347fdb04ac8c
1 .\" $FreeBSD: src/lib/libc/stdlib/hcreate.3,v 1.2 2001/07/09 15:54:36 ru 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
20 The
21 .Fn hcreate ,
22 .Fn hdestroy ,
23 and
24 .Fn hsearch
25 functions manage hash search tables.
26 .Pp
27 The
28 .Fn hcreate
29 function allocates sufficient space for the table, and the application should
30 ensure it is called before
31 .Fn hsearch
32 is used.
33 The
34 .Fa nel
35 argument is an estimate of the maximum
36 number of entries that the table should contain.
37 This number may be adjusted upward by the
38 algorithm in order to obtain certain mathematically favorable circumstances.
39 .Pp
40 The
41 .Fn hdestroy
42 function disposes of the search table, and may be followed by another call to
43 .Fn hcreate .
44 After the call to
45 .Fn hdestroy ,
46 the data can no longer be considered accessible.
47 .Pp
48 The
49 .Fn hsearch
50 function is a hash-table search routine.
51 It returns a pointer into a hash table
52 indicating the location at which an entry can be found.
53 The
54 .Fa item
55 argument is a structure of type
56 .Vt ENTRY
57 (defined in the
58 .Aq Pa search.h
59 header) containing two pointers:
60 .Fa item.key
61 points to the comparison key (a
62 .Vt "char *" ) ,
63 and
64 .Fa item.data
66 .Vt "void *" )
67 points to any other data to be associated with
68 that key.
69 The comparison function used by
70 .Fn hsearch
72 .Xr strcmp 3 .
73 The
74 .Fa action
75 argument is a
76 member of an enumeration type
77 .Vt ACTION
78 indicating the disposition of the entry if it cannot be
79 found in the table.
80 .Dv ENTER
81 indicates that the
82 .Fa item
83 should be inserted in the table at an
84 appropriate point.
85 .Dv FIND
86 indicates that no entry should be made.
87 Unsuccessful resolution is
88 indicated by the return of a
89 .Dv NULL
90 pointer.
91 .Sh RETURN VALUES
92 The
93 .Fn hcreate
94 function returns 0 if it cannot allocate sufficient space for the table;
95 otherwise, it returns non-zero.
96 .Pp
97 The
98 .Fn hdestroy
99 function does not return a value.
102 .Fn hsearch
103 function returns a
104 .Dv NULL
105 pointer if either the
106 .Fa action
108 .Dv FIND
109 and the
110 .Fa item
111 could not be found or the
112 .Fa action
114 .Dv ENTER
115 and the table is full.
116 .Sh ERRORS
118 .Fn hcreate
120 .Fn hsearch
121 functions may fail if:
122 .Bl -tag -width Er
123 .It Bq Er ENOMEM
124 Insufficient storage space is available.
126 .Sh EXAMPLES
127 The following example reads in strings followed by two numbers
128 and stores them in a hash table, discarding duplicates.
129 It then reads in strings and finds the matching entry in the hash
130 table and prints it out.
131 .Bd -literal
132 #include <stdio.h>
133 #include <search.h>
134 #include <string.h>
136 struct info {                   /* This is the info stored in the table */
137         int age, room;          /* other than the key. */
140 #define NUM_EMPL        5000    /* # of elements in search table. */
143 main(void)
145         char string_space[NUM_EMPL*20]; /* Space to store strings. */
146         struct info info_space[NUM_EMPL]; /* Space to store employee info. */
147         char *str_ptr = string_space; /* Next space in string_space. */
148         struct info *info_ptr = info_space; /* Next space in info_space. */
149         ENTRY item;
150         ENTRY *found_item; /* Name to look for in table. */
151         char name_to_find[30];
152         int i = 0;
154         /* Create table; no error checking is performed. */
155         (void) hcreate(NUM_EMPL);
157         while (scanf("%s%d%d", str_ptr, &info_ptr->age,
158             &info_ptr->room) != EOF && i++ < NUM_EMPL) {
159                 /* Put information in structure, and structure in item. */
160                 item.key = str_ptr;
161                 item.data = info_ptr;
162                 str_ptr += strlen(str_ptr) + 1;
163                 info_ptr++;
164                 /* Put item into table. */
165                 (void) hsearch(item, ENTER);
166         }
168         /* Access table. */
169         item.key = name_to_find;
170         while (scanf("%s", item.key) != EOF) {
171                 if ((found_item = hsearch(item, FIND)) != NULL) {
172                         /* If item is in the table. */
173                         (void)printf("found %s, age = %d, room = %d\en",
174                             found_item->key,
175                             ((struct info *)found_item->data)->age,
176                             ((struct info *)found_item->data)->room);
177                 } else
178                         (void)printf("no such employee %s\en", name_to_find);
179         }
180         return 0;
183 .Sh SEE ALSO
184 .Xr bsearch 3 ,
185 .Xr lsearch 3 ,
186 .Xr malloc 3 ,
187 .Xr strcmp 3 ,
188 .Xr tsearch 3
189 .Sh STANDARDS
191 .Fn hcreate ,
192 .Fn hdestroy ,
194 .Fn hsearch
195 functions conform to
196 .St -xpg4.2 .
197 .Sh HISTORY
199 .Fn hcreate ,
200 .Fn hdestroy ,
202 .Fn hsearch
203 functions first appeared in
204 .At V .
205 .Sh BUGS
206 The interface permits the use of only one hash table at a time.