libUPnP  1.8.1
TemplateSource.h
Go to the documentation of this file.
1 /*
2  * C Template objects.
3  *
4  * Copyright (C) 2010 Marcelo Roberto Jimenez <mroberto@users.sourceforge.net>
5  */
6 
7 #ifndef TEMPLATESOURCE_H
8 #define TEMPLATESOURCE_H
9 
29 /******************************************************************************/
30 #define TEMPLATE_DEFINITION_INT(MEMBER, TYPE) TYPE m_##MEMBER;
31 #define TEMPLATE_DEFINITION_BUFFER(MEMBER, TYPE) TYPE m_##MEMBER;
32 #define TEMPLATE_DEFINITION_LIST(MEMBER) struct list_head m_##MEMBER;
33 #define TEMPLATE_DEFINITION_OBJECT(MEMBER, TYPE) TYPE *m_##MEMBER;
34 #define TEMPLATE_DEFINITION_STRING(MEMBER) UpnpString *m_##MEMBER;
35 #define TEMPLATE_DEFINITION_DOMSTRING(MEMBER) DOMString m_##MEMBER;
36 
37 /******************************************************************************/
38 #define TEMPLATE_CONSTRUCTOR_INT(MEMBER, TYPE) /* p->m_##MEMBER = 0; */
39 #define TEMPLATE_CONSTRUCTOR_BUFFER(MEMBER, TYPE) \
40  /* memset(&p->m_##MEMBER, 0, sizeof (TYPE)); */
41 #define TEMPLATE_CONSTRUCTOR_LIST(MEMBER, TYPE) INIT_LIST_HEAD(&p->m_##MEMBER);
42 #define TEMPLATE_CONSTRUCTOR_OBJECT(MEMBER, TYPE) p->m_##MEMBER = TYPE##_new();
43 #define TEMPLATE_CONSTRUCTOR_STRING(MEMBER) p->m_##MEMBER = UpnpString_new();
44 #define TEMPLATE_CONSTRUCTOR_DOMSTRING(MEMBER) p->m_##MEMBER = NULL;
45 
46 /******************************************************************************/
47 #define TEMPLATE_DESTRUCTOR_INT(MEMBER, TYPE) p->m_##MEMBER = 0;
48 #define TEMPLATE_DESTRUCTOR_BUFFER(MEMBER, TYPE) memset(&p->m_##MEMBER, 0, sizeof (TYPE));
49 #define TEMPLATE_DESTRUCTOR_LIST(MEMBER) list_del(&p->m_##MEMBER);
50 #define TEMPLATE_DESTRUCTOR_OBJECT(MEMBER, TYPE) TYPE##_delete(p->m_##MEMBER); p->m_##MEMBER = NULL;
51 #define TEMPLATE_DESTRUCTOR_STRING(MEMBER) UpnpString_delete(p->m_##MEMBER); p->m_##MEMBER = NULL;
52 #define TEMPLATE_DESTRUCTOR_DOMSTRING(MEMBER) ixmlFreeDOMString(p->m_##MEMBER); p->m_##MEMBER = NULL;
53 
54 /******************************************************************************/
55 #define TEMPLATE_ASSIGNMENT(CLASS, MEMBER) ok = ok && CLASS##_set_##MEMBER(p, CLASS##_get_##MEMBER(q));
56 
57 
58 /******************************************************************************/
59 #define TEMPLATE_METHODS_INT(CLASS, MEMBER, TYPE) \
60  TEMPLATE_METHODS_INT_AUX(CLASS, MEMBER, TYPE)
61 #define TEMPLATE_METHODS_INT_AUX(CLASS, MEMBER, TYPE) \
62 TYPE CLASS##_get_##MEMBER(const CLASS *p) \
63 { \
64  return ((struct S##CLASS *)p)->m_##MEMBER; \
65 } \
66 \
67 int CLASS##_set_##MEMBER(CLASS *p, TYPE n) \
68 { \
69  ((struct S##CLASS *)p)->m_##MEMBER = n; \
70  return 1; \
71 } \
72 
73 
74 /******************************************************************************/
75 #define TEMPLATE_METHODS_BUFFER(CLASS, MEMBER, TYPE) \
76  TEMPLATE_METHODS_BUFFER_AUX(CLASS, MEMBER, TYPE)
77 #define TEMPLATE_METHODS_BUFFER_AUX(CLASS, MEMBER, TYPE) \
78 const TYPE *CLASS##_get_##MEMBER(const CLASS *p) \
79 { \
80  return (TYPE *)&((struct S##CLASS *)p)->m_##MEMBER; \
81 } \
82 \
83 int CLASS##_set_##MEMBER(CLASS *p, const TYPE *buf) \
84 { \
85  ((struct S##CLASS *)p)->m_##MEMBER = *(TYPE *)buf; \
86  return 1; \
87 } \
88 \
89 void CLASS##_clear_##MEMBER(CLASS *p) \
90 { \
91  memset(&((struct S##CLASS *)p)->m_##MEMBER, 0, sizeof(TYPE)); \
92 } \
93 
94 
95 /******************************************************************************/
96 #define TEMPLATE_METHODS_LIST(CLASS, MEMBER) \
97  TEMPLATE_METHODS_LIST_AUX(CLASS, MEMBER)
98 #define TEMPLATE_METHODS_LIST_AUX(CLASS, MEMBER) \
99 const struct list_head *CLASS##_get_##MEMBER(const CLASS *p) \
100 { \
101  return (struct list_head *)&((struct S##CLASS *)p)->m_##MEMBER; \
102 } \
103 \
104 void CLASS##_add_to_list_##MEMBER(CLASS *p, struct list_head *head) \
105 { \
106  list_add(&((struct S##CLASS *)p)->m_##MEMBER, head); \
107 } \
108 \
109 void CLASS##_remove_from_list_##MEMBER(CLASS *p) \
110 { \
111  list_del_init(&((struct S##CLASS *)p)->m_##MEMBER); \
112 } \
113 \
114 void CLASS##_replace_in_list_##MEMBER(CLASS *p, struct list_head *new) \
115 { \
116  list_replace_init(&((struct S##CLASS *)p)->m_##MEMBER, new); \
117 } \
118 
119 
120 /******************************************************************************/
121 #define TEMPLATE_METHODS_OBJECT(CLASS, MEMBER, TYPE) \
122  TEMPLATE_METHODS_OBJECT_AUX(CLASS, MEMBER, TYPE)
123 #define TEMPLATE_METHODS_OBJECT_AUX(CLASS, MEMBER, TYPE) \
124 const TYPE *CLASS##_get_##MEMBER(const CLASS *p) \
125 { \
126  return ((struct S##CLASS *)p)->m_##MEMBER; \
127 } \
128 \
129 int CLASS##_set_##MEMBER(CLASS *p, const TYPE *s) \
130 { \
131  TYPE *q = TYPE##_dup(s); \
132  if (!q) return 0; \
133  TYPE##_delete(((struct S##CLASS *)p)->m_##MEMBER); \
134  ((struct S##CLASS *)p)->m_##MEMBER = q; \
135  return 1; \
136 } \
137 
138 
139 /******************************************************************************/
140 #define TEMPLATE_METHODS_STRING(CLASS, MEMBER) \
141  TEMPLATE_METHODS_STRING_AUX(CLASS, MEMBER)
142 #define TEMPLATE_METHODS_STRING_AUX(CLASS, MEMBER) \
143 const UpnpString *CLASS##_get_##MEMBER(const CLASS *p) \
144 { \
145  return ((struct S##CLASS *)p)->m_##MEMBER; \
146 } \
147 \
148 int CLASS##_set_##MEMBER(CLASS *p, const UpnpString *s) \
149 { \
150  const char *q = UpnpString_get_String(s); \
151  return UpnpString_set_String(((struct S##CLASS *)p)->m_##MEMBER, q); \
152 } \
153 \
154 size_t CLASS##_get_##MEMBER##_Length(const CLASS *p) \
155 { \
156  return UpnpString_get_Length(CLASS##_get_##MEMBER(p)); \
157 } \
158 const char *CLASS##_get_##MEMBER##_cstr(const CLASS *p) \
159 { \
160  return UpnpString_get_String(CLASS##_get_##MEMBER(p)); \
161 } \
162 \
163 int CLASS##_strcpy_##MEMBER(CLASS *p, const char *s) \
164 { \
165  return UpnpString_set_String(((struct S##CLASS *)p)->m_##MEMBER, s); \
166 } \
167 \
168 int CLASS##_strncpy_##MEMBER(CLASS *p, const char *s, size_t n) \
169 { \
170  return UpnpString_set_StringN(((struct S##CLASS *)p)->m_##MEMBER, s, n); \
171 } \
172 \
173 void CLASS##_clear_##MEMBER(CLASS *p) \
174 { \
175  UpnpString_clear(((struct S##CLASS *)p)->m_##MEMBER); \
176 } \
177 
178 
179 /******************************************************************************/
180 #define TEMPLATE_METHODS_DOMSTRING(CLASS, MEMBER) \
181  TEMPLATE_METHODS_DOMSTRING_AUX(CLASS, MEMBER)
182 #define TEMPLATE_METHODS_DOMSTRING_AUX(CLASS, MEMBER) \
183 const DOMString CLASS##_get_##MEMBER(const CLASS *p) \
184 { \
185  return ((struct S##CLASS *)p)->m_##MEMBER; \
186 } \
187 \
188 int CLASS##_set_##MEMBER(CLASS *p, const DOMString s) \
189 { \
190  DOMString q = ixmlCloneDOMString(s); \
191  if (!q) return 0; \
192  ixmlFreeDOMString(((struct S##CLASS *)p)->m_##MEMBER); \
193  ((struct S##CLASS *)p)->m_##MEMBER = q; \
194  return 1; \
195 } \
196 \
197 const char *CLASS##_get_##MEMBER##_cstr(const CLASS *p) \
198 { \
199  return (const char *)CLASS##_get_##MEMBER(p); \
200 } \
201 
202 
203 /******************************************************************************
204  *
205  * Actual source starts here.
206  *
207  ******************************************************************************/
208 
209 #include "config.h"
210 
211 #include <stdlib.h> /* for calloc(), free() */
212 #include <string.h> /* for strlen(), strdup() */
213 
214 /******************************************************************************/
215 #define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_DEFINITION_INT(MEMBER, TYPE)
216 #define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_DEFINITION_BUFFER(MEMBER, TYPE)
217 #define EXPAND_CLASS_MEMBER_LIST(CLASS, MEMBER) TEMPLATE_DEFINITION_LIST(MEMBER)
218 #define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_DEFINITION_OBJECT(MEMBER, TYPE)
219 #define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_DEFINITION_STRING(MEMBER)
220 #define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_DEFINITION_DOMSTRING(MEMBER)
221 
222 #define TEMPLATE_DECLARATION_STRUCT(CLASS) \
223  TEMPLATE_DECLARATION_STRUCT_AUX(CLASS)
224 #define TEMPLATE_DECLARATION_STRUCT_AUX(CLASS) \
225 struct S##CLASS { \
226  EXPAND_CLASS_MEMBERS(CLASS) \
227 };
228 
229 TEMPLATE_DECLARATION_STRUCT(CLASS)
230 
231 #include "TemplateUndef.h"
232 
233 /******************************************************************************/
234 #define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_CONSTRUCTOR_INT(MEMBER, TYPE)
235 #define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_CONSTRUCTOR_BUFFER(MEMBER, TYPE)
236 #define EXPAND_CLASS_MEMBER_LIST(CLASS, MEMBER) TEMPLATE_CONSTRUCTOR_LIST(MEMBER, MEMBER)
237 #define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_CONSTRUCTOR_OBJECT(MEMBER, TYPE)
238 #define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_CONSTRUCTOR_STRING(MEMBER)
239 #define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_CONSTRUCTOR_DOMSTRING(MEMBER)
240 
241 #define TEMPLATE_DEFINITION_CONSTRUCTOR(CLASS) \
242  TEMPLATE_DEFINITION_CONSTRUCTOR_AUX(CLASS)
243 #define TEMPLATE_DEFINITION_CONSTRUCTOR_AUX(CLASS) \
244 CLASS *CLASS##_new() \
245 { \
246  struct S##CLASS *p = calloc(1, sizeof (struct S##CLASS)); \
247 \
248  if (!p) return NULL; \
249 \
250  EXPAND_CLASS_MEMBERS(CLASS) \
251 \
252  return (CLASS *)p; \
253 }
254 
255 TEMPLATE_DEFINITION_CONSTRUCTOR(CLASS)
256 
257 #include "TemplateUndef.h"
258 
259 /******************************************************************************/
260 #define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_DESTRUCTOR_INT(MEMBER, TYPE)
261 #define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_DESTRUCTOR_BUFFER(MEMBER, TYPE)
262 #define EXPAND_CLASS_MEMBER_LIST(CLASS, MEMBER) TEMPLATE_DESTRUCTOR_LIST(MEMBER)
263 #define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_DESTRUCTOR_OBJECT(MEMBER, TYPE)
264 #define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_DESTRUCTOR_STRING(MEMBER)
265 #define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_DESTRUCTOR_DOMSTRING(MEMBER)
266 
267 #define TEMPLATE_DEFINITION_DESTRUCTOR(CLASS) \
268  TEMPLATE_DEFINITION_DESTRUCTOR_AUX(CLASS)
269 #define TEMPLATE_DEFINITION_DESTRUCTOR_AUX(CLASS) \
270 void CLASS##_delete(CLASS *q) \
271 { \
272  struct S##CLASS *p = (struct S##CLASS *)q; \
273 \
274  if (!p) return; \
275 \
276  EXPAND_CLASS_MEMBERS(CLASS) \
277 \
278  free(p); \
279 }
280 
281 TEMPLATE_DEFINITION_DESTRUCTOR(CLASS)
282 
283 #include "TemplateUndef.h"
284 
285 /******************************************************************************/
286 #define TEMPLATE_DEFINITION_COPY_CONSTRUCTOR(CLASS) \
287  TEMPLATE_DEFINITION_COPY_CONSTRUCTOR_AUX(CLASS)
288 #define TEMPLATE_DEFINITION_COPY_CONSTRUCTOR_AUX(CLASS) \
289 CLASS *CLASS##_dup(const CLASS *q) \
290 { \
291  CLASS *p = CLASS##_new(); \
292 \
293  if (!p) return NULL; \
294 \
295  CLASS##_assign(p, q); \
296 \
297  return p; \
298 }
299 
300 TEMPLATE_DEFINITION_COPY_CONSTRUCTOR(CLASS)
301 
302 /******************************************************************************/
303 #define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
304 #define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
305 #define EXPAND_CLASS_MEMBER_LIST(CLASS, MEMBER) /* Do not assing. */
306 #define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
307 #define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
308 #define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
309 
310 #define TEMPLATE_DEFINITION_ASSIGNMENT(CLASS) \
311  TEMPLATE_DEFINITION_ASSIGNMENT_AUX(CLASS)
312 #define TEMPLATE_DEFINITION_ASSIGNMENT_AUX(CLASS) \
313 int CLASS##_assign(CLASS *p, const CLASS *q) \
314 { \
315  int ok = 1; \
316  if (p != q) { \
317  EXPAND_CLASS_MEMBERS(CLASS) \
318  } \
319  return ok; \
320 }
321 
322 TEMPLATE_DEFINITION_ASSIGNMENT(CLASS)
323 
324 #include "TemplateUndef.h"
325 
326 /******************************************************************************/
327 #define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_METHODS_INT(CLASS, MEMBER, TYPE)
328 #define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_METHODS_BUFFER(CLASS, MEMBER, TYPE)
329 #define EXPAND_CLASS_MEMBER_LIST(CLASS, MEMBER) TEMPLATE_METHODS_LIST(CLASS, MEMBER)
330 #define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_METHODS_OBJECT(CLASS, MEMBER, TYPE)
331 #define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_METHODS_STRING(CLASS, MEMBER)
332 #define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_METHODS_DOMSTRING(CLASS, MEMBER)
333 
334 EXPAND_CLASS_MEMBERS(CLASS)
335 
336 #include "TemplateUndef.h"
337 
338 
339 #endif /* TEMPLATESOURCE_H */
340 
struct s_CLASS CLASS
Definition: TemplateInclude.h:138