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> 31 #include <sys/types.h> 63 GWB_KEYVALUEPAIR_LIST *givenOptionList)
83 if (xmlNewFile==
NULL) {
84 DBG_ERROR(
NULL,
"No valid node found in build file of folder \"%s\"", srcDir);
89 if (xmlProject==
NULL) {
90 DBG_ERROR(
NULL,
"No project node found in build file of folder \"%s\"", srcDir);
106 DBG_ERROR(
NULL,
"Error parsing build tree in folder \"%s\"", srcDir);
188 if (xmlGwbuildNode==
NULL) {
209 return xmlGwbuildNode;
234 const char *buildDir;
235 const char *initialSourceDir;
272 if (vCurrent<vRequired) {
273 DBG_ERROR(
NULL,
"Minimum GWENBUILD version required is %x", vRequired);
380 if (sFolder && *sFolder) {
385 DBG_ERROR(
NULL,
"Could not create folder \"%s\" in build tree", sFolder);
388 if (chdir(sFolder)==-1) {
389 DBG_ERROR(
NULL,
"Could not enter folder \"%s\" in build tree (%s)",
390 sFolder, strerror(errno));
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);
434 rv=fn(project, newContext, xmlNewFile);
443 GWB_Context_Tree2_AddChild(currentContext, newContext);
444 fprintf(stdout,
"Leaving folder \"%s\"\n", sFolder);
460 if (!(sName && *sName)) {
467 "%s: Please dont use property \"value\", just store the value between <setVar> and </setVar>",
475 if (strcasecmp(sMode,
"replace")==0)
477 else if (strcasecmp(sMode,
"add")==0)
479 else if (strcasecmp(sMode,
"append")==0)
484 if (strcasecmp(sMode,
"replace")==0) {
497 const char *sPattern;
498 const char *sValueInDb;
510 if (!(sName && *sName)) {
516 if (!(sPattern && *sPattern)) {
522 if (!(sValueInDb && *sValueInDb)) {
523 DBG_ERROR(
NULL,
"No value for \"%s\" in db for <ifVarMatches>", sName);
528 rv=fn(project, currentContext, xmlThen?xmlThen:xmlNode);
536 rv=fn(project, currentContext, xmlElse);
552 const char *sPattern;
553 const char *sValueInDb;
565 if (!(sName && *sName)) {
571 if (!(sPattern && *sPattern)) {
577 if (!(sValueInDb && *sValueInDb)) {
578 DBG_ERROR(
NULL,
"No value for \"%s\" in db for <ifNotVarMatches>", sName);
583 rv=fn(project, currentContext, xmlThen?xmlThen:xmlNode);
591 rv=fn(project, currentContext, xmlElse);
616 return fn(project, currentContext, xmlThen?xmlThen:xmlNode);
620 return fn(project, currentContext, xmlElse);
639 return fn(project, currentContext, xmlThen?xmlThen:xmlNode);
643 return fn(project, currentContext, xmlElse);
653 const char *sPattern;
660 if (!(sName && *sName)) {
666 if (!(sPattern && *sPattern)) {
671 for (i=0; i<100; i++) {
672 const char *sValueInDb;
688 const char *fileName;
691 const char *installPath;
701 if (!(fileName && *fileName)) {
723 if (installPath && *installPath) {
745 const char *fileName;
752 if (!(fileName && *fileName)) {
759 DBG_ERROR(
NULL,
"Could not read permissions for \"%s\" (%d)", sSourceFile, rv);
768 DBG_ERROR(
NULL,
"Could not read \"%s\" (%d)", sSourceFile, rv);
777 DBG_ERROR(
NULL,
"Error translating content of file \"%s\" (%d)", sSourceFile, rv);
788 DBG_ERROR(
NULL,
"Could not write \"%s\" (%d)", sDestFile, rv);
794 DBG_ERROR(
NULL,
"Could not set perms for \"%s\" (%d)", sDestFile, rv);
808 #if _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED 809 rv=lstat(fname, &st);
814 DBG_ERROR(
NULL,
"Error on stat(\"%s\"): %d (%s)", fname, errno, strerror(errno));
818 return (
int)((st.st_mode & ~S_IFMT));
825 if (chmod(fname, perms) == -1) {
826 DBG_ERROR(
NULL,
"Error on chmod(\"%s\"): %d (%s)", fname, errno, strerror(errno));
888 else if (!isalpha(*p)) {
896 while (*p && *p!=
'@' && (isalnum(*p) || *p==
'_'))
908 rawName=(
char *) malloc(len+1);
910 memmove(rawName, pStart, len);
918 DBG_WARN(
NULL,
"Warning: Empty value for DB var \"%s\"", rawName);
952 if (strcasecmp(name,
"writeFile")==0)
954 else if (strcasecmp(name,
"setVar")==0)
956 else if (strcasecmp(name,
"ifVarMatches")==0)
958 else if (strcasecmp(name,
"ifNotVarMatches")==0)
960 else if (strcasecmp(name,
"ifVarHasValue")==0)
962 else if (strcasecmp(name,
"ifNotVarHasValue")==0)
985 const char *defaultTypeName,
986 const char *defaultBuilder)
991 const char *installPath;
992 const char *fileType;
993 const char *currentFolder;
1009 if (installPath && *installPath)
1013 if (s && *s && (strcasecmp(s,
"true")==0 || strcasecmp(s,
"yes")==0))
1017 if (s && *s && (strcasecmp(s,
"true")==0 || strcasecmp(s,
"yes")==0))
1026 const char *sFileName;
1029 if (sFileName && *sFileName) {
1057 const char *fileName,
1058 const char *fileType,
1059 const char *builderName,
1060 const char *installPath)
1065 const char *currentFolder;
1079 GWB_Context_Tree2_AddChild(currentContext, newContext);
1085 if (installPath && *installPath)
int GWEN_DB_ReplaceVars(GWEN_DB_NODE *db, const char *s, GWEN_BUFFER *dbuf)
void GWB_Target_SetName(GWB_TARGET *target, const char *s)
void GWB_Target_SetTargetType(GWB_TARGET *target, GWBUILD_TARGETTYPE t)
void GWB_Context_AddCurrentBuildDir(GWB_CONTEXT *ctx, const char *s)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
#define GWENHYWFAR_VERSION_MAJOR
struct GWB_CONTEXT GWB_CONTEXT
#define GWEN_DB_FLAGS_OVERWRITE_VARS
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
GWEN_STRINGLIST * GWB_Parser_ReadXmlDataIntoStringList(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
void GWB_Project_free(GWB_PROJECT *project)
struct GWEN_DB_NODE GWEN_DB_NODE
#define GWEN_XML_FLAGS_DEFAULT
#define GWEN_DIR_SEPARATOR_S
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
int(* GWB_PARSER_PARSE_ELEMENT_FN)(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
#define GWB_PARSER_FILENAME
void GWB_File_SetInstallPath(GWB_FILE *f, const char *s)
GWENBUILD * GWB_Project_GetGwbuild(const GWB_PROJECT *project)
GWEN_XMLNODE * GWEN_XMLNode_GetFirstData(const GWEN_XMLNODE *n)
GWB_CONTEXT * GWB_Parser_CopyContextForTarget(const GWB_CONTEXT *sourceContext)
GWEN_BUFFER * GWB_Parser_ReadNamedXmlDataIntoBufferAndExpand(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode, const char *elem)
GWB_CONTEXT * GWB_Parser_CopyContextForSubdir(const GWB_CONTEXT *sourceContext, const char *folder)
void GWB_File_AddFlags(GWB_FILE *f, uint32_t i)
int GWEN_SyncIo_Helper_ReadFile(const char *fName, GWEN_BUFFER *dbuf)
GWB_PROJECT * GWB_Project_new(GWENBUILD *gwbuild, GWB_CONTEXT *ctx)
GWB_FILE * GWB_File_List2_GetOrCreateFile(GWB_FILE_LIST2 *fileList, const char *folder, const char *fname)
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
void GWB_File_SetFileType(GWB_FILE *f, const char *s)
void GWB_Context_ClearSourceFileList2(GWB_CONTEXT *ctx)
struct GWB_PROJECT GWB_PROJECT
#define DBG_WARN(dbg_logger, format, args...)
#define GWENHYWFAR_VERSION_PATCHLEVEL
static int _parseSubdir(GWB_PROJECT *project, GWB_CONTEXT *currentContext, const char *sFolder, GWB_PARSER_PARSE_ELEMENT_FN fn)
int GWB_Utils_VersionStringToInt(const char *s)
static int _readModifyWriteFile(GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbContextVars, const char *sSourceFile, const char *sDestFile)
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
#define GWB_FILE_FLAGS_DIST
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
#define GWENHYWFAR_VERSION_BUILD
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
int GWB_Parser_ParseSubdirs(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode, GWB_PARSER_PARSE_ELEMENT_FN fn)
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
static int _parseIfNotVarHasValue(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
#define GWB_FILE_FLAGS_INSTALL
static int _parseIfVarMatches(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
#define GWB_PARSER_SRCFILEFLAGS_ISSOURCE
GWEN_BUFFER * GWB_Parser_ReadXmlDataIntoBufferAndExpand(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
int GWB_Parser_ParseWellKnownElements(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
void GWB_Target_SetContext(GWB_TARGET *target, GWB_CONTEXT *ctx)
void GWB_Target_SetId(GWB_TARGET *target, const char *s)
#define GWEN_ERROR_BAD_DATA
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
GWB_FILE_LIST2 * GWB_Project_GetFileList(const GWB_PROJECT *project)
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
GWEN_DB_NODE * GWB_Context_GetVars(const GWB_CONTEXT *ctx)
void GWB_Project_SetGivenOptionList(GWB_PROJECT *project, GWB_KEYVALUEPAIR_LIST *kvpList)
void GWB_File_SetBuilder(GWB_FILE *f, const char *s)
struct GWB_TARGET GWB_TARGET
static int _getFilePermissions(const char *fname)
const char * GWB_Context_GetInitialSourceDir(const GWB_CONTEXT *ctx)
#define DBG_DEBUG(dbg_logger, format, args...)
GWB_TARGET * GWB_Target_new(GWB_PROJECT *project)
#define GWB_PARSER_SRCFILEFLAGS_ALWAYSDIST
const char * GWB_Context_GetTopSourceDir(const GWB_CONTEXT *ctx)
void GWB_Context_AddCurrentRelativeDir(GWB_CONTEXT *ctx, const char *s)
void GWB_Target_SetInstallPath(GWB_TARGET *target, const char *s)
int GWEN_DB_DeleteGroup(GWEN_DB_NODE *n, const char *path)
static int _getAndCheckRequiredGwenVersion(GWEN_XMLNODE *xmlGwbuildNode)
static int _parseIfVarHasValue(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
#define GWEN_ERROR_GENERIC
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)
static GWEN_BUFFER * _getSourcePathForFileName(const GWB_CONTEXT *currentContext, const char *fileName)
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
GWEN_STRINGLIST * GWEN_StringList_fromString(const char *str, const char *delimiters, int checkDouble)
void GWB_Context_SetInitialSourceDir(GWB_CONTEXT *ctx, const char *s)
int GWB_ParseProject(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
int GWB_Parser_ParseSourcesOrHeaders(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode, uint32_t fileFlags, const char *defaultTypeName, const char *defaultBuilder)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
int GWEN_DB_DeleteVar(GWEN_DB_NODE *n, const char *path)
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
void GWEN_XMLNode_UnlinkChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
GWB_PROJECT * GWB_Parser_ReadBuildTree(GWENBUILD *gwbuild, GWB_CONTEXT *currentContext, const char *srcDir, GWB_KEYVALUEPAIR_LIST *givenOptionList)
#define DBG_ERROR(dbg_logger, format, args...)
static int _setFilePermissions(const char *fname, int perms)
void GWB_Context_InsertCurrentSourceDir(GWB_CONTEXT *ctx, const char *s)
void GWB_Context_SetCurrentSourceDir(GWB_CONTEXT *ctx, const char *s)
static int _parseSetVar(GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
GWEN_XMLNODE * GWB_Parser_ReadBuildFile(GWENBUILD *gwbuild, const GWB_CONTEXT *currentContext, const char *fileName)
void GWB_Context_AddCurrentSourceDir(GWB_CONTEXT *ctx, const char *s)
static int _parseWriteFile(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
GWB_CONTEXT * GWB_Context_dup(const GWB_CONTEXT *originalCtx)
void GWB_Context_InsertTopBuildDir(GWB_CONTEXT *ctx, const char *s)
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
static int _varHasValue(GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
#define DBG_INFO(dbg_logger, format, args...)
#define GWENHYWFAR_VERSION_MINOR
void GWB_Context_InsertTopSourceDir(GWB_CONTEXT *ctx, const char *s)
GWENHYWFAR_API int GWEN_Directory_GetPath(const char *path, unsigned int flags)
const char * GWB_Context_GetTopBuildDir(const GWB_CONTEXT *ctx)
void GWB_Parser_SetItemValue(GWEN_DB_NODE *db, const char *sId, const char *suffix, const char *value)
int GWB_Parser_ReplaceVarsBetweenAtSigns(const char *s, GWEN_BUFFER *dbuf, GWEN_DB_NODE *db)
static void _appendVarValue(GWEN_DB_NODE *db, const char *name, const char *newValue)
void GWB_Project_AddTarget(GWB_PROJECT *project, GWB_TARGET *target)
int GWEN_XMLNode_ExpandProperties(const GWEN_XMLNODE *n, GWEN_DB_NODE *dbVars)
const char * GWB_Context_GetCurrentRelativeDir(const GWB_CONTEXT *ctx)
struct GWENBUILD GWENBUILD
void GWB_Context_SetCurrentTarget(GWB_CONTEXT *ctx, GWB_TARGET *target)
void GWB_Context_ClearDefineList(GWB_CONTEXT *ctx)
void GWB_Context_free(GWB_CONTEXT *ctx)
void GWB_Context_AddSourceFile(GWB_CONTEXT *ctx, GWB_FILE *f)
void GWBUILD_AddBuildFilename(GWENBUILD *gwenbuild, const char *s)
static void _addBuildFileNameToGwBuild(GWENBUILD *gwbuild, const GWB_CONTEXT *currentContext, const char *fileName)
struct GWEN__XMLNODE GWEN_XMLNODE
int GWEN_SyncIo_Helper_WriteFile(const char *fName, const uint8_t *ptrSource, uint64_t lenSource)
#define GWB_FILE_FLAGS_GENERATED
void GWB_Context_ClearIncludeList(GWB_CONTEXT *ctx)
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
const char * GWB_Context_GetCurrentSourceDir(const GWB_CONTEXT *ctx)
const char * GWB_Context_GetCurrentBuildDir(const GWB_CONTEXT *ctx)
static int _parseIfNotVarMatches(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *n, GWB_PARSER_PARSE_ELEMENT_FN fn)
void GWB_Context_SetTopSourceDir(GWB_CONTEXT *ctx, const char *s)