4e47c6164d9b7a0e1cb9d6960547a649c1c18ed4
[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                 cl_fmap_init((cl_fmap_t *) *rootp, fcompare);\r
52         }\r
53 \r
54         compare = compar;\r
55         item = malloc(sizeof(cl_fmap_item_t));\r
56         map_item = cl_fmap_insert((cl_fmap_t *) *rootp, key, item);\r
57         if (map_item != item) {\r
58                 free(item);\r
59                 return (void *) map_item->p_key;\r
60         }\r
61 \r
62         return (void *) key;\r
63 }\r
64 \r
65 void *tfind(const void *key, void *const *rootp,\r
66                         int (*compar)(const void *, const void *))\r
67 {\r
68         cl_fmap_item_t  *item;\r
69 \r
70         if (!*rootp)\r
71                 return NULL;\r
72 \r
73         compare = compar;\r
74         item = cl_fmap_get((cl_fmap_t *) *rootp, key);\r
75         if (item == cl_fmap_end((cl_fmap_t *) *rootp))\r
76                 return NULL;\r
77 \r
78         return (void *) item->p_key;\r
79 }\r
80 \r
81 void *tdelete(const void *key, void **rootp,\r
82                           int (*compar)(const void *, const void *))\r
83 {\r
84         cl_fmap_item_t  *item;\r
85         void *map_key;\r
86 \r
87         if (!*rootp)\r
88                 return NULL;\r
89 \r
90         compare = compar;\r
91         item = cl_fmap_remove((cl_fmap_t *) *rootp, key);\r
92         if (item == cl_fmap_end((cl_fmap_t *) *rootp))\r
93                 return NULL;\r
94 \r
95         map_key = (void *) item->p_key;\r
96         free(item);\r
97         return map_key;\r
98 }\r
99 \r
100 //void twalk(const void *root,\r
101 //                 void (*action)(const void *, VISIT, int))\r
102 //{\r
103 //}\r
104 \r
105 //void tdestroy(void *root, void (*free_node)(void *nodep))\r
106 //{\r
107 //}\r