gwenhywfar 5.12.0
buildctx_xml.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#define DISABLE_DEBUGLOG
15
16
17#include "gwenbuild/buildctx/buildctx_p.h"
19
20#include <gwenhywfar/debug.h>
21#include <gwenhywfar/text.h>
22#include <gwenhywfar/directory.h>
23
24#include <unistd.h>
25#include <ctype.h>
26
27
28
29
30static void _writeFileList2ToXml(const GWB_FILE_LIST2 *fileList, GWEN_XMLNODE *xmlNode, const char *groupName);
31static void _readFilesFromXml(GWEN_XMLNODE *xmlNode, const char *groupName, GWB_FILE_LIST2 *destFileList);
32
33static void _writeCommandList2ToXml(const GWB_BUILD_CMD_LIST2 *commandList, GWEN_XMLNODE *xmlNode, const char *groupName);
34static void _readCommandsFromXml(GWB_BUILD_CONTEXT *bctx, GWEN_XMLNODE *xmlNode, const char *groupName);
35
36static void _writeFileFlagsToXml(uint32_t flags, GWEN_XMLNODE *xmlNode, const char *varName);
37static uint32_t _readFlagsFromChar(const char *flagsAsText);
38
39
40
41
43{
44 if (bctx->initialSourceDir)
45 GWEN_XMLNode_SetCharValue(xmlNode, "initialSourceDir", bctx->initialSourceDir);
46
47 if (bctx->fileList) {
48 GWEN_XMLNODE *xmlGroupNode;
49
50 xmlGroupNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "fileList");
51 _writeFileList2ToXml(bctx->fileList, xmlGroupNode, "file");
52 GWEN_XMLNode_AddChild(xmlNode, xmlGroupNode);
53 }
54
55 if (bctx->commandList) {
56 GWEN_XMLNODE *xmlGroupNode;
57
58 xmlGroupNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "commandList");
59 _writeCommandList2ToXml(bctx->commandList, xmlGroupNode, "command");
60 GWEN_XMLNode_AddChild(xmlNode, xmlGroupNode);
61 }
62}
63
64
65
67{
69 GWEN_XMLNODE *xmlGroupNode;
70 const char *s;
71
72 bctx=GWB_BuildCtx_new();
73
74 s=GWEN_XMLNode_GetCharValue(xmlNode, "initialSourceDir", NULL);
75 if (s)
77
78 xmlGroupNode=GWEN_XMLNode_FindFirstTag(xmlNode, "fileList", NULL, NULL);
79 if (xmlGroupNode)
80 _readFilesFromXml(xmlGroupNode, "file", bctx->fileList);
81
82 xmlGroupNode=GWEN_XMLNode_FindFirstTag(xmlNode, "commandList", NULL, NULL);
83 if (xmlGroupNode)
84 _readCommandsFromXml(bctx, xmlGroupNode, "command");
85
86 return bctx;
87}
88
89
90
91void _writeCommandList2ToXml(const GWB_BUILD_CMD_LIST2 *commandList, GWEN_XMLNODE *xmlNode, const char *groupName)
92{
93 GWB_BUILD_CMD_LIST2_ITERATOR *it;
94
95 it=GWB_BuildCmd_List2_First(commandList);
96 if (it) {
97 const GWB_BUILD_CMD *cmd;
98
99 cmd=GWB_BuildCmd_List2Iterator_Data(it);
100 while(cmd) {
101 GWEN_XMLNODE *entryNode;
102
103 entryNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, groupName);
104 GWB_BuildCmd_toXml(cmd, entryNode);
105 GWEN_XMLNode_AddChild(xmlNode, entryNode);
106 cmd=GWB_BuildCmd_List2Iterator_Next(it);
107 }
108 GWB_BuildCmd_List2Iterator_free(it);
109 }
110}
111
112
113
114void _writeFileList2ToXml(const GWB_FILE_LIST2 *fileList, GWEN_XMLNODE *xmlNode, const char *groupName)
115{
116 GWB_FILE_LIST2_ITERATOR *it;
117
118 it=GWB_File_List2_First(fileList);
119 if (it) {
120 GWB_FILE *file;
121
122 file=GWB_File_List2Iterator_Data(it);
123 while(file) {
124 GWEN_XMLNODE *entryNode;
125 const char *s;
126
127 entryNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, groupName);
128 GWEN_XMLNode_SetIntProperty(entryNode, "id", (int) GWB_File_GetId(file));
129 s=GWB_File_GetFolder(file);
130 if (s)
131 GWEN_XMLNode_SetCharValue(entryNode, "folder", s);
132 s=GWB_File_GetName(file);
133 if (s)
134 GWEN_XMLNode_SetCharValue(entryNode, "name", s);
135 s=GWB_File_GetFileType(file);
136 if (s)
137 GWEN_XMLNode_SetCharValue(entryNode, "type", s);
138
139 _writeFileFlagsToXml(GWB_File_GetFlags(file), entryNode, "flags");
140
141 GWEN_XMLNode_AddChild(xmlNode, entryNode);
142 file=GWB_File_List2Iterator_Next(it);
143 }
144 GWB_File_List2Iterator_free(it);
145 }
146}
147
148
149
150void _writeFileFlagsToXml(uint32_t flags, GWEN_XMLNODE *xmlNode, const char *varName)
151{
152 if (flags) {
153 GWEN_BUFFER *dbuf;
154
155 dbuf=GWEN_Buffer_new(0, 256, 0, 1);
156
157 if (flags & GWB_FILE_FLAGS_DIST) {
158 if (GWEN_Buffer_GetUsedBytes(dbuf))
159 GWEN_Buffer_AppendString(dbuf, " ");
160 GWEN_Buffer_AppendString(dbuf, "DIST");
161 }
162
163 if (flags & GWB_FILE_FLAGS_INSTALL) {
164 if (GWEN_Buffer_GetUsedBytes(dbuf))
165 GWEN_Buffer_AppendString(dbuf, " ");
166 GWEN_Buffer_AppendString(dbuf, "INSTALL");
167 }
168
169 if (flags & GWB_FILE_FLAGS_GENERATED) {
170 if (GWEN_Buffer_GetUsedBytes(dbuf))
171 GWEN_Buffer_AppendString(dbuf, " ");
172 GWEN_Buffer_AppendString(dbuf, "GENERATED");
173 }
174
175 GWEN_XMLNode_SetCharValue(xmlNode, varName, GWEN_Buffer_GetStart(dbuf));
176 GWEN_Buffer_free(dbuf);
177 }
178}
179
180
181
182void _readCommandsFromXml(GWB_BUILD_CONTEXT *bctx, GWEN_XMLNODE *xmlNode, const char *groupName)
183{
184 GWEN_XMLNODE *xmlEntry;
185
186 xmlEntry=GWEN_XMLNode_FindFirstTag(xmlNode, groupName, NULL, NULL);
187 while(xmlEntry) {
188 GWB_BUILD_CMD *bcmd;
189
190 bcmd=GWB_BuildCmd_fromXml(xmlEntry, bctx->fileList);
191 GWB_BuildCmd_List2_PushBack(bctx->commandList, bcmd);
192 xmlEntry=GWEN_XMLNode_FindNextTag(xmlEntry, groupName, NULL, NULL);
193 }
194}
195
196
197
199 const char *groupName,
200 GWB_FILE_LIST2 *destFileList)
201{
202 GWEN_XMLNODE *xmlEntry;
203
204 xmlEntry=GWEN_XMLNode_FindFirstTag(xmlNode, groupName, NULL, NULL);
205 while(xmlEntry) {
206 uint32_t id;
207
208 id=(uint32_t) GWEN_XMLNode_GetIntProperty(xmlEntry, "id", 0);
209 if (id==0) {
210 DBG_ERROR(NULL, "FILE has no id");
211 }
212 else {
213 GWB_FILE *file;
214 const char *folder;
215 const char *name;
216 const char *fileType;
217 const char *flagsAsText;
218 uint32_t flags;
219
220 folder=GWEN_XMLNode_GetCharValue(xmlEntry, "folder", NULL);
221 name=GWEN_XMLNode_GetCharValue(xmlEntry, "name", NULL);
222 fileType=GWEN_XMLNode_GetCharValue(xmlEntry, "type", NULL);
223 flagsAsText=GWEN_XMLNode_GetCharValue(xmlEntry, "flags", NULL);
224 flags=_readFlagsFromChar(flagsAsText);
225
226 file=GWB_File_new(folder, name, id);
227 GWB_File_SetFlags(file, flags);
228 GWB_File_SetFileType(file, fileType);
229
230 GWB_File_List2_PushBack(destFileList, file);
231 }
232 xmlEntry=GWEN_XMLNode_FindNextTag(xmlEntry, groupName, NULL, NULL);
233 }
234}
235
236
237
238uint32_t _readFlagsFromChar(const char *flagsAsText)
239{
240 GWEN_STRINGLIST *sl;
241 uint32_t flags=0;
242
243 sl=GWEN_StringList_fromString(flagsAsText, " ", 1);
244 if (sl) {
246
248 while(se) {
249 const char *s;
250
252 if (s && *s) {
253 if (strcasecmp(s, "DIST")==0)
254 flags|=GWB_FILE_FLAGS_DIST;
255 else if (strcasecmp(s, "INSTALL")==0)
257 else if (strcasecmp(s, "GENERATED")==0)
259 else {
260 DBG_ERROR(NULL, "Unexpected FILE flag \"%s\"", s);
261 }
262 }
264 }
266 }
267
268 return flags;
269}
270
271
272
274{
275 GWB_BUILD_CONTEXT *buildCtx;
276 GWEN_XMLNODE *xmlNode;
277 GWEN_XMLNODE *xmlBuildCtx;
278 int rv;
279
280 xmlNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
282 if (rv<0) {
283 DBG_ERROR(NULL, "Error reading BuildContext file \"%s\": Bad XML (%d)", fileName, rv);
284 GWEN_XMLNode_free(xmlNode);
285 return NULL;
286 }
287
288 xmlBuildCtx=GWEN_XMLNode_FindFirstTag(xmlNode, "BuildContext", NULL, NULL);
289 if (xmlBuildCtx==NULL) {
290 DBG_ERROR(NULL, "XML file \"%s\" doesn not contain a BuildContext element,", fileName);
291 GWEN_XMLNode_free(xmlNode);
292 return NULL;
293 }
294
295 buildCtx=GWB_BuildCtx_fromXml(xmlBuildCtx);
296 GWEN_XMLNode_free(xmlNode);
297
298 return buildCtx;
299}
300
301
302
303int GWB_BuildCtx_WriteToXmlFile(const GWB_BUILD_CONTEXT *buildCtx, const char *fileName)
304{
305 GWEN_XMLNODE *xmlNode;
306 GWEN_XMLNODE *xmlBuildCtx;
307 int rv;
308
309 xmlNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
310 xmlBuildCtx=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "BuildContext");
311 GWB_BuildCtx_toXml(buildCtx, xmlBuildCtx);
312 GWEN_XMLNode_AddChild(xmlNode, xmlBuildCtx);
313
315 GWEN_XMLNode_free(xmlNode);
316 if (rv<0) {
317 DBG_ERROR(NULL, "Error writing BuildContext to file \"%s\" (%d)", fileName, rv);
318 return rv;
319 }
320
321 return 0;
322}
323
324
#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_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
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_BUILD_CMD * GWB_BuildCmd_fromXml(GWEN_XMLNODE *xmlNode, GWB_FILE_LIST2 *fileList)
Definition buildcmd.c:371
void GWB_BuildCmd_toXml(const GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode)
Definition buildcmd.c:323
struct GWB_BUILD_CMD GWB_BUILD_CMD
Definition buildcmd.h:20
void GWB_BuildCtx_SetInitialSourceDir(GWB_BUILD_CONTEXT *bctx, const char *s)
Definition buildctx.c:87
GWB_BUILD_CONTEXT * GWB_BuildCtx_new()
Definition buildctx.c:34
struct GWB_BUILD_CONTEXT GWB_BUILD_CONTEXT
Definition buildctx.h:16
static void _writeFileList2ToXml(const GWB_FILE_LIST2 *fileList, GWEN_XMLNODE *xmlNode, const char *groupName)
static void _writeCommandList2ToXml(const GWB_BUILD_CMD_LIST2 *commandList, GWEN_XMLNODE *xmlNode, const char *groupName)
static void _writeFileFlagsToXml(uint32_t flags, GWEN_XMLNODE *xmlNode, const char *varName)
int GWB_BuildCtx_WriteToXmlFile(const GWB_BUILD_CONTEXT *buildCtx, const char *fileName)
GWB_BUILD_CONTEXT * GWB_BuildCtx_fromXml(GWEN_XMLNODE *xmlNode)
GWB_BUILD_CONTEXT * GWB_BuildCtx_ReadFromXmlFile(const char *fileName)
void GWB_BuildCtx_toXml(const GWB_BUILD_CONTEXT *bctx, GWEN_XMLNODE *xmlNode)
static uint32_t _readFlagsFromChar(const char *flagsAsText)
static void _readFilesFromXml(GWEN_XMLNODE *xmlNode, const char *groupName, GWB_FILE_LIST2 *destFileList)
static void _readCommandsFromXml(GWB_BUILD_CONTEXT *bctx, GWEN_XMLNODE *xmlNode, const char *groupName)
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
GWB_FILE * GWB_File_new(const char *folder, const char *fName, uint32_t id)
Definition file.c:34
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
void GWB_File_SetFileType(GWB_FILE *f, const char *s)
Definition file.c:234
uint32_t GWB_File_GetFlags(const GWB_FILE *f)
Definition file.c:99
uint32_t GWB_File_GetId(const GWB_FILE *f)
Definition file.c:85
void GWB_File_SetFlags(GWB_FILE *f, uint32_t i)
Definition file.c:106
const char * GWB_File_GetFileType(const GWB_FILE *f)
Definition file.c:227
struct GWB_FILE GWB_FILE
Definition file.h:18
#define GWB_FILE_FLAGS_GENERATED
Definition file.h:23
#define GWB_FILE_FLAGS_DIST
Definition file.h:21
#define GWB_FILE_FLAGS_INSTALL
Definition file.h:22
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition stringlist.c:62
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition stringlist.c:406
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition stringlist.c:398
GWEN_STRINGLIST * GWEN_StringList_fromString(const char *str, const char *delimiters, int checkDouble)
Definition stringlist.c:763
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition stringlist.c:390
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition stringlist.h:53
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition stringlist.h:56
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition xml.c:776
void GWEN_XMLNode_SetIntProperty(GWEN_XMLNODE *n, const char *name, int value)
Definition xml.c:330
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition xml.c:144
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition xml.c:794
const char * GWEN_XMLNode_GetCharValue(const GWEN_XMLNODE *n, const char *name, const char *defValue)
Definition xml.c:812
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition xml.c:423
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition xml.c:160
void GWEN_XMLNode_SetCharValue(GWEN_XMLNODE *n, const char *name, const char *value)
Definition xml.c:897
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
GWENHYWFAR_API int GWEN_XMLNode_WriteFile(const GWEN_XMLNODE *n, const char *fname, uint32_t flags)
Definition xmlrw.c:584
#define GWEN_XML_FLAGS_DEFAULT
Definition xml.h:117
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition xmlrw.c:1298
@ GWEN_XMLNodeTypeTag
Definition xml.h:145
#define GWEN_XML_FLAGS_SIMPLE
Definition xml.h:89