libUPnP 1.8.4
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) \
62TYPE CLASS##_get_##MEMBER(const CLASS *p) \
63{ \
64 return ((struct S##CLASS *)p)->m_##MEMBER; \
65} \
66\
67int 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) \
78const TYPE *CLASS##_get_##MEMBER(const CLASS *p) \
79{ \
80 return (TYPE *)&((struct S##CLASS *)p)->m_##MEMBER; \
81} \
82\
83int CLASS##_set_##MEMBER(CLASS *p, const TYPE *buf) \
84{ \
85 ((struct S##CLASS *)p)->m_##MEMBER = *(TYPE *)buf; \
86 return 1; \
87} \
88\
89void 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) \
99const struct list_head *CLASS##_get_##MEMBER(const CLASS *p) \
100{ \
101 return (struct list_head *)&((struct S##CLASS *)p)->m_##MEMBER; \
102} \
103\
104void CLASS##_add_to_list_##MEMBER(CLASS *p, struct list_head *head) \
105{ \
106 list_add(&((struct S##CLASS *)p)->m_##MEMBER, head); \
107} \
108\
109void CLASS##_remove_from_list_##MEMBER(CLASS *p) \
110{ \
111 list_del_init(&((struct S##CLASS *)p)->m_##MEMBER); \
112} \
113\
114void 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) \
124const TYPE *CLASS##_get_##MEMBER(const CLASS *p) \
125{ \
126 return ((struct S##CLASS *)p)->m_##MEMBER; \
127} \
128\
129int 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) \
143const UpnpString *CLASS##_get_##MEMBER(const CLASS *p) \
144{ \
145 return ((struct S##CLASS *)p)->m_##MEMBER; \
146} \
147\
148int 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\
154size_t CLASS##_get_##MEMBER##_Length(const CLASS *p) \
155{ \
156 return UpnpString_get_Length(CLASS##_get_##MEMBER(p)); \
157} \
158const char *CLASS##_get_##MEMBER##_cstr(const CLASS *p) \
159{ \
160 return UpnpString_get_String(CLASS##_get_##MEMBER(p)); \
161} \
162\
163int CLASS##_strcpy_##MEMBER(CLASS *p, const char *s) \
164{ \
165 return UpnpString_set_String(((struct S##CLASS *)p)->m_##MEMBER, s); \
166} \
167\
168int 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\
173void 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) \
183const DOMString CLASS##_get_##MEMBER(const CLASS *p) \
184{ \
185 return ((struct S##CLASS *)p)->m_##MEMBER; \
186} \
187\
188int 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\
197const 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) \
225struct S##CLASS { \
226 EXPAND_CLASS_MEMBERS(CLASS) \
227};
228
229TEMPLATE_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) \
244CLASS *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
255TEMPLATE_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) \
270void 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
281TEMPLATE_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) \
289CLASS *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
300TEMPLATE_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) \
313int 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
322TEMPLATE_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
334EXPAND_CLASS_MEMBERS(CLASS)
335
336#include "TemplateUndef.h"
337
338
339#endif /* TEMPLATESOURCE_H */
340