gwenhywfar  5.10.1
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 
30 static void _writeFileList2ToXml(const GWB_FILE_LIST2 *fileList, GWEN_XMLNODE *xmlNode, const char *groupName);
31 static void _readFilesFromXml(GWEN_XMLNODE *xmlNode, const char *groupName, GWB_FILE_LIST2 *destFileList);
32 
33 static void _writeCommandList2ToXml(const GWB_BUILD_CMD_LIST2 *commandList, GWEN_XMLNODE *xmlNode, const char *groupName);
34 static void _readCommandsFromXml(GWB_BUILD_CONTEXT *bctx, GWEN_XMLNODE *xmlNode, const char *groupName);
35 
36 static void _writeFileFlagsToXml(uint32_t flags, GWEN_XMLNODE *xmlNode, const char *varName);
37 static 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 {
68  GWB_BUILD_CONTEXT *bctx;
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 
91 void _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 
114 void _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 
150 void _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 
182 void _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 
238 uint32_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)
256  flags|=GWB_FILE_FLAGS_INSTALL;
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 
303 int 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 
const char * GWB_File_GetFileType(const GWB_FILE *f)
Definition: file.c:227
static void _readCommandsFromXml(GWB_BUILD_CONTEXT *bctx, GWEN_XMLNODE *xmlNode, const char *groupName)
Definition: buildctx_xml.c:182
GWB_BUILD_CONTEXT * GWB_BuildCtx_new()
Definition: buildctx.c:30
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:53
#define GWEN_XML_FLAGS_DEFAULT
Definition: xml.h:117
uint32_t GWB_File_GetId(const GWB_FILE *f)
Definition: file.c:85
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
#define GWEN_XML_FLAGS_SIMPLE
Definition: xml.h:89
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:794
static void _writeCommandList2ToXml(const GWB_BUILD_CMD_LIST2 *commandList, GWEN_XMLNODE *xmlNode, const char *groupName)
Definition: buildctx_xml.c:91
struct GWB_FILE GWB_FILE
Definition: file.h:18
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)
Definition: buildctx_xml.c:114
#define NULL
Definition: binreloc.c:300
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition: xmlrw.c:1297
void GWB_File_SetFileType(GWB_FILE *f, const char *s)
Definition: file.c:234
GWB_BUILD_CMD * GWB_BuildCmd_fromXml(GWEN_XMLNODE *xmlNode, GWB_FILE_LIST2 *fileList)
Definition: buildcmd.c:371
void GWEN_XMLNode_SetCharValue(GWEN_XMLNODE *n, const char *name, const char *value)
Definition: xml.c:897
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
#define GWB_FILE_FLAGS_DIST
Definition: file.h:21
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void GWB_BuildCtx_toXml(const GWB_BUILD_CONTEXT *bctx, GWEN_XMLNODE *xmlNode)
Definition: buildctx_xml.c:42
GWB_BUILD_CONTEXT * GWB_BuildCtx_ReadFromXmlFile(const char *fileName)
Definition: buildctx_xml.c:273
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:390
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:406
#define GWB_FILE_FLAGS_INSTALL
Definition: file.h:22
const char * GWB_File_GetFolder(const GWB_FILE *f)
Definition: file.c:127
GWB_FILE * GWB_File_new(const char *folder, const char *fName, uint32_t id)
Definition: file.c:34
const char * GWB_File_GetName(const GWB_FILE *f)
Definition: file.c:146
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:776
int GWEN_XMLNode_GetIntProperty(const GWEN_XMLNODE *n, const char *name, int defaultValue)
Definition: xml.c:263
const char * GWEN_XMLNode_GetCharValue(const GWEN_XMLNODE *n, const char *name, const char *defValue)
Definition: xml.c:812
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:56
void GWB_BuildCtx_SetInitialSourceDir(GWB_BUILD_CONTEXT *bctx, const char *s)
Definition: buildctx.c:68
void GWB_File_SetFlags(GWB_FILE *f, uint32_t i)
Definition: file.c:106
GWEN_STRINGLIST * GWEN_StringList_fromString(const char *str, const char *delimiters, int checkDouble)
Definition: stringlist.c:746
GWENHYWFAR_API int GWEN_XMLNode_WriteFile(const GWEN_XMLNODE *n, const char *fname, uint32_t flags)
Definition: xmlrw.c:583
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
static void _readFilesFromXml(GWEN_XMLNODE *xmlNode, const char *groupName, GWB_FILE_LIST2 *destFileList)
Definition: buildctx_xml.c:198
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
static uint32_t _readFlagsFromChar(const char *flagsAsText)
Definition: buildctx_xml.c:238
void GWEN_XMLNode_SetIntProperty(GWEN_XMLNODE *n, const char *name, int value)
Definition: xml.c:330
int GWB_BuildCtx_WriteToXmlFile(const GWB_BUILD_CONTEXT *buildCtx, const char *fileName)
Definition: buildctx_xml.c:303
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
static void _writeFileFlagsToXml(uint32_t flags, GWEN_XMLNODE *xmlNode, const char *varName)
Definition: buildctx_xml.c:150
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:398
struct GWB_BUILD_CMD GWB_BUILD_CMD
Definition: buildcmd.h:20
uint32_t GWB_File_GetFlags(const GWB_FILE *f)
Definition: file.c:99
void GWB_BuildCmd_toXml(const GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode)
Definition: buildcmd.c:323
GWB_BUILD_CONTEXT * GWB_BuildCtx_fromXml(GWEN_XMLNODE *xmlNode)
Definition: buildctx_xml.c:66
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
#define GWB_FILE_FLAGS_GENERATED
Definition: file.h:23
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
void GWEN_XMLNode_AddChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:423