1 | //␊ |
2 | // CoreHash.h␊ |
3 | //␊ |
4 | // Created by Cadet-petit Armel <armelcadetpetit@gmail.com> on 08/03/12.␊ |
5 | // Copyright (c) 2012 . All rights reserved.␊ |
6 | //␊ |
7 | // CoreHash allows in few lines to take full advantages of hashable structures.␊ |
8 | ␊ |
9 | #ifndef CoreHash_h␊ |
10 | #define CoreHash_h␊ |
11 | ␊ |
12 | #include "uthash.h"␊ |
13 | ␊ |
14 | //CoreHash Header and reserved fields␊ |
15 | #define CoreHashHeader \␊ |
16 | char name[10]; \␊ |
17 | int id; \␊ |
18 | UT_hash_handle hh; /* makes this structure hashable */␊ |
19 | ␊ |
20 | ␊ |
21 | #define __CHFindStrVar(HObj) \␊ |
22 | static struct HObj * HObj##_FindStrVar(const char *name, struct HObj *container) { \␊ |
23 | struct HObj *var; \␊ |
24 | \␊ |
25 | ␉if (setjmp(h_buf_error) == -1) { \␊ |
26 | \␊ |
27 | ␉␉return NULL; \␊ |
28 | ␉} else { \␊ |
29 | ␉␉HASH_FIND_STR( container, name, var ); \␊ |
30 | ␉} \␊ |
31 | return var; \␊ |
32 | }␊ |
33 | ␊ |
34 | #define __CHNewStrVar(HObj) \␊ |
35 | static struct HObj * HObj##_NewStrVar(const char *name, struct HObj **container ) { \␊ |
36 | struct HObj *var; \␊ |
37 | \␊ |
38 | var = (struct HObj*)malloc(sizeof(struct HObj)); \␊ |
39 | if (!var) \␊ |
40 | return NULL; \␊ |
41 | \␊ |
42 | strlcpy(var->name, name, sizeof(var->name));␉␉␉␉␉␉␉␉␉␉␉\␊ |
43 | \␊ |
44 | ␉if (setjmp(h_buf_error) == -1) { \␊ |
45 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
46 | ␉␉free(var); \␊ |
47 | ␉␉return NULL; \␊ |
48 | ␉} else { \␊ |
49 | ␉␉HASH_ADD_STR( *container, name, var ); \␊ |
50 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
51 | ␉} \␊ |
52 | ␉return var;␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
53 | }␊ |
54 | ␊ |
55 | #define __CHFindStrVarOrCreate(HObj)␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
56 | static struct HObj * HObj##_FindStrVarOrCreate(const char *name, struct HObj *container )␉␉\␊ |
57 | {␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
58 | ␉struct HObj *var;␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
59 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
60 | var = HObj##_FindStrVar(name,container);␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
61 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
62 | if (!var) {␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
63 | HObj##_NewStrVar(name,&container); \␊ |
64 | }␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
65 | ␉return var;␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
66 | }␊ |
67 | ␊ |
68 | #define __CHDeleteStrVar(HObj) \␊ |
69 | static void HObj##_DeleteStrVar(const char *name, struct HObj *container ) { \␊ |
70 | struct HObj *var; \␊ |
71 | \␊ |
72 | var = HObj##_FindStrVar(name,container); \␊ |
73 | \␊ |
74 | if (!var) { \␊ |
75 | return; \␊ |
76 | } \␊ |
77 | \␊ |
78 | ␉if (setjmp(h_buf_error) == -1) { \␊ |
79 | ␉␉return; \␊ |
80 | ␉} else { \␊ |
81 | ␉␉HASH_DEL( container, var); \␊ |
82 | ␉} \␊ |
83 | free(var); \␊ |
84 | }␊ |
85 | ␊ |
86 | #define CHInitStr(HObj) \␊ |
87 | __CHFindStrVar(HObj) \␊ |
88 | __CHNewStrVar(HObj) \␊ |
89 | __CHFindStrVarOrCreate(HObj) \␊ |
90 | __CHDeleteStrVar(HObj) ␊ |
91 | ␊ |
92 | ␊ |
93 | ␊ |
94 | //CoreHash Int Implementation␊ |
95 | ␊ |
96 | #define __CHFindIntVar(HObj) \␊ |
97 | static struct HObj * HObj##_FindIntVar(int id, struct HObj *container) {␉␉␉␉␉\␊ |
98 | struct HObj *var; \␊ |
99 | \␊ |
100 | if (setjmp(h_buf_error) == -1) { \␊ |
101 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
102 | return NULL; \␊ |
103 | } else { \␊ |
104 | HASH_FIND_INT( container, &id, var ); \␊ |
105 | } \␊ |
106 | return var; \␊ |
107 | }␊ |
108 | ␊ |
109 | #define __CHNewIntVar(HObj) \␊ |
110 | static struct HObj * HObj##_NewIntVar(int id, struct HObj **container ) {␉␉␉␉␉\␊ |
111 | struct HObj *var; \␊ |
112 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
113 | var = (struct HObj*)malloc(sizeof(struct HObj)); \␊ |
114 | if (!var) \␊ |
115 | return NULL; \␊ |
116 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
117 | var->id = id;␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
118 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
119 | if (setjmp(h_buf_error) == -1) { \␊ |
120 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
121 | free(var); \␊ |
122 | return NULL; \␊ |
123 | } else { \␊ |
124 | HASH_ADD_INT( *container, id, var ); \␊ |
125 | \␊ |
126 | } \␊ |
127 | return var;␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
128 | }␊ |
129 | ␊ |
130 | #define __CHFindIntVarOrCreate(HObj) \␊ |
131 | static struct HObj * HObj##_FindIntVarOrCreate(int id, struct HObj *container )␉␉␉␉\␊ |
132 | { \␊ |
133 | struct HObj *var; \␊ |
134 | \␊ |
135 | var = HObj##_FindIntVar(id,container);␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
136 | \␊ |
137 | if (!var) { \␊ |
138 | HObj##_NewIntVar(id,&container); \␊ |
139 | } \␊ |
140 | return var; \␊ |
141 | }␊ |
142 | ␊ |
143 | #define __CHDeleteIntVar(HObj)␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
144 | static void HObj##_DeleteIntVar(int id, struct HObj *container ) {␉␉␉␉␉\␊ |
145 | struct HObj *var;␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
146 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
147 | var = HObj##_FindIntVar(id,container);␉␉␉␉␉␉␉␉␉␉␉\␊ |
148 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
149 | if (!var) {␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
150 | return;␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
151 | }␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
152 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
153 | if (setjmp(h_buf_error) == -1) {␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
154 | return;␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
155 | } else {␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
156 | HASH_DEL( container, var);␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
157 | }␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
158 | free(var);␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
159 | }␊ |
160 | ␊ |
161 | #define CHInitInt(HObj) \␊ |
162 | __CHFindIntVar(HObj) \␊ |
163 | __CHNewIntVar(HObj) \␊ |
164 | __CHFindIntVarOrCreate(HObj) \␊ |
165 | __CHDeleteIntVar(HObj) ␊ |
166 | ␊ |
167 | ␊ |
168 | ␊ |
169 | ␊ |
170 | // CoreHash Common Implementation␊ |
171 | ␊ |
172 | ␊ |
173 | #define __CHDebug(HObj) \␊ |
174 | static void HObj##_Debug(struct HObj *container ) \␊ |
175 | { \␊ |
176 | ␉struct HObj *current_var; \␊ |
177 | ␉printf("Var list: \n");␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
178 | ␉for(current_var=container;current_var;current_var=(struct HObj*)(current_var->hh.next)) \␊ |
179 | ␉{ \␊ |
180 | ␉␉printf(" Name = %s , id = %d\n",current_var->name, current_var->id); \␊ |
181 | ␉} \␊ |
182 | }␊ |
183 | ␊ |
184 | ␊ |
185 | #define __CHDeleteAll(HObj) \␊ |
186 | static void HObj##_DeleteAll(struct HObj *container ) { \␊ |
187 | ␉struct HObj *current_var, *tmp; \␊ |
188 | ␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
189 | ␉if (setjmp(h_buf_error) == -1) { \␊ |
190 | ␉return;␉␉␉␉␉␉␉␉␉␉␉␉␉␉\␊ |
191 | ␉} else { \␊ |
192 | ␉␉␉HASH_ITER(hh, container, current_var, tmp) { \␊ |
193 | ␉␉␉HASH_DEL(container,current_var); \␊ |
194 | ␉␉␉free(current_var); \␊ |
195 | ␉␉} \␊ |
196 | ␉} \␊ |
197 | }␊ |
198 | ␊ |
199 | #define CHUnInit(HObj)␉␉\␊ |
200 | ␉__CHDeleteAll(HObj) ␊ |
201 | ␊ |
202 | #define CHDebug(HObj) \␊ |
203 | ␉__CHDebug(HObj)␊ |
204 | ␊ |
205 | #endif␊ |
206 | |