gwenhywfar 5.10.1
p_buildfiles.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Mon Feb 08 2021
3 copyright : (C) 2021 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10#ifdef HAVE_CONFIG_H
11# include <config.h>
12#endif
13
14
18
19#include <gwenhywfar/debug.h>
20#include <gwenhywfar/text.h>
21
22
23
24
25static GWB_BUILD_CMD *_parseBuildCmd(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
26static GWB_BUILD_SUBCMD *_parseSubCmd(GWB_BUILD_CMD *bcmd, GWB_CONTEXT *currentContext,
27 GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbForCmd);
28static GWEN_DB_NODE *_prepareCmdDb(GWB_BUILD_CMD *bcmd, GWB_CONTEXT *currentContext);
29static void _parseAndSetBuildMessage(GWB_BUILD_SUBCMD *buildSubCmd, GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbForCmd);
30static int _parseBuildInputFiles(GWB_BUILD_CMD *bcmd, GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
31static int _parseBuildOutputFiles(GWB_BUILD_CMD *bcmd, GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
33 GWB_CONTEXT *currentContext,
34 GWEN_XMLNODE *xmlNode,
35 GWEN_DB_NODE *dbForCmd);
36
37static int _readFileList(GWEN_XMLNODE *xmlNode,
38 GWEN_DB_NODE *dbVars,
39 const char *sCurrentRelativeDir,
40 GWB_FILE_LIST2 *projectFileList,
41 GWB_FILE_LIST2 *targetFileList,
42 uint32_t flagsToAdd);
43static int _readFilesFromDataNode(GWEN_XMLNODE *xmlNode,
44 GWEN_DB_NODE *dbVars,
45 const char *sCurrentRelativeDir,
46 GWB_FILE_LIST2 *projectFileList,
47 GWB_FILE_LIST2 *targetFileList,
48 uint32_t flagsToAdd);
49static int _readFileListFromTagNode(GWEN_XMLNODE *xmlNode,
50 const GWB_FILE_LIST2 *projectFileList,
51 GWB_FILE_LIST2 *targetFileList);
52static void _addFilePathsToDb(GWB_CONTEXT *currentContext,
53 const GWB_FILE_LIST2 *fileList,
54 GWEN_DB_NODE *db,
55 const char *varName);
56
57
58
59
60
61
62int GWB_ParseBuildFiles(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
63{
64 GWB_TARGET *target;
65 GWB_BUILD_CMD *bcmd;
66 GWB_BUILD_SUBCMD *buildSubCmd;
67 GWEN_DB_NODE *dbForCmd;
68
69 target=GWB_Context_GetCurrentTarget(currentContext);
70
71 bcmd=_parseBuildCmd(project, currentContext, xmlNode);
72 if (bcmd==NULL) {
73 DBG_INFO(NULL, "here");
74 return GWEN_ERROR_GENERIC;
75 }
76
77 dbForCmd=_prepareCmdDb(bcmd, currentContext);
78 if (dbForCmd==NULL) {
79 DBG_INFO(NULL, "here");
81 return GWEN_ERROR_GENERIC;
82 }
83
84 buildSubCmd=_parseSubCmd(bcmd, currentContext, xmlNode, dbForCmd);
85 if (buildSubCmd==NULL) {
86 DBG_INFO(NULL, "here");
87 GWEN_DB_Group_free(dbForCmd);
89 return GWEN_ERROR_GENERIC;
90 }
91 _parseAndSetBuildMessage(buildSubCmd, xmlNode, dbForCmd);
92
93 GWB_BuildCmd_AddBuildCommand(bcmd, buildSubCmd);
94
95 if (target)
96 GWB_Target_AddExplicitBuild(target, bcmd);
97 else
98 GWB_Project_AddExplicitBuild(project, bcmd);
99 GWEN_DB_Group_free(dbForCmd);
100
101 return 0;
102}
103
104
105
107{
108 GWEN_XMLNODE *n;
109 GWB_BUILD_CMD *bcmd;
110 int rv;
111 const char *s;
112
113 bcmd=GWB_BuildCmd_new();
115
116 s=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
117 if (s && *s)
119
120 s=GWEN_XMLNode_GetProperty(xmlNode, "auto", "TRUE");
121 if (s && *s && 0==strcasecmp(s, "TRUE"))
123
124 n=GWEN_XMLNode_FindFirstTag(xmlNode, "input", NULL, NULL);
125 if (n) {
126 rv=_parseBuildInputFiles(bcmd, project, currentContext, n);
127 if (rv<0) {
128 DBG_INFO(NULL, "here (%d)", rv);
129 GWB_BuildCmd_free(bcmd);
130 return NULL;
131 }
132 }
133
134 n=GWEN_XMLNode_FindFirstTag(xmlNode, "output", NULL, NULL);
135 if (n) {
136 rv=_parseBuildOutputFiles(bcmd, project, currentContext, n);
137 if (rv<0) {
138 DBG_INFO(NULL, "here (%d)", rv);
139 GWB_BuildCmd_free(bcmd);
140 return NULL;
141 }
142 }
143
144 return bcmd;
145}
146
147
148
150{
151 GWEN_DB_NODE *dbForCmd;
152
153 dbForCmd=GWEN_DB_Group_new("dbForCmd");
154 _addFilePathsToDb(currentContext, GWB_BuildCmd_GetInFileList2(bcmd), dbForCmd, "INPUT");
155 _addFilePathsToDb(currentContext, GWB_BuildCmd_GetOutFileList2(bcmd), dbForCmd, "OUTPUT");
156 return dbForCmd;
157}
158
159
160
162{
163 GWEN_XMLNODE *n;
164
165 n=GWEN_XMLNode_FindFirstTag(xmlNode, "cmd", NULL, NULL);
166 if (n) {
167 GWB_BUILD_SUBCMD *buildSubCmd;
168 const char *s;
169
170 buildSubCmd=_parseBuildCommand(bcmd, currentContext, n, dbForCmd);
171 if (buildSubCmd==NULL) {
172 DBG_ERROR(NULL, "here");
173 return NULL;
174 }
175
176 s=GWEN_XMLNode_GetProperty(n, "deleteOutFileFirst", "FALSE");
177 if (s && strcasecmp(s, "TRUE")==0)
179 return buildSubCmd;
180 }
181 return 0;
182}
183
184
185
187{
188 GWEN_XMLNODE *n;
189
190 n=GWEN_XMLNode_FindFirstTag(xmlNode, "buildMessage", NULL, NULL);
191 if (n) {
192 GWEN_BUFFER *dbuf;
193
195 if (dbuf) {
197 GWEN_Buffer_free(dbuf);
198 }
199 }
200}
201
202
203
204int _parseBuildInputFiles(GWB_BUILD_CMD *bcmd, GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
205{
206 int rv;
207
208 rv=_readFileList(xmlNode,
209 GWB_Context_GetVars(currentContext),
210 GWB_Context_GetCurrentRelativeDir(currentContext),
213 0);
214 if (rv<0) {
215 DBG_INFO(NULL, "here (%d)", rv);
216 return rv;
217 }
218
219 return 0;
220}
221
222
223
224int _parseBuildOutputFiles(GWB_BUILD_CMD *bcmd, GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
225{
226 int rv;
227
228 rv=_readFileList(xmlNode,
229 GWB_Context_GetVars(currentContext),
230 GWB_Context_GetCurrentRelativeDir(currentContext),
234 if (rv<0) {
235 DBG_INFO(NULL, "here (%d)", rv);
236 return rv;
237 }
238
239 return 0;
240}
241
242
243
245 GWB_CONTEXT *currentContext,
246 GWEN_XMLNODE *xmlNode,
247 GWEN_DB_NODE *dbForCmd)
248{
249 GWEN_BUFFER *dbuf;
250 const char *toolName;
251 GWB_BUILD_SUBCMD *buildSubCmd;
252 const char *s;
253 int rv;
254
255 rv=GWEN_XMLNode_ExpandProperties(xmlNode, GWB_Context_GetVars(currentContext));
256 if (rv<0) {
257 DBG_INFO(NULL, "here (%d)", rv);
258 return NULL;
259 }
260
261 toolName=GWEN_XMLNode_GetProperty(xmlNode, "tool", NULL);
262 if (!(toolName && *toolName)) {
263 DBG_ERROR(NULL, "No tool in <cmd>");
264 return NULL;
265 }
266
267 dbuf=GWB_Parser_ReadXmlDataIntoBufferAndExpand(dbForCmd, xmlNode);
268 buildSubCmd=GWB_BuildSubCmd_new();
269 GWB_BuildSubCmd_SetCommand(buildSubCmd, toolName);
270 if (dbuf) {
272 GWEN_Buffer_free(dbuf);
273 }
274
275 s=GWEN_XMLNode_GetProperty(xmlNode, "checkDates", "TRUE");
276 if (s && strcasecmp(s, "TRUE")==0)
278
279 return buildSubCmd;
280}
281
282
283
285 GWEN_DB_NODE *dbVars,
286 const char *sCurrentRelativeDir,
287 GWB_FILE_LIST2 *projectFileList,
288 GWB_FILE_LIST2 *targetFileList,
289 uint32_t flagsToAdd)
290{
291 GWEN_XMLNODE *n;
292
293 n=GWEN_XMLNode_GetChild(xmlNode);
294 while(n) {
296 int rv;
297
299 if (tt==GWEN_XMLNodeTypeTag)
300 rv=_readFileListFromTagNode(n, projectFileList, targetFileList);
301 else if (tt==GWEN_XMLNodeTypeData)
303 dbVars,
304 sCurrentRelativeDir,
305 projectFileList,
306 targetFileList,
307 flagsToAdd);
308 else
309 rv=0;
310 if (rv<0) {
311 DBG_INFO(NULL, "here (%d)", rv);
312 return rv;
313 }
314
316 }
317
318 return 0;
319}
320
321
322
324 GWEN_DB_NODE *dbVars,
325 const char *sCurrentRelativeDir,
326 GWB_FILE_LIST2 *projectFileList,
327 GWB_FILE_LIST2 *targetFileList,
328 uint32_t flagsToAdd)
329{
330 const char *s;
331
332 s=GWEN_XMLNode_GetData(xmlNode);
333 if (s && *s) {
334 int rv;
335 GWEN_BUFFER *buf;
336
337 buf=GWEN_Buffer_new(0, 256, 0, 1);
338 rv=GWEN_DB_ReplaceVars(dbVars, s, buf);
339 if(rv<0) {
340 DBG_INFO(NULL, "here (%d)", rv);
341 GWEN_Buffer_free(buf);
342 return rv;
343 }
344 if (GWEN_Buffer_GetUsedBytes(buf)) {
345 GWEN_STRINGLIST *sl;
346
348 if (sl==NULL) {
349 DBG_ERROR(NULL, "Could not generate string list from data [%s]", GWEN_Buffer_GetStart(buf));
350 GWEN_Buffer_free(buf);
351 return GWEN_ERROR_GENERIC;
352 }
353 GWBUILD_AddFilesFromStringList(projectFileList,
354 sCurrentRelativeDir,
355 sl,
356 targetFileList,
357 flagsToAdd,
358 0);
360 }
361 GWEN_Buffer_free(buf);
362 }
363 return 0;
364}
365
366
367
369 const GWB_FILE_LIST2 *projectFileList,
370 GWB_FILE_LIST2 *targetFileList)
371{
372 const char *tagName;
373
374 tagName=GWEN_XMLNode_GetData(xmlNode);
375 if (tagName && *tagName && strcasecmp(tagName, "files")==0) {
376 int index;
377 const char *pattern;
378
379 pattern=GWEN_XMLNode_GetProperty(xmlNode, "match", NULL);
380 index=GWEN_XMLNode_GetIntProperty(xmlNode, "index", -1);
381
382 if (index>=0) {
383 GWB_FILE *file;
384
385 file=GWB_File_List2_GetAt(projectFileList, index);
386 if (file)
387 GWB_File_List2_PushBack(targetFileList, file);
388 }
389 else {
390 GWB_FILE_LIST2_ITERATOR *it;
391
392 it=GWB_File_List2_First(projectFileList);
393 if (it) {
394 GWB_FILE *file;
395
396 file=GWB_File_List2Iterator_Data(it);
397 while(file) {
398 const char *fname;
399
400 fname=GWB_File_GetName(file);
401 if (fname) {
402 if (pattern==NULL || -1!=GWEN_Text_ComparePattern(fname, pattern, 0))
403 GWB_File_List2_PushBack(targetFileList, file);
404 }
405 file=GWB_File_List2Iterator_Next(it);
406 }
407
408 GWB_File_List2Iterator_free(it);
409 }
410 }
411 return 0;
412 }
413 else {
414 DBG_ERROR(NULL, "Unknown tag name \"%s\"", tagName);
415 return GWEN_ERROR_GENERIC;
416 }
417}
418
419
420
421void _addFilePathsToDb(GWB_CONTEXT *currentContext,
422 const GWB_FILE_LIST2 *fileList,
423 GWEN_DB_NODE *db,
424 const char *varName)
425{
426 GWB_FILE_LIST2_ITERATOR *it;
427
428 it=GWB_File_List2_First(fileList);
429 if (it) {
430 const GWB_FILE *file;
431 GWEN_BUFFER *fbuf;
432
433 fbuf=GWEN_Buffer_new(0, 256, 0, 1);
434 file=GWB_File_List2Iterator_Data(it);
435 while(file) {
436 const char *folder;
437 int useBuildDir;
438
440 folder=GWB_File_GetFolder(file);
441 GWB_Builder_AddRelativeFolderToBuffer(currentContext, folder, useBuildDir, fbuf);
442 if (GWEN_Buffer_GetUsedBytes(fbuf))
445 GWEN_DB_SetCharValue(db, 0, varName, GWEN_Buffer_GetStart(fbuf));
446
447 GWEN_Buffer_Reset(fbuf);
448 file=GWB_File_List2Iterator_Next(it);
449 }
450 GWEN_Buffer_free(fbuf);
451
452 GWB_File_List2Iterator_free(it);
453 }
454
455}
456
457
458
#define NULL
Definition: binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
GWB_FILE_LIST2 * GWB_BuildCmd_GetOutFileList2(const GWB_BUILD_CMD *bcmd)
Definition: buildcmd.c:270
void GWB_BuildCmd_SetFolder(GWB_BUILD_CMD *bcmd, const char *s)
Definition: buildcmd.c:173
void GWB_BuildCmd_SetBuilderName(GWB_BUILD_CMD *bcmd, const char *s)
Definition: buildcmd.c:155
GWB_BUILD_CMD * GWB_BuildCmd_new(void)
Definition: buildcmd.c:42
GWB_FILE_LIST2 * GWB_BuildCmd_GetInFileList2(const GWB_BUILD_CMD *bcmd)
Definition: buildcmd.c:255
void GWB_BuildCmd_free(GWB_BUILD_CMD *bcmd)
Definition: buildcmd.c:97
void GWB_BuildCmd_AddBuildCommand(GWB_BUILD_CMD *bcmd, GWB_BUILD_SUBCMD *cmd)
Definition: buildcmd.c:217
void GWB_BuildCmd_AddFlags(GWB_BUILD_CMD *bcmd, uint32_t i)
Definition: buildcmd.c:134
struct GWB_BUILD_CMD GWB_BUILD_CMD
Definition: buildcmd.h:20
#define GWB_BUILD_CMD_FLAGS_CHECK_DATES
Definition: buildcmd.h:25
#define GWB_BUILD_CMD_FLAGS_AUTO
Definition: buildcmd.h:27
#define GWB_BUILD_CMD_FLAGS_DEL_OUTFILES
Definition: buildcmd.h:26
void GWB_Builder_AddRelativeFolderToBuffer(const GWB_CONTEXT *context, const char *folder, int useBuildDir, GWEN_BUFFER *argBuffer)
Definition: builder.c:276
void GWB_BuildSubCmd_SetBuildMessage(GWB_BUILD_SUBCMD *cmd, const char *s)
Definition: buildsubcmd.c:137
void GWB_BuildSubCmd_SetCommand(GWB_BUILD_SUBCMD *cmd, const char *s)
Definition: buildsubcmd.c:107
void GWB_BuildSubCmd_SetArguments(GWB_BUILD_SUBCMD *cmd, const char *s)
Definition: buildsubcmd.c:122
GWB_BUILD_SUBCMD * GWB_BuildSubCmd_new(void)
Definition: buildsubcmd.c:25
struct GWB_BUILD_SUBCMD GWB_BUILD_SUBCMD
Definition: buildsubcmd.h:16
const char * GWB_Context_GetCurrentRelativeDir(const GWB_CONTEXT *ctx)
Definition: context.c:255
GWB_TARGET * GWB_Context_GetCurrentTarget(const GWB_CONTEXT *ctx)
Definition: context.c:460
GWEN_DB_NODE * GWB_Context_GetVars(const GWB_CONTEXT *ctx)
Definition: context.c:427
struct GWB_CONTEXT GWB_CONTEXT
Definition: context.h:17
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
Definition: db.c:173
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:997
int GWEN_DB_ReplaceVars(GWEN_DB_NODE *db, const char *s, GWEN_BUFFER *dbuf)
Definition: db.c:1951
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
Definition: db.c:421
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
#define GWEN_ERROR_GENERIC
Definition: error.h:62
GWB_FILE * GWB_File_List2_GetAt(const GWB_FILE_LIST2 *fileList, int index)
Definition: file.c:643
const char * GWB_File_GetFolder(const GWB_FILE *f)
Definition: file.c:127
const char * GWB_File_GetName(const GWB_FILE *f)
Definition: file.c:146
uint32_t GWB_File_GetFlags(const GWB_FILE *f)
Definition: file.c:99
struct GWB_FILE GWB_FILE
Definition: file.h:18
#define GWB_FILE_FLAGS_GENERATED
Definition: file.h:23
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
void GWBUILD_AddFilesFromStringList(GWB_FILE_LIST2 *mainFileList, const char *sFolder, const GWEN_STRINGLIST *fileNameList, GWB_FILE_LIST2 *outFileList, uint32_t flagsToAdd, int copyFileForOutList)
Definition: gwenbuild.c:1009
#define GWEN_DIR_SEPARATOR_S
static int _parseBuildOutputFiles(GWB_BUILD_CMD *bcmd, GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_buildfiles.c:224
static GWEN_DB_NODE * _prepareCmdDb(GWB_BUILD_CMD *bcmd, GWB_CONTEXT *currentContext)
Definition: p_buildfiles.c:149
static int _readFileListFromTagNode(GWEN_XMLNODE *xmlNode, const GWB_FILE_LIST2 *projectFileList, GWB_FILE_LIST2 *targetFileList)
Definition: p_buildfiles.c:368
static GWB_BUILD_SUBCMD * _parseSubCmd(GWB_BUILD_CMD *bcmd, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbForCmd)
Definition: p_buildfiles.c:161
int GWB_ParseBuildFiles(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_buildfiles.c:62
static GWB_BUILD_SUBCMD * _parseBuildCommand(GWB_BUILD_CMD *bcmd, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbForCmd)
Definition: p_buildfiles.c:244
static int _readFileList(GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbVars, const char *sCurrentRelativeDir, GWB_FILE_LIST2 *projectFileList, GWB_FILE_LIST2 *targetFileList, uint32_t flagsToAdd)
Definition: p_buildfiles.c:284
static void _addFilePathsToDb(GWB_CONTEXT *currentContext, const GWB_FILE_LIST2 *fileList, GWEN_DB_NODE *db, const char *varName)
Definition: p_buildfiles.c:421
static void _parseAndSetBuildMessage(GWB_BUILD_SUBCMD *buildSubCmd, GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbForCmd)
Definition: p_buildfiles.c:186
static GWB_BUILD_CMD * _parseBuildCmd(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_buildfiles.c:106
static int _parseBuildInputFiles(GWB_BUILD_CMD *bcmd, GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_buildfiles.c:204
static int _readFilesFromDataNode(GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbVars, const char *sCurrentRelativeDir, GWB_FILE_LIST2 *projectFileList, GWB_FILE_LIST2 *targetFileList, uint32_t flagsToAdd)
Definition: p_buildfiles.c:323
GWEN_BUFFER * GWB_Parser_ReadXmlDataIntoBufferAndExpand(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
Definition: parser.c:307
GWB_FILE_LIST2 * GWB_Project_GetFileList(const GWB_PROJECT *project)
Definition: project.c:205
void GWB_Project_AddExplicitBuild(GWB_PROJECT *project, GWB_BUILD_CMD *bcmd)
Definition: project.c:413
struct GWB_PROJECT GWB_PROJECT
Definition: project.h:14
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
GWEN_STRINGLIST * GWEN_StringList_fromString(const char *str, const char *delimiters, int checkDouble)
Definition: stringlist.c:746
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:56
void GWB_Target_AddExplicitBuild(GWB_TARGET *target, GWB_BUILD_CMD *bcmd)
Definition: target.c:300
struct GWB_TARGET GWB_TARGET
Definition: target.h:17
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
Definition: text.c:1208
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:776
GWEN_XMLNODE_TYPE GWEN_XMLNode_GetType(const GWEN_XMLNODE *n)
Definition: xml.c:458
GWEN_XMLNODE * GWEN_XMLNode_Next(const GWEN_XMLNODE *n)
Definition: xml.c:465
int GWEN_XMLNode_ExpandProperties(const GWEN_XMLNODE *n, GWEN_DB_NODE *dbVars)
Definition: xml.c:634
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
GWEN_XMLNODE * GWEN_XMLNode_GetChild(const GWEN_XMLNODE *n)
Definition: xml.c:409
int GWEN_XMLNode_GetIntProperty(const GWEN_XMLNODE *n, const char *name, int defaultValue)
Definition: xml.c:263
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
GWEN_XMLNODE_TYPE
Definition: xml.h:142
@ GWEN_XMLNodeTypeData
Definition: xml.h:147
@ GWEN_XMLNodeTypeTag
Definition: xml.h:145