etc/search: handle malloc failures and fix build warnings
[mirror/winof/.git] / etc / user / search.c
1 /*\r
2  * Copyright (c) 2009 Intel Corp., Inc.\r
3  *\r
4  * This software is available to you under a choice of one of two\r
5  * licenses.  You may choose to be licensed under the terms of the GNU\r
6  * General Public License (GPL) Version 2, available from the file\r
7  * COPYING in the main directory of this source tree, or the\r
8  * OpenIB.org BSD license below:\r
9  *\r
10  *     Redistribution and use in source and binary forms, with or\r
11  *     without modification, are permitted provided that the following\r
12  *     conditions are met:\r
13  *\r
14  *      - Redistributions of source code must retain the above\r
15  *        copyright notice, this list of conditions and the following\r
16  *        disclaimer.\r
17  *\r
18  *      - Redistributions in binary form must reproduce the above\r
19  *        copyright notice, this list of conditions and the following\r
20  *        disclaimer in the documentation and/or other materials\r
21  *        provided with the distribution.\r
22  *\r
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
30  * SOFTWARE.\r
31  *\r
32  */\r
33 \r
34 #include <stdlib.h>\r
35 #include <search.h>\r
36 \r
37 static int (*compare)(const void *, const void *);\r
38 \r
39 static intn_t fcompare(const void * const key1, const void * const key2)\r
40 {\r
41         return (intn_t) compare((void *) key1, (void *) key2);\r
42 }\r
43 \r
44 void *tsearch(const void *key, void **rootp,\r
45                           int (*compar)(const void *, const void *))\r
46 {\r
47         cl_fmap_item_t *item, *map_item;\r
48 \r
49         if (!*rootp) {\r
50                 *rootp = malloc(sizeof(cl_fmap_t));\r
51                 if (!*rootp)\r
52                         return NULL;\r
53                 cl_fmap_init((cl_fmap_t *) *rootp, fcompare);\r
54         }\r
55 \r
56         compare = compar;\r
57         item = malloc(sizeof(cl_fmap_item_t));\r
58         if (!item)\r
59                 return NULL;\r
60 \r
61         map_item = cl_fmap_insert((cl_fmap_t *) *rootp, key, item);\r
62         if (map_item != item)\r
63                 free(item);\r
64 \r
65         return (void *) &map_item->p_key;\r
66 }\r
67 \r
68 void *tfind(const void *key, void *const *rootp,\r
69                         int (*compar)(const void *, const void *))\r
70 {\r
71         cl_fmap_item_t  *item;\r
72 \r
73         if (!*rootp)\r
74                 return NULL;\r
75 \r
76         compare = compar;\r
77         item = cl_fmap_get((cl_fmap_t *) *rootp, key);\r
78         if (item == cl_fmap_end((cl_fmap_t *) *rootp))\r
79                 return NULL;\r
80 \r
81         return (void *) &item->p_key;\r
82 }\r
83 \r
84 /*\r
85  * Returns NULL if item is not found, or the item itself.  This differs\r
86  * from the tdelete call by not retuning the parent item, but works if\r
87  * the user is only checking against NULL.\r
88  */\r
89 void *tdelete(const void *key, void **rootp,\r
90                           int (*compar)(const void *, const void *))\r
91 {\r
92         cl_fmap_item_t  *item;\r
93         void *map_key;\r
94 \r
95         if (!*rootp)\r
96                 return NULL;\r
97 \r
98         compare = compar;\r
99         item = cl_fmap_remove((cl_fmap_t *) *rootp, key);\r
100         if (item == cl_fmap_end((cl_fmap_t *) *rootp))\r
101                 return NULL;\r
102 \r
103         map_key = (void *) item->p_key;\r
104         free(item);\r
105         return map_key;\r
106 }\r
107 \r
108 //void twalk(const void *root,\r
109 //                 void (*action)(const void *, VISIT, int))\r
110 //{\r
111 //}\r
112 \r
113 //void tdestroy(void *root, void (*free_node)(void *nodep))\r
114 //{\r
115 //}\r