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
38static GWEN_BUFFER *_getSourcePathForFileName(const GWB_CONTEXT *currentContext, const char *fileName);
39static void _addBuildFileNameToGwBuild(GWENBUILD *gwbuild, const GWB_CONTEXT *currentContext, const char *fileName);
40static int _getAndCheckRequiredGwenVersion(GWEN_XMLNODE *xmlGwbuildNode);
41static int _parseSubdir(GWB_PROJECT *project, GWB_CONTEXT *currentContext, const char *sFolder, GWB_PARSER_PARSE_ELEMENT_FN fn);
42static int _parseSetVar(GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
43static int _parseIfVarMatches(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn);
45static int _parseIfVarHasValue(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn);
47static int _varHasValue(GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
48
49static int _parseWriteFile(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
50static int _readModifyWriteFile(GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbContextVars, const char *sSourceFile, const char *sDestFile);
51
52static void _appendVarValue(GWEN_DB_NODE *db, const char *name, const char *newValue);
53
54static int _getFilePermissions(const char *fname);
55static 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);
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);
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
118GWB_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
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
161 GWB_Context_ClearDefineList(newContext);
162
163 return newContext;
164}
165
166
167
168GWEN_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));
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
214GWEN_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
231void _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) {
243 GWEN_Buffer_AppendString(buildFilenameBuffer, buildDir);
244 }
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
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) {
357 return buf;
358 GWEN_Buffer_free(buf);
359 }
360 }
361
362 return NULL;
363}
364
365
366
368{
369 GWEN_STRINGLIST *sl;
370
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
410int _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);
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
450int _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)) {
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
650int _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
686int _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
743int _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
803int _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
823int _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
835void _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);
845 GWEN_Buffer_AppendString(buf, " ");
846 GWEN_Buffer_AppendString(buf, newValue);
848 GWEN_Buffer_free(buf);
849 }
850 else
852}
853
854
855
856void 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)
1011
1012 s=GWEN_XMLNode_GetProperty(xmlNode, "generated", "FALSE");
1013 if (s && *s && (strcasecmp(s, "true")==0 || strcasecmp(s, "yes")==0))
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
#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
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:394
void GWB_Context_AddCurrentSourceDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:221
void GWB_Context_ClearDefineList(GWB_CONTEXT *ctx)
Definition: context.c:417
void GWB_Context_SetCurrentSourceDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:243
const char * GWB_Context_GetCurrentRelativeDir(const GWB_CONTEXT *ctx)
Definition: context.c:255
const char * GWB_Context_GetCurrentSourceDir(const GWB_CONTEXT *ctx)
Definition: context.c:214
void GWB_Context_AddCurrentBuildDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:203
void GWB_Context_SetInitialSourceDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:292
void GWB_Context_InsertCurrentSourceDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:232
void GWB_Context_InsertTopSourceDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:173
void GWB_Context_SetTopSourceDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:161
void GWB_Context_AddSourceFile(GWB_CONTEXT *ctx, GWB_FILE *f)
Definition: context.c:441
void GWB_Context_SetCurrentTarget(GWB_CONTEXT *ctx, GWB_TARGET *target)
Definition: context.c:466
const char * GWB_Context_GetTopBuildDir(const GWB_CONTEXT *ctx)
Definition: context.c:124
void GWB_Context_free(GWB_CONTEXT *ctx)
Definition: context.c:93
void GWB_Context_AddCurrentRelativeDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:262
void GWB_Context_ClearSourceFileList2(GWB_CONTEXT *ctx)
Definition: context.c:450
const char * GWB_Context_GetTopSourceDir(const GWB_CONTEXT *ctx)
Definition: context.c:154
GWEN_DB_NODE * GWB_Context_GetVars(const GWB_CONTEXT *ctx)
Definition: context.c:427
GWB_CONTEXT * GWB_Context_dup(const GWB_CONTEXT *originalCtx)
Definition: context.c:49
const char * GWB_Context_GetInitialSourceDir(const GWB_CONTEXT *ctx)
Definition: context.c:285
const char * GWB_Context_GetCurrentBuildDir(const GWB_CONTEXT *ctx)
Definition: context.c:184
void GWB_Context_InsertTopBuildDir(GWB_CONTEXT *ctx, const char *s)
Definition: context.c:143
void GWB_Context_ClearIncludeList(GWB_CONTEXT *ctx)
Definition: context.c:382
struct GWB_CONTEXT GWB_CONTEXT
Definition: context.h:17
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:971
int GWEN_DB_DeleteVar(GWEN_DB_NODE *n, const char *path)
Definition: db.c:899
int GWEN_DB_DeleteGroup(GWEN_DB_NODE *n, const char *path)
Definition: db.c:922
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_Dump(GWEN_DB_NODE *n, int insert)
Definition: db.c:1420
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:214
#define DBG_WARN(dbg_logger, format, args...)
Definition: debug.h:125
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
GWENHYWFAR_API int GWEN_Directory_GetPath(const char *path, unsigned int flags)
#define GWEN_ERROR_BAD_DATA
Definition: error.h:121
#define GWEN_ERROR_IO
Definition: error.h:123
#define GWEN_ERROR_GENERIC
Definition: error.h:62
void GWB_File_SetInstallPath(GWB_FILE *f, const char *s)
Definition: file.c:215
void GWB_File_SetBuilder(GWB_FILE *f, const char *s)
Definition: file.c:200
void GWB_File_SetFileType(GWB_FILE *f, const char *s)
Definition: file.c:234
GWB_FILE * GWB_File_List2_GetOrCreateFile(GWB_FILE_LIST2 *fileList, const char *folder, const char *fname)
Definition: file.c:385
void GWB_File_AddFlags(GWB_FILE *f, uint32_t i)
Definition: file.c:113
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 GWBUILD_AddBuildFilename(GWENBUILD *gwenbuild, const char *s)
Definition: gwenbuild.c:147
GWBUILD_TARGETTYPE
Definition: gwenbuild.h:18
struct GWENBUILD GWENBUILD
Definition: gwenbuild.h:15
#define GWEN_DIR_SEPARATOR_S
#define GWEN_LOGDOMAIN
Definition: logger.h:35
int GWB_ParseProject(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_project.c:51
static int _parseIfVarMatches(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:494
static int _getFilePermissions(const char *fname)
Definition: parser.c:803
GWEN_BUFFER * GWB_Parser_ReadNamedXmlDataIntoBufferAndExpand(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode, const char *elem)
Definition: parser.c:345
GWB_CONTEXT * GWB_Parser_CopyContextForTarget(const GWB_CONTEXT *sourceContext)
Definition: parser.c:153
static int _readModifyWriteFile(GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbContextVars, const char *sSourceFile, const char *sDestFile)
Definition: parser.c:743
int GWB_Parser_ParseSubdirs(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:367
static int _parseIfNotVarMatches(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:549
GWB_CONTEXT * GWB_Parser_CopyContextForSubdir(const GWB_CONTEXT *sourceContext, const char *folder)
Definition: parser.c:118
GWEN_STRINGLIST * GWB_Parser_ReadXmlDataIntoStringList(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
Definition: parser.c:283
static int _parseWriteFile(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: parser.c:686
static int _setFilePermissions(const char *fname, int perms)
Definition: parser.c:823
GWEN_XMLNODE * GWB_Parser_ReadBuildFile(GWENBUILD *gwbuild, const GWB_CONTEXT *currentContext, const char *fileName)
Definition: parser.c:168
int GWB_Parser_ParseWellKnownElements(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:942
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 int _parseSubdir(GWB_PROJECT *project, GWB_CONTEXT *currentContext, const char *sFolder, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:410
static void _appendVarValue(GWEN_DB_NODE *db, const char *name, const char *newValue)
Definition: parser.c:835
static GWEN_BUFFER * _getSourcePathForFileName(const GWB_CONTEXT *currentContext, const char *fileName)
Definition: parser.c:214
static void _addBuildFileNameToGwBuild(GWENBUILD *gwbuild, const GWB_CONTEXT *currentContext, const char *fileName)
Definition: parser.c:231
static int _getAndCheckRequiredGwenVersion(GWEN_XMLNODE *xmlGwbuildNode)
Definition: parser.c:253
GWB_PROJECT * GWB_Parser_ReadBuildTree(GWENBUILD *gwbuild, GWB_CONTEXT *currentContext, const char *srcDir, GWB_KEYVALUEPAIR_LIST *givenOptionList)
Definition: parser.c:60
static int _parseIfVarHasValue(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:604
static int _varHasValue(GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: parser.c:650
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
static int _parseSetVar(GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: parser.c:450
GWEN_BUFFER * GWB_Parser_ReadXmlDataIntoBufferAndExpand(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
Definition: parser.c:307
int GWB_Parser_ReplaceVarsBetweenAtSigns(const char *s, GWEN_BUFFER *dbuf, GWEN_DB_NODE *db)
Definition: parser.c:873
static int _parseIfNotVarHasValue(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
Definition: parser.c:627
void GWB_Parser_SetItemValue(GWEN_DB_NODE *db, const char *sId, const char *suffix, const char *value)
Definition: parser.c:856
#define GWB_PARSER_SRCFILEFLAGS_ALWAYSDIST
Definition: parser.h:25
#define GWB_PARSER_SRCFILEFLAGS_ISSOURCE
Definition: parser.h:26
#define GWB_PARSER_FILENAME
Definition: parser.h:21
int(* GWB_PARSER_PARSE_ELEMENT_FN)(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: parser.h:47
void GWB_Project_free(GWB_PROJECT *project)
Definition: project.c:51
void GWB_Project_SetGivenOptionList(GWB_PROJECT *project, GWB_KEYVALUEPAIR_LIST *kvpList)
Definition: project.c:381
void GWB_Project_AddTarget(GWB_PROJECT *project, GWB_TARGET *target)
Definition: project.c:241
GWB_PROJECT * GWB_Project_new(GWENBUILD *gwbuild, GWB_CONTEXT *ctx)
Definition: project.c:30
GWENBUILD * GWB_Project_GetGwbuild(const GWB_PROJECT *project)
Definition: project.c:70
GWB_FILE_LIST2 * GWB_Project_GetFileList(const GWB_PROJECT *project)
Definition: project.c:205
struct GWB_PROJECT GWB_PROJECT
Definition: project.h:14
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:746
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
int GWEN_SyncIo_Helper_WriteFile(const char *fName, const uint8_t *ptrSource, uint64_t lenSource)
Definition: syncio.c:586
int GWEN_SyncIo_Helper_ReadFile(const char *fName, GWEN_BUFFER *dbuf)
Definition: syncio.c:524
void GWB_Target_SetTargetType(GWB_TARGET *target, GWBUILD_TARGETTYPE t)
Definition: target.c:135
void GWB_Target_SetInstallPath(GWB_TARGET *target, const char *s)
Definition: target.c:149
GWB_TARGET * GWB_Target_new(GWB_PROJECT *project)
Definition: target.c:26
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
void GWB_Target_SetName(GWB_TARGET *target, const char *s)
Definition: target.c:78
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
int GWB_Utils_VersionStringToInt(const char *s)
Definition: utils.c:717
#define GWENHYWFAR_VERSION_PATCHLEVEL
Definition: version.h:35
#define GWENHYWFAR_VERSION_MINOR
Definition: version.h:34
#define GWENHYWFAR_VERSION_BUILD
Definition: version.h:36
#define GWENHYWFAR_VERSION_MAJOR
Definition: version.h:33
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
void GWEN_XMLNode_UnlinkChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:570
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
GWEN_XMLNODE * GWEN_XMLNode_GetFirstData(const GWEN_XMLNODE *n)
Definition: xml.c:724
int GWEN_XMLNode_ExpandProperties(const GWEN_XMLNODE *n, GWEN_DB_NODE *dbVars)
Definition: xml.c:634
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
#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:1297
@ GWEN_XMLNodeTypeTag
Definition: xml.h:145