gwenhywfar  5.10.1
parser.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 
17 #include "gwenbuild/utils.h"
18 
19 #include <gwenhywfar/debug.h>
20 #include <gwenhywfar/syncio.h>
21 #include <gwenhywfar/process.h>
22 #include <gwenhywfar/directory.h>
23 #include <gwenhywfar/text.h>
24 
25 #include <unistd.h>
26 #include <stdlib.h>
27 #include <errno.h>
28 #include <string.h>
29 #include <ctype.h>
30 
31 #include <sys/types.h> /* for stat, chmod */
32 #include <sys/stat.h>
33 #include <unistd.h>
34 
35 
36 
37 
38 static GWEN_BUFFER *_getSourcePathForFileName(const GWB_CONTEXT *currentContext, const char *fileName);
39 static void _addBuildFileNameToGwBuild(GWENBUILD *gwbuild, const GWB_CONTEXT *currentContext, const char *fileName);
40 static int _getAndCheckRequiredGwenVersion(GWEN_XMLNODE *xmlGwbuildNode);
41 static int _parseSubdir(GWB_PROJECT *project, GWB_CONTEXT *currentContext, const char *sFolder, GWB_PARSER_PARSE_ELEMENT_FN fn);
42 static int _parseSetVar(GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
43 static int _parseIfVarMatches(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn);
44 static int _parseIfNotVarMatches(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn);
45 static int _parseIfVarHasValue(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn);
46 static int _parseIfNotVarHasValue(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn);
47 static int _varHasValue(GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
48 
49 static int _parseWriteFile(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
50 static int _readModifyWriteFile(GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbContextVars, const char *sSourceFile, const char *sDestFile);
51 
52 static void _appendVarValue(GWEN_DB_NODE *db, const char *name, const char *newValue);
53 
54 static int _getFilePermissions(const char *fname);
55 static int _setFilePermissions(const char *fname, int perms);
56 
57 
58 
59 
61  GWB_CONTEXT *currentContext,
62  const char *srcDir,
63  GWB_KEYVALUEPAIR_LIST *givenOptionList)
64 {
65  GWEN_XMLNODE *xmlNewFile;
66  GWEN_XMLNODE *xmlProject;
67  GWB_PROJECT *project;
68  GWB_FILE *file;
69  GWEN_DB_NODE *db;
70  int rv;
71 
72  GWB_Context_SetInitialSourceDir(currentContext, srcDir);
73  GWB_Context_SetTopSourceDir(currentContext, srcDir);
74  GWB_Context_SetCurrentSourceDir(currentContext, srcDir);
75 
76  db=GWB_Context_GetVars(currentContext);
77  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "topbuilddir", ".");
78  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "topsrcdir", srcDir);
81 
82  xmlNewFile=GWB_Parser_ReadBuildFile(gwbuild, currentContext, GWB_PARSER_FILENAME);
83  if (xmlNewFile==NULL) {
84  DBG_ERROR(NULL, "No valid node found in build file of folder \"%s\"", srcDir);
85  return NULL;
86  }
87 
88  xmlProject=GWEN_XMLNode_FindFirstTag(xmlNewFile, "project", NULL, NULL);
89  if (xmlProject==NULL) {
90  DBG_ERROR(NULL, "No project node found in build file of folder \"%s\"", srcDir);
91  GWEN_XMLNode_free(xmlNewFile);
92  return NULL;
93  }
94 
95  project=GWB_Project_new(gwbuild, currentContext);
97  GWB_Context_GetCurrentRelativeDir(currentContext),
100 
101  if (givenOptionList)
102  GWB_Project_SetGivenOptionList(project, givenOptionList);
103 
104  rv=GWB_ParseProject(project, currentContext, xmlProject);
105  if (rv<0) {
106  DBG_ERROR(NULL, "Error parsing build tree in folder \"%s\"", srcDir);
107  GWB_Project_free(project);
108  GWEN_XMLNode_free(xmlNewFile);
109  return NULL;
110  }
111 
112  GWEN_XMLNode_free(xmlNewFile);
113  return project;
114 }
115 
116 
117 
118 GWB_CONTEXT *GWB_Parser_CopyContextForSubdir(const GWB_CONTEXT *sourceContext, const char *folder)
119 {
120  GWB_CONTEXT *newContext;
121  GWEN_DB_NODE *db;
122 
123  newContext=GWB_Context_dup(sourceContext);
124 
125  GWB_Context_AddCurrentRelativeDir(newContext, folder);
126 
127  GWB_Context_InsertTopBuildDir(newContext, "..");
128  GWB_Context_InsertTopSourceDir(newContext, "..");
129 
130  GWB_Context_AddCurrentBuildDir(newContext, folder);
131 
132  GWB_Context_InsertCurrentSourceDir(newContext, "..");
133  GWB_Context_AddCurrentSourceDir(newContext, folder);
134 
136  GWB_Context_ClearIncludeList(newContext);
137  GWB_Context_ClearDefineList(newContext);
138 
139  db=GWB_Context_GetVars(newContext);
142  //GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "builddir", GWB_Context_GetCurrentBuildDir(newContext));
145 
146  GWEN_DB_DeleteGroup(db, "local");
147 
148  return newContext;
149 }
150 
151 
152 
154 {
155  GWB_CONTEXT *newContext;
156 
157  newContext=GWB_Context_dup(sourceContext);
158 
160  GWB_Context_ClearIncludeList(newContext);
161  GWB_Context_ClearDefineList(newContext);
162 
163  return newContext;
164 }
165 
166 
167 
168 GWEN_XMLNODE *GWB_Parser_ReadBuildFile(GWENBUILD *gwbuild, const GWB_CONTEXT *currentContext, const char *fileName)
169 {
170  GWEN_BUFFER *fileNameBuf;
171  int rv;
172  GWEN_XMLNODE *xmlDocNode;
173  GWEN_XMLNODE *xmlGwbuildNode;
174 
175  fileNameBuf=_getSourcePathForFileName(currentContext, fileName);
176 
177  xmlDocNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
178 
179  DBG_DEBUG(NULL, "Reading file %s", GWEN_Buffer_GetStart(fileNameBuf));
180  rv=GWEN_XML_ReadFile(xmlDocNode, GWEN_Buffer_GetStart(fileNameBuf), GWEN_XML_FLAGS_DEFAULT);
181  if (rv<0) {
182  DBG_ERROR(NULL, "Error in XML file \"%s\" (%d)", GWEN_Buffer_GetStart(fileNameBuf), rv);
183  GWEN_Buffer_free(fileNameBuf);
184  return NULL;
185  }
186 
187  xmlGwbuildNode=GWEN_XMLNode_FindFirstTag(xmlDocNode, "gwbuild", NULL, NULL);
188  if (xmlGwbuildNode==NULL) {
189  DBG_ERROR(NULL, "File \"%s\" does not contain an \"gwbuild\" element", GWEN_Buffer_GetStart(fileNameBuf));
190  GWEN_XMLNode_free(xmlDocNode);
191  GWEN_Buffer_free(fileNameBuf);
192  return NULL;
193  }
194 
195  rv=_getAndCheckRequiredGwenVersion(xmlGwbuildNode);
196  if (rv<0) {
197  DBG_INFO(NULL, "here (%d)", rv);
198  GWEN_XMLNode_free(xmlDocNode);
199  GWEN_Buffer_free(fileNameBuf);
200  return NULL;
201  }
202 
203  _addBuildFileNameToGwBuild(gwbuild, currentContext, fileName);
204 
205  GWEN_XMLNode_UnlinkChild(xmlDocNode, xmlGwbuildNode);
206  GWEN_XMLNode_free(xmlDocNode);
207  GWEN_Buffer_free(fileNameBuf);
208 
209  return xmlGwbuildNode;
210 }
211 
212 
213 
214 GWEN_BUFFER *_getSourcePathForFileName(const GWB_CONTEXT *currentContext, const char *fileName)
215 {
216  GWEN_BUFFER *fileNameBuf;
217  const char *s;
218 
219  fileNameBuf=GWEN_Buffer_new(0, 256, 0, 1);
220  s=GWB_Context_GetCurrentSourceDir(currentContext);
221  if (s && *s) {
222  GWEN_Buffer_AppendString(fileNameBuf, s);
224  }
225  GWEN_Buffer_AppendString(fileNameBuf, fileName);
226  return fileNameBuf;
227 }
228 
229 
230 
231 void _addBuildFileNameToGwBuild(GWENBUILD *gwbuild, const GWB_CONTEXT *currentContext, const char *fileName)
232 {
233  GWEN_BUFFER *buildFilenameBuffer;
234  const char *buildDir;
235  const char *initialSourceDir;
236 
237  initialSourceDir=GWB_Context_GetInitialSourceDir(currentContext);
238  buildDir=GWB_Context_GetCurrentBuildDir(currentContext);
239  buildFilenameBuffer=GWEN_Buffer_new(0, 256, 0, 1);
240  GWEN_Buffer_AppendString(buildFilenameBuffer, initialSourceDir);
241  if (buildDir) {
242  GWEN_Buffer_AppendString(buildFilenameBuffer, GWEN_DIR_SEPARATOR_S);
243  GWEN_Buffer_AppendString(buildFilenameBuffer, buildDir);
244  }
245  GWEN_Buffer_AppendString(buildFilenameBuffer, GWEN_DIR_SEPARATOR_S);
246  GWEN_Buffer_AppendString(buildFilenameBuffer, fileName);
247  GWBUILD_AddBuildFilename(gwbuild, GWEN_Buffer_GetStart(buildFilenameBuffer));
248  GWEN_Buffer_free(buildFilenameBuffer);
249 }
250 
251 
252 
254 {
255  const char *s;
256 
257  s=GWEN_XMLNode_GetProperty(xmlGwbuildNode, "requiredVersion", NULL);
258  if (s && *s) {
259  int vRequired;
260  int vCurrent;
261 
262  vCurrent=(int) ((GWENHYWFAR_VERSION_MAJOR<<24)+
266 
267  vRequired=GWB_Utils_VersionStringToInt(s);
268  if (vRequired<0) {
269  DBG_ERROR(NULL, "Invalid required version \"%s\"", s);
270  return GWEN_ERROR_GENERIC;
271  }
272  if (vCurrent<vRequired) {
273  DBG_ERROR(NULL, "Minimum GWENBUILD version required is %x", vRequired);
274  return GWEN_ERROR_GENERIC;
275  }
276  }
277 
278  return 0;
279 }
280 
281 
282 
284 {
285  GWEN_BUFFER *buf;
286 
288  if (buf) {
289  GWEN_STRINGLIST *sl;
290 
292  if (sl==NULL) {
293  DBG_INFO(NULL, "Could not generate string list from data [%s]", GWEN_Buffer_GetStart(buf));
294  GWEN_Buffer_free(buf);
295  return NULL;
296  }
297  GWEN_Buffer_free(buf);
298 
299  return sl;
300  }
301 
302  return NULL;
303 }
304 
305 
306 
308 {
309  GWEN_XMLNODE *xmlData;
310 
311  xmlData=GWEN_XMLNode_GetFirstData(xmlNode);
312  if (xmlData) {
313  const char *s;
314 
315  s=GWEN_XMLNode_GetData(xmlData);
316  if (s && *s) {
317  int rv;
318  GWEN_BUFFER *buf;
319 
320  buf=GWEN_Buffer_new(0, 256, 0, 1);
321  if (db) {
322  rv=GWEN_DB_ReplaceVars(db, s, buf);
323  if(rv<0) {
324  DBG_INFO(NULL, "here (%d)", rv);
325  GWEN_Buffer_free(buf);
326  return NULL;
327  }
328  }
329  else
330  GWEN_Buffer_AppendString(buf, s);
331 
332  if (GWEN_Buffer_GetUsedBytes(buf)==0) {
333  GWEN_Buffer_free(buf);
334  return NULL;
335  }
336  return buf;
337  }
338  }
339 
340  return NULL;
341 }
342 
343 
344 
346 {
347 
348  GWEN_XMLNODE *n;
349 
350  n=GWEN_XMLNode_FindFirstTag(xmlNode, elem, NULL, NULL);
351  if (n) {
352  GWEN_BUFFER *buf;
353 
355  if (buf) {
356  if (GWEN_Buffer_GetUsedBytes(buf))
357  return buf;
358  GWEN_Buffer_free(buf);
359  }
360  }
361 
362  return NULL;
363 }
364 
365 
366 
368 {
369  GWEN_STRINGLIST *sl;
370 
371  sl=GWB_Parser_ReadXmlDataIntoStringList(GWB_Context_GetVars(currentContext), xmlNode);
372  if (sl) {
374 
376  while(se) {
377  const char *sFolder;
378 
379  sFolder=GWEN_StringListEntry_Data(se);
380  if (sFolder && *sFolder) {
381  int rv;
382 
383  rv=GWEN_Directory_GetPath(sFolder, 0);
384  if (rv<0) {
385  DBG_ERROR(NULL, "Could not create folder \"%s\" in build tree", sFolder);
386  return rv;
387  }
388  if (chdir(sFolder)==-1) {
389  DBG_ERROR(NULL, "Could not enter folder \"%s\" in build tree (%s)",
390  sFolder, strerror(errno));
391  return GWEN_ERROR_GENERIC;
392  }
393  rv=_parseSubdir(project, currentContext, sFolder, fn);
394  chdir("..");
395  if (rv<0) {
396  DBG_INFO(NULL, "here (%d)", rv);
397  return rv;
398  }
399  }
401  }
403  }
404 
405  return 0;
406 }
407 
408 
409 
410 int _parseSubdir(GWB_PROJECT *project, GWB_CONTEXT *currentContext, const char *sFolder, GWB_PARSER_PARSE_ELEMENT_FN fn)
411 {
412 
413  GWB_CONTEXT *newContext;
414  GWEN_XMLNODE *xmlNewFile;
415  int rv;
416  GWB_FILE *file;
417 
418  newContext=GWB_Parser_CopyContextForSubdir(currentContext, sFolder);
419 
420  fprintf(stdout, "Entering folder \"%s\"\n", sFolder);
421  xmlNewFile=GWB_Parser_ReadBuildFile(GWB_Project_GetGwbuild(project), newContext, GWB_PARSER_FILENAME);
422  if (xmlNewFile==NULL) {
423  DBG_ERROR(NULL, "No valid node found in build file of subdir \"%s\"", sFolder);
424  GWB_Context_free(newContext);
425  return GWEN_ERROR_BAD_DATA;
426  }
427 
432 
433 
434  rv=fn(project, newContext, xmlNewFile);
435  if (rv<0) {
436  DBG_INFO(NULL, "here (%d)", rv);
437  GWEN_XMLNode_free(xmlNewFile);
438  GWB_Context_free(newContext);
439  return rv;
440  }
441  GWEN_XMLNode_free(xmlNewFile);
442 
443  GWB_Context_Tree2_AddChild(currentContext, newContext);
444  fprintf(stdout, "Leaving folder \"%s\"\n", sFolder);
445  return 0;
446 }
447 
448 
449 
450 int _parseSetVar(GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
451 {
452  const char *sName;
453  const char *sMode;
454  GWEN_BUFFER *buf;
455  GWEN_DB_NODE *db;
456 
457  db=GWB_Context_GetVars(currentContext);
458 
459  sName=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
460  if (!(sName && *sName)) {
461  DBG_ERROR(NULL, "No name for <setVar>");
462  return GWEN_ERROR_GENERIC;
463  }
464 
465  if (GWEN_XMLNode_GetProperty(xmlNode, "value", NULL)) {
466  DBG_WARN(NULL,
467  "%s: Please dont use property \"value\", just store the value between <setVar> and </setVar>",
468  sName);
469  }
470 
471  sMode=GWEN_XMLNode_GetProperty(xmlNode, "mode", "replace");
472 
474  if (buf && GWEN_Buffer_GetUsedBytes(buf)) {
475  if (strcasecmp(sMode, "replace")==0)
477  else if (strcasecmp(sMode, "add")==0)
478  GWEN_DB_SetCharValue(db, 0, sName, GWEN_Buffer_GetStart(buf));
479  else if (strcasecmp(sMode, "append")==0)
480  _appendVarValue(db, sName, GWEN_Buffer_GetStart(buf));
481  GWEN_Buffer_free(buf);
482  }
483  else {
484  if (strcasecmp(sMode, "replace")==0) {
485  GWEN_DB_DeleteVar(db, sName);
486  }
487  }
488 
489  return 0;
490 }
491 
492 
493 
495 {
496  const char *sName;
497  const char *sPattern;
498  const char *sValueInDb;
499  GWEN_DB_NODE *db;
500  GWEN_XMLNODE *xmlThen;
501  GWEN_XMLNODE *xmlElse;
502  int rv;
503 
504  xmlThen=GWEN_XMLNode_FindFirstTag(xmlNode, "then", NULL, NULL);
505  xmlElse=GWEN_XMLNode_FindFirstTag(xmlNode, "else", NULL, NULL);
506 
507  db=GWB_Context_GetVars(currentContext);
508 
509  sName=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
510  if (!(sName && *sName)) {
511  DBG_ERROR(NULL, "No name for <ifVarMatches>");
512  return GWEN_ERROR_GENERIC;
513  }
514 
515  sPattern=GWEN_XMLNode_GetProperty(xmlNode, "value", NULL);
516  if (!(sPattern && *sPattern)) {
517  DBG_ERROR(NULL, "No value for <ifVarMatches>");
518  return GWEN_ERROR_GENERIC;
519  }
520 
521  sValueInDb=GWEN_DB_GetCharValue(db, sName, 0, NULL);
522  if (!(sValueInDb && *sValueInDb)) {
523  DBG_ERROR(NULL, "No value for \"%s\" in db for <ifVarMatches>", sName);
524  return GWEN_ERROR_GENERIC;
525  }
526 
527  if (-1!=GWEN_Text_ComparePattern(sValueInDb, sPattern, 0)) {
528  rv=fn(project, currentContext, xmlThen?xmlThen:xmlNode);
529  if (rv<0) {
530  DBG_INFO(NULL, "here (%d)", rv);
531  return rv;
532  }
533  }
534  else {
535  if (xmlElse) {
536  rv=fn(project, currentContext, xmlElse);
537  if (rv<0) {
538  DBG_INFO(NULL, "here (%d)", rv);
539  return rv;
540  }
541  }
542  }
543 
544  return 0;
545 }
546 
547 
548 
550 {
551  const char *sName;
552  const char *sPattern;
553  const char *sValueInDb;
554  GWEN_DB_NODE *db;
555  GWEN_XMLNODE *xmlThen;
556  GWEN_XMLNODE *xmlElse;
557  int rv;
558 
559  xmlThen=GWEN_XMLNode_FindFirstTag(xmlNode, "then", NULL, NULL);
560  xmlElse=GWEN_XMLNode_FindFirstTag(xmlNode, "else", NULL, NULL);
561 
562  db=GWB_Context_GetVars(currentContext);
563 
564  sName=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
565  if (!(sName && *sName)) {
566  DBG_ERROR(NULL, "No name for <ifNotVarMatches>");
567  return GWEN_ERROR_GENERIC;
568  }
569 
570  sPattern=GWEN_XMLNode_GetProperty(xmlNode, "value", NULL);
571  if (!(sPattern && *sPattern)) {
572  DBG_ERROR(NULL, "No value for <ifVarMatches>");
573  return GWEN_ERROR_GENERIC;
574  }
575 
576  sValueInDb=GWEN_DB_GetCharValue(db, sName, 0, NULL);
577  if (!(sValueInDb && *sValueInDb)) {
578  DBG_ERROR(NULL, "No value for \"%s\" in db for <ifNotVarMatches>", sName);
579  return GWEN_ERROR_GENERIC;
580  }
581 
582  if (-1==GWEN_Text_ComparePattern(sValueInDb, sPattern, 0)) {
583  rv=fn(project, currentContext, xmlThen?xmlThen:xmlNode);
584  if (rv<0) {
585  DBG_INFO(NULL, "here (%d)", rv);
586  return rv;
587  }
588  }
589  else {
590  if (xmlElse) {
591  rv=fn(project, currentContext, xmlElse);
592  if (rv<0) {
593  DBG_INFO(NULL, "here (%d)", rv);
594  return rv;
595  }
596  }
597  }
598 
599  return 0;
600 }
601 
602 
603 
605 {
606  int rv;
607  GWEN_XMLNODE *xmlThen;
608  GWEN_XMLNODE *xmlElse;
609 
610  xmlThen=GWEN_XMLNode_FindFirstTag(xmlNode, "then", NULL, NULL);
611  xmlElse=GWEN_XMLNode_FindFirstTag(xmlNode, "else", NULL, NULL);
612  rv=_varHasValue(currentContext, xmlNode);
613  if (rv<0)
614  return rv;
615  if (rv) {
616  return fn(project, currentContext, xmlThen?xmlThen:xmlNode);
617  }
618  else {
619  if (xmlElse)
620  return fn(project, currentContext, xmlElse);
621  }
622  return 0;
623 }
624 
625 
626 
628 {
629  int rv;
630  GWEN_XMLNODE *xmlThen;
631  GWEN_XMLNODE *xmlElse;
632 
633  xmlThen=GWEN_XMLNode_FindFirstTag(xmlNode, "then", NULL, NULL);
634  xmlElse=GWEN_XMLNode_FindFirstTag(xmlNode, "else", NULL, NULL);
635  rv=_varHasValue(currentContext, xmlNode);
636  if (rv<0)
637  return rv;
638  if (rv==0) {
639  return fn(project, currentContext, xmlThen?xmlThen:xmlNode);
640  }
641  else {
642  if (xmlElse)
643  return fn(project, currentContext, xmlElse);
644  }
645  return 0;
646 }
647 
648 
649 
650 int _varHasValue(GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
651 {
652  const char *sName;
653  const char *sPattern;
654  GWEN_DB_NODE *db;
655  int i;
656 
657  db=GWB_Context_GetVars(currentContext);
658 
659  sName=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
660  if (!(sName && *sName)) {
661  DBG_ERROR(NULL, "No name for <ifVarMatches>");
662  return GWEN_ERROR_GENERIC;
663  }
664 
665  sPattern=GWEN_XMLNode_GetProperty(xmlNode, "value", NULL);
666  if (!(sPattern && *sPattern)) {
667  DBG_ERROR(NULL, "No value for <ifVarMatches>");
668  return GWEN_ERROR_GENERIC;
669  }
670 
671  for (i=0; i<100; i++) {
672  const char *sValueInDb;
673 
674  sValueInDb=GWEN_DB_GetCharValue(db, sName, i, NULL);
675  if (!sValueInDb)
676  break;
677  if (-1!=GWEN_Text_ComparePattern(sValueInDb, sPattern, 0))
678  return 1;
679  }
680 
681  return 0;
682 }
683 
684 
685 
686 int _parseWriteFile(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
687 {
688  const char *fileName;
689  GWEN_BUFFER *fileNameBuffer;
690  GWB_FILE *file;
691  const char *installPath;
692  int rv;
693 
694  rv=GWEN_XMLNode_ExpandProperties(xmlNode, GWB_Context_GetVars(currentContext));
695  if (rv<0) {
696  DBG_INFO(NULL, "here (%d)", rv);
697  return rv;
698  }
699 
700  fileName=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
701  if (!(fileName && *fileName)) {
702  DBG_ERROR(NULL, "No name for <writeFile>");
703  return GWEN_ERROR_GENERIC;
704  }
705 
706  installPath=GWEN_XMLNode_GetProperty(xmlNode, "install", NULL);
707 
708  fileNameBuffer=_getSourcePathForFileName(currentContext, fileName);
709  GWEN_Buffer_AppendString(fileNameBuffer, ".in");
710 
711  rv=_readModifyWriteFile(xmlNode, GWB_Context_GetVars(currentContext), GWEN_Buffer_GetStart(fileNameBuffer), fileName);
712  if (rv<0) {
713  DBG_INFO(NULL, "here (%d)", rv);
714  GWEN_Buffer_free(fileNameBuffer);
715  return rv;
716  }
717 
718  /* add output file */
720  GWB_Context_GetCurrentRelativeDir(currentContext),
721  fileName);
723  if (installPath && *installPath) {
725  GWB_File_SetInstallPath(file, installPath);
726  }
727 
728  /* add input file */
729  GWEN_Buffer_Reset(fileNameBuffer);
730  GWEN_Buffer_AppendString(fileNameBuffer, fileName);
731  GWEN_Buffer_AppendString(fileNameBuffer, ".in");
733  GWB_Context_GetCurrentRelativeDir(currentContext),
734  GWEN_Buffer_GetStart(fileNameBuffer));
736 
737  GWEN_Buffer_free(fileNameBuffer);
738  return 0;
739 }
740 
741 
742 
743 int _readModifyWriteFile(GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbContextVars, const char *sSourceFile, const char *sDestFile)
744 {
745  const char *fileName;
746  GWEN_BUFFER *fileBufferIn;
747  GWEN_BUFFER *fileBufferOut;
748  int sourceFilePerms;
749  int rv;
750 
751  fileName=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
752  if (!(fileName && *fileName)) {
753  DBG_ERROR(NULL, "No name for <writeFile>");
754  return GWEN_ERROR_GENERIC;
755  }
756 
757  rv=_getFilePermissions(sSourceFile);
758  if (rv<0) {
759  DBG_ERROR(NULL, "Could not read permissions for \"%s\" (%d)", sSourceFile, rv);
760  return rv;
761  }
762  sourceFilePerms=rv;
763 
764  fileBufferIn=GWEN_Buffer_new(0, 256, 0, 1);
765 
766  rv=GWEN_SyncIo_Helper_ReadFile(sSourceFile, fileBufferIn);
767  if (rv<0) {
768  DBG_ERROR(NULL, "Could not read \"%s\" (%d)", sSourceFile, rv);
769  GWEN_Buffer_free(fileBufferIn);
770  return rv;
771  }
772 
773  fileBufferOut=GWEN_Buffer_new(0, 256, 0, 1);
774  rv=GWB_Parser_ReplaceVarsBetweenAtSigns(GWEN_Buffer_GetStart(fileBufferIn), fileBufferOut, dbContextVars);
775  GWEN_Buffer_free(fileBufferIn);
776  if (rv<0) {
777  DBG_ERROR(NULL, "Error translating content of file \"%s\" (%d)", sSourceFile, rv);
778  GWEN_Buffer_free(fileBufferOut);
779  return rv;
780  }
781 
782  unlink(sDestFile);
783  rv=GWEN_SyncIo_Helper_WriteFile(sDestFile,
784  (const uint8_t*)GWEN_Buffer_GetStart(fileBufferOut),
785  GWEN_Buffer_GetUsedBytes(fileBufferOut));
786  GWEN_Buffer_free(fileBufferOut);
787  if (rv<0) {
788  DBG_ERROR(NULL, "Could not write \"%s\" (%d)", sDestFile, rv);
789  return rv;
790  }
791 
792  rv=_setFilePermissions(sDestFile, sourceFilePerms);
793  if (rv<0) {
794  DBG_ERROR(NULL, "Could not set perms for \"%s\" (%d)", sDestFile, rv);
795  return rv;
796  }
797 
798  return 0;
799 }
800 
801 
802 
803 int _getFilePermissions(const char *fname)
804 {
805  struct stat st;
806  int rv;
807 
808 #if _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
809  rv=lstat(fname, &st);
810 #else
811  rv=stat(fname, &st);
812 #endif
813  if (rv == -1) {
814  DBG_ERROR(NULL, "Error on stat(\"%s\"): %d (%s)", fname, errno, strerror(errno));
815  return GWEN_ERROR_IO;
816  }
817 
818  return (int)((st.st_mode & ~S_IFMT));
819 }
820 
821 
822 
823 int _setFilePermissions(const char *fname, int perms)
824 {
825  if (chmod(fname, perms) == -1) {
826  DBG_ERROR(NULL, "Error on chmod(\"%s\"): %d (%s)", fname, errno, strerror(errno));
827  return GWEN_ERROR_IO;
828  }
829 
830  return 0;
831 }
832 
833 
834 
835 void _appendVarValue(GWEN_DB_NODE *db, const char *name, const char *newValue)
836 {
837  const char *s;
838 
839  s=GWEN_DB_GetCharValue(db, name, 0, NULL);
840  if (s && *s) {
841  GWEN_BUFFER *buf;
842 
843  buf=GWEN_Buffer_new(0, 256, 0, 1);
844  GWEN_Buffer_AppendString(buf, s);
845  GWEN_Buffer_AppendString(buf, " ");
846  GWEN_Buffer_AppendString(buf, newValue);
848  GWEN_Buffer_free(buf);
849  }
850  else
852 }
853 
854 
855 
856 void GWB_Parser_SetItemValue(GWEN_DB_NODE *db, const char *sId, const char *suffix, const char *value)
857 {
858  GWEN_BUFFER *varNameBuffer;
859 
860  varNameBuffer=GWEN_Buffer_new(0, 64, 0, 1);
861  GWEN_Buffer_AppendString(varNameBuffer, sId);
862  GWEN_Buffer_AppendString(varNameBuffer, suffix);
865  GWEN_Buffer_GetStart(varNameBuffer),
866  value);
867  GWEN_Buffer_free(varNameBuffer);
868 }
869 
870 
871 
872 
874 {
875  const char *p;
876 
877 #if 0
878  DBG_ERROR(NULL, "Using vars:");
879  GWEN_DB_Dump(db, 2);
880 #endif
881 
882  p=s;
883  while (*p) {
884  if (*p=='@') {
885  p++;
886  if (*p=='@')
887  GWEN_Buffer_AppendByte(dbuf, '@');
888  else if (!isalpha(*p)) {
889  GWEN_Buffer_AppendByte(dbuf, '@');
890  GWEN_Buffer_AppendByte(dbuf, *p);
891  }
892  else {
893  const char *pStart;
894 
895  pStart=p;
896  while (*p && *p!='@' && (isalnum(*p) || *p=='_'))
897  p++;
898  if (*p=='@') {
899  int len;
900  char *rawName;
901  const char *value;
902 
903  len=p-pStart;
904  if (len<1) {
905  DBG_ERROR(GWEN_LOGDOMAIN, "Empty variable name in code");
906  return GWEN_ERROR_BAD_DATA;
907  }
908  rawName=(char *) malloc(len+1);
909  assert(rawName);
910  memmove(rawName, pStart, len);
911  rawName[len]=0;
912 
913  /*DBG_ERROR(NULL, "Setting data from variable \"%s\"", rawName);*/
914  value=GWEN_DB_GetCharValue(db, rawName, 0, NULL);
915  if (value)
916  GWEN_Buffer_AppendString(dbuf, value);
917  else {
918  DBG_WARN(NULL, "Warning: Empty value for DB var \"%s\"", rawName);
919  }
920  free(rawName);
921  }
922  else {
923  DBG_INFO(GWEN_LOGDOMAIN, "Not interpreting at sign as start of variable name, adding to output.");
924  p=pStart;
925  GWEN_Buffer_AppendByte(dbuf, '@');
926  GWEN_Buffer_AppendByte(dbuf, *p);
927  }
928  }
929  p++;
930  }
931  else {
932  GWEN_Buffer_AppendByte(dbuf, *p);
933  p++;
934  }
935  }
936 
937  return 0;
938 }
939 
940 
941 
943 {
944  const char *name;
945 
946  name=GWEN_XMLNode_GetData(n);
947  if (name && *name) {
948  int rv;
949 
950  DBG_DEBUG(NULL, "Handling element \"%s\"", name);
951 
952  if (strcasecmp(name, "writeFile")==0)
953  rv=_parseWriteFile(project, currentContext, n);
954  else if (strcasecmp(name, "setVar")==0)
955  rv=_parseSetVar(currentContext, n);
956  else if (strcasecmp(name, "ifVarMatches")==0)
957  rv=_parseIfVarMatches(project, currentContext, n, fn);
958  else if (strcasecmp(name, "ifNotVarMatches")==0)
959  rv=_parseIfNotVarMatches(project, currentContext, n, fn);
960  else if (strcasecmp(name, "ifVarHasValue")==0)
961  rv=_parseIfVarHasValue(project, currentContext, n, fn);
962  else if (strcasecmp(name, "ifNotVarHasValue")==0)
963  rv=_parseIfNotVarHasValue(project, currentContext, n, fn);
964  else {
965  DBG_DEBUG(NULL, "Element not handled here, ignoring");
966  rv=1;
967  }
968  if (rv<0) {
969  DBG_ERROR(GWEN_LOGDOMAIN, "Error in element \"%s\", aborting", name);
970  return rv;
971  }
972  }
973 
974  return 0;
975 }
976 
977 
978 
980  GWB_CONTEXT *currentContext,
981  GWEN_XMLNODE *xmlNode,
982  /*int alwaysDist,
983  int isSource,*/
984  uint32_t fileFlags,
985  const char *defaultTypeName,
986  const char *defaultBuilder)
987 {
988  uint32_t flags=0;
989  int rv;
990  const char *s;
991  const char *installPath;
992  const char *fileType;
993  const char *currentFolder;
994  const char *builder;
995  GWEN_STRINGLIST *fileNameList;
996 
997  rv=GWEN_XMLNode_ExpandProperties(xmlNode, GWB_Context_GetVars(currentContext));
998  if (rv<0) {
999  DBG_INFO(NULL, "here (%d)", rv);
1000  return rv;
1001  }
1002 
1003  currentFolder=GWB_Context_GetCurrentRelativeDir(currentContext);
1004 
1005  fileType=GWEN_XMLNode_GetProperty(xmlNode, "type", defaultTypeName);
1006  builder=GWEN_XMLNode_GetProperty(xmlNode, "builder", defaultBuilder);
1007 
1008  installPath=GWEN_XMLNode_GetProperty(xmlNode, "install", NULL);
1009  if (installPath && *installPath)
1010  flags|=GWB_FILE_FLAGS_INSTALL;
1011 
1012  s=GWEN_XMLNode_GetProperty(xmlNode, "generated", "FALSE");
1013  if (s && *s && (strcasecmp(s, "true")==0 || strcasecmp(s, "yes")==0))
1014  flags|=GWB_FILE_FLAGS_GENERATED;
1015 
1016  s=GWEN_XMLNode_GetProperty(xmlNode, "dist", (fileFlags & GWB_PARSER_SRCFILEFLAGS_ALWAYSDIST)?"TRUE":"FALSE");
1017  if (s && *s && (strcasecmp(s, "true")==0 || strcasecmp(s, "yes")==0))
1018  flags|=GWB_FILE_FLAGS_DIST;
1019 
1020  fileNameList=GWB_Parser_ReadXmlDataIntoStringList(GWB_Context_GetVars(currentContext), xmlNode);
1021  if (fileNameList) {
1023 
1024  se=GWEN_StringList_FirstEntry(fileNameList);
1025  while(se) {
1026  const char *sFileName;
1027 
1028  sFileName=GWEN_StringListEntry_Data(se);
1029  if (sFileName && *sFileName) {
1030  GWB_FILE *file;
1031 
1032  file=GWB_File_List2_GetOrCreateFile(GWB_Project_GetFileList(project), currentFolder, sFileName);
1033  GWB_File_AddFlags(file, flags);
1034  if (installPath)
1035  GWB_File_SetInstallPath(file, installPath);
1036  if (fileType)
1037  GWB_File_SetFileType(file, fileType);
1038  if (builder)
1039  GWB_File_SetBuilder(file, builder);
1040  if (fileFlags & GWB_PARSER_SRCFILEFLAGS_ISSOURCE)
1041  GWB_Context_AddSourceFile(currentContext, file);
1042  }
1043 
1045  }
1046  GWEN_StringList_free(fileNameList);
1047  }
1048 
1049  return 0;
1050 }
1051 
1052 
1053 
1055  GWB_CONTEXT *currentContext,
1056  GWBUILD_TARGETTYPE targetType,
1057  const char *fileName,
1058  const char *fileType,
1059  const char *builderName,
1060  const char *installPath)
1061 {
1062  GWB_TARGET *target;
1063  GWB_CONTEXT *newContext;
1064  GWB_FILE *file;
1065  const char *currentFolder;
1066 
1067  currentFolder=GWB_Context_GetCurrentRelativeDir(currentContext);
1068 
1069  target=GWB_Target_new(project);
1070  GWB_Target_SetName(target, fileName);
1071  GWB_Target_SetId(target, fileName);
1072  GWB_Target_SetTargetType(target, targetType);
1073 
1074  newContext=GWB_Parser_CopyContextForTarget(currentContext);
1075  GWB_Context_SetCurrentTarget(newContext, target);
1076  GWB_Target_SetContext(target, newContext);
1077 
1078  GWB_Project_AddTarget(project, target);
1079  GWB_Context_Tree2_AddChild(currentContext, newContext);
1080 
1081  file=GWB_File_List2_GetOrCreateFile(GWB_Project_GetFileList(project), currentFolder, fileName);
1083  GWB_File_SetFileType(file, fileType);
1084  GWB_File_SetBuilder(file, builderName);
1085  if (installPath && *installPath)
1086  GWB_Target_SetInstallPath(target, installPath);
1087  GWB_Context_AddSourceFile(newContext, file);
1088 
1089  return target;
1090 }
1091 
1092 
int GWEN_DB_ReplaceVars(GWEN_DB_NODE *db, const char *s, GWEN_BUFFER *dbuf)
Definition: db.c:1951
void GWB_Target_SetName(GWB_TARGET *target, const char *s)
Definition: target.c:78
void GWB_Target_SetTargetType(GWB_TARGET *target, GWBUILD_TARGETTYPE t)
Definition: target.c:135
void GWB_Context_AddCurrentBuildDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:203
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:53
#define GWENHYWFAR_VERSION_MAJOR
Definition: version.h:33
struct GWB_CONTEXT GWB_CONTEXT
Definition: context.h:17
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
Definition: db.c:1420
GWEN_STRINGLIST * GWB_Parser_ReadXmlDataIntoStringList(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
Definition: parser.c:283
void GWB_Project_free(GWB_PROJECT *project)
Definition: project.c:51
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define GWEN_XML_FLAGS_DEFAULT
Definition: xml.h:117
#define GWEN_DIR_SEPARATOR_S
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
int(* GWB_PARSER_PARSE_ELEMENT_FN)(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: parser.h:47
#define GWB_PARSER_FILENAME
Definition: parser.h:21
void GWB_File_SetInstallPath(GWB_FILE *f, const char *s)
Definition: file.c:215
GWENBUILD * GWB_Project_GetGwbuild(const GWB_PROJECT *project)
Definition: project.c:70
GWEN_XMLNODE * GWEN_XMLNode_GetFirstData(const GWEN_XMLNODE *n)
Definition: xml.c:724
struct GWB_FILE GWB_FILE
Definition: file.h:18
GWB_CONTEXT * GWB_Parser_CopyContextForTarget(const GWB_CONTEXT *sourceContext)
Definition: parser.c:153
GWEN_BUFFER * GWB_Parser_ReadNamedXmlDataIntoBufferAndExpand(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode, const char *elem)
Definition: parser.c:345
GWB_CONTEXT * GWB_Parser_CopyContextForSubdir(const GWB_CONTEXT *sourceContext, const char *folder)
Definition: parser.c:118
#define NULL
Definition: binreloc.c:300
void GWB_File_AddFlags(GWB_FILE *f, uint32_t i)
Definition: file.c:113
int GWEN_SyncIo_Helper_ReadFile(const char *fName, GWEN_BUFFER *dbuf)
Definition: syncio.c:524
GWB_PROJECT * GWB_Project_new(GWENBUILD *gwbuild, GWB_CONTEXT *ctx)
Definition: project.c:30
GWB_FILE * GWB_File_List2_GetOrCreateFile(GWB_FILE_LIST2 *fileList, const char *folder, const char *fname)
Definition: file.c:385
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
void GWB_Context_ClearSourceFileList2(GWB_CONTEXT *ctx)
Definition: context.c:450
struct GWB_PROJECT GWB_PROJECT
Definition: project.h:14
#define DBG_WARN(dbg_logger, format, args...)
Definition: debug.h:125
#define GWENHYWFAR_VERSION_PATCHLEVEL
Definition: version.h:35
static int _parseSubdir(GWB_PROJECT *project, GWB_CONTEXT *currentContext, const char *sFolder, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:410
int GWB_Utils_VersionStringToInt(const char *s)
Definition: utils.c:717
#define GWEN_LOGDOMAIN
Definition: logger.h:35
static int _readModifyWriteFile(GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbContextVars, const char *sSourceFile, const char *sDestFile)
Definition: parser.c:743
GWBUILD_TARGETTYPE
Definition: gwenbuild.h:18
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
#define GWENHYWFAR_VERSION_BUILD
Definition: version.h:36
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:390
#define GWEN_ERROR_IO
Definition: error.h:123
int GWB_Parser_ParseSubdirs(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:367
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
static int _parseIfNotVarHasValue(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:627
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:406
#define GWB_FILE_FLAGS_INSTALL
Definition: file.h:22
static int _parseIfVarMatches(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:494
#define GWB_PARSER_SRCFILEFLAGS_ISSOURCE
Definition: parser.h:26
GWEN_BUFFER * GWB_Parser_ReadXmlDataIntoBufferAndExpand(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
Definition: parser.c:307
int GWB_Parser_ParseWellKnownElements(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:942
void GWB_Target_SetContext(GWB_TARGET *target, GWB_CONTEXT *ctx)
Definition: target.c:194
void GWB_Target_SetId(GWB_TARGET *target, const char *s)
Definition: target.c:116
#define GWEN_ERROR_BAD_DATA
Definition: error.h:121
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
GWB_FILE_LIST2 * GWB_Project_GetFileList(const GWB_PROJECT *project)
Definition: project.c:205
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:776
GWEN_DB_NODE * GWB_Context_GetVars(const GWB_CONTEXT *ctx)
Definition: context.c:427
void GWB_Project_SetGivenOptionList(GWB_PROJECT *project, GWB_KEYVALUEPAIR_LIST *kvpList)
Definition: project.c:381
void GWB_File_SetBuilder(GWB_FILE *f, const char *s)
Definition: file.c:200
struct GWB_TARGET GWB_TARGET
Definition: target.h:17
static int _getFilePermissions(const char *fname)
Definition: parser.c:803
const char * GWB_Context_GetInitialSourceDir(const GWB_CONTEXT *ctx)
Definition: context.c:285
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:214
GWB_TARGET * GWB_Target_new(GWB_PROJECT *project)
Definition: target.c:26
#define GWB_PARSER_SRCFILEFLAGS_ALWAYSDIST
Definition: parser.h:25
const char * GWB_Context_GetTopSourceDir(const GWB_CONTEXT *ctx)
Definition: context.c:154
void GWB_Context_AddCurrentRelativeDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:262
void GWB_Target_SetInstallPath(GWB_TARGET *target, const char *s)
Definition: target.c:149
int GWEN_DB_DeleteGroup(GWEN_DB_NODE *n, const char *path)
Definition: db.c:922
static int _getAndCheckRequiredGwenVersion(GWEN_XMLNODE *xmlGwbuildNode)
Definition: parser.c:253
static int _parseIfVarHasValue(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:604
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:56
#define GWEN_ERROR_GENERIC
Definition: error.h:62
GWB_TARGET * GWB_Parser_AddTargetForSourceFile(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWBUILD_TARGETTYPE targetType, const char *fileName, const char *fileType, const char *builderName, const char *installPath)
Definition: parser.c:1054
static GWEN_BUFFER * _getSourcePathForFileName(const GWB_CONTEXT *currentContext, const char *fileName)
Definition: parser.c:214
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:394
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:971
GWEN_STRINGLIST * GWEN_StringList_fromString(const char *str, const char *delimiters, int checkDouble)
Definition: stringlist.c:746
void GWB_Context_SetInitialSourceDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:292
int GWB_ParseProject(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_project.c:51
int GWB_Parser_ParseSourcesOrHeaders(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode, uint32_t fileFlags, const char *defaultTypeName, const char *defaultBuilder)
Definition: parser.c:979
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
int GWEN_DB_DeleteVar(GWEN_DB_NODE *n, const char *path)
Definition: db.c:899
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
void GWEN_XMLNode_UnlinkChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:570
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
GWB_PROJECT * GWB_Parser_ReadBuildTree(GWENBUILD *gwbuild, GWB_CONTEXT *currentContext, const char *srcDir, GWB_KEYVALUEPAIR_LIST *givenOptionList)
Definition: parser.c:60
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
static int _setFilePermissions(const char *fname, int perms)
Definition: parser.c:823
void GWB_Context_InsertCurrentSourceDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:232
void GWB_Context_SetCurrentSourceDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:243
static int _parseSetVar(GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: parser.c:450
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
GWEN_XMLNODE * GWB_Parser_ReadBuildFile(GWENBUILD *gwbuild, const GWB_CONTEXT *currentContext, const char *fileName)
Definition: parser.c:168
void GWB_Context_AddCurrentSourceDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:221
static int _parseWriteFile(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: parser.c:686
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
Definition: text.c:1208
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:997
GWB_CONTEXT * GWB_Context_dup(const GWB_CONTEXT *originalCtx)
Definition: context.c:49
void GWB_Context_InsertTopBuildDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:143
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:398
static int _varHasValue(GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: parser.c:650
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
#define GWENHYWFAR_VERSION_MINOR
Definition: version.h:34
void GWB_Context_InsertTopSourceDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:173
GWENHYWFAR_API int GWEN_Directory_GetPath(const char *path, unsigned int flags)
const char * GWB_Context_GetTopBuildDir(const GWB_CONTEXT *ctx)
Definition: context.c:124
void GWB_Parser_SetItemValue(GWEN_DB_NODE *db, const char *sId, const char *suffix, const char *value)
Definition: parser.c:856
int GWB_Parser_ReplaceVarsBetweenAtSigns(const char *s, GWEN_BUFFER *dbuf, GWEN_DB_NODE *db)
Definition: parser.c:873
static void _appendVarValue(GWEN_DB_NODE *db, const char *name, const char *newValue)
Definition: parser.c:835
void GWB_Project_AddTarget(GWB_PROJECT *project, GWB_TARGET *target)
Definition: project.c:241
int GWEN_XMLNode_ExpandProperties(const GWEN_XMLNODE *n, GWEN_DB_NODE *dbVars)
Definition: xml.c:634
const char * GWB_Context_GetCurrentRelativeDir(const GWB_CONTEXT *ctx)
Definition: context.c:255
struct GWENBUILD GWENBUILD
Definition: gwenbuild.h:15
void GWB_Context_SetCurrentTarget(GWB_CONTEXT *ctx, GWB_TARGET *target)
Definition: context.c:466
void GWB_Context_ClearDefineList(GWB_CONTEXT *ctx)
Definition: context.c:417
void GWB_Context_free(GWB_CONTEXT *ctx)
Definition: context.c:93
void GWB_Context_AddSourceFile(GWB_CONTEXT *ctx, GWB_FILE *f)
Definition: context.c:441
void GWBUILD_AddBuildFilename(GWENBUILD *gwenbuild, const char *s)
Definition: gwenbuild.c:147
static void _addBuildFileNameToGwBuild(GWENBUILD *gwbuild, const GWB_CONTEXT *currentContext, const char *fileName)
Definition: parser.c:231
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
int GWEN_SyncIo_Helper_WriteFile(const char *fName, const uint8_t *ptrSource, uint64_t lenSource)
Definition: syncio.c:586
#define GWB_FILE_FLAGS_GENERATED
Definition: file.h:23
void GWB_Context_ClearIncludeList(GWB_CONTEXT *ctx)
Definition: context.c:382
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
const char * GWB_Context_GetCurrentSourceDir(const GWB_CONTEXT *ctx)
Definition: context.c:214
const char * GWB_Context_GetCurrentBuildDir(const GWB_CONTEXT *ctx)
Definition: context.c:184
static int _parseIfNotVarMatches(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:549
void GWB_Context_SetTopSourceDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:161