gwenhywfar  5.10.1
p_checkheaders.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 
18 
19 #include <gwenhywfar/debug.h>
20 
21 #include <ctype.h>
22 
23 
24 
25 static int _checkHeader(GWB_PROJECT *project, GWB_CONTEXT *currentContext, const char *header);
26 static void _setVarHeaderExists(GWEN_DB_NODE *db, const char *header, int exists);
27 static void _setDefineHeaderExists(GWB_PROJECT *project, const char *header);
28 static void _toUpperAndReplacePointWithUnderscore(char *ptr);
29 static void _replacePointWithUnderscore(char *ptr);
30 
31 
32 
33 
34 
35 
36 int GWB_ParseCheckHeaders(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
37 {
38  int rv;
39  GWEN_STRINGLIST *fileNameList;
40 
41  rv=GWEN_XMLNode_ExpandProperties(xmlNode, GWB_Context_GetVars(currentContext));
42  if (rv<0) {
43  DBG_INFO(NULL, "here (%d)", rv);
44  return rv;
45  }
46 
47  fileNameList=GWB_Parser_ReadXmlDataIntoStringList(GWB_Context_GetVars(currentContext), xmlNode);
48  if (fileNameList) {
50 
51  se=GWEN_StringList_FirstEntry(fileNameList);
52  while(se) {
53  const char *sFileName;
54 
55  sFileName=GWEN_StringListEntry_Data(se);
56  if (sFileName && *sFileName) {
57  rv=_checkHeader(project, currentContext, sFileName);
58  if (rv<0) {
59  DBG_INFO(NULL, "here (%d)", rv);
60  GWEN_StringList_free(fileNameList);
61  return rv;
62  }
63  }
64 
66  }
67  GWEN_StringList_free(fileNameList);
68  }
69 
70  return 0;
71 }
72 
73 
74 
75 int _checkHeader(GWB_PROJECT *project, GWB_CONTEXT *currentContext, const char *header)
76 {
77  GWEN_BUFFER *codeBuf;
78  int rv;
79 
80  codeBuf=GWEN_Buffer_new(0, 256, 0, 1);
81  GWEN_Buffer_AppendArgs(codeBuf, "#include <%s>\n", header);
82  GWEN_Buffer_AppendString(codeBuf, "int main(int argc, char **argv) { return 0;};\n");
83 
84  rv=GWB_Tools_TryCompile(currentContext, GWEN_Buffer_GetStart(codeBuf));
85  if (rv<0) {
86  DBG_INFO(NULL, "here (%d)", rv);
87  GWEN_Buffer_free(codeBuf);
88  return rv;
89  }
90 
91  _setVarHeaderExists(GWB_Context_GetVars(currentContext), header, (rv==0)?1:0);
92  if (rv==0)
93  _setDefineHeaderExists(project, header);
94  return 0;
95 }
96 
97 
98 
99 void _setVarHeaderExists(GWEN_DB_NODE *db, const char *header, int exists)
100 {
101  GWEN_BUFFER *nameBuf;
102 
103  fprintf(stdout, " header %s: %s\n", header, exists?"found":"not found");
104 
105  nameBuf=GWEN_Buffer_new(0, 256, 0, 1);
106  GWEN_Buffer_AppendString(nameBuf, header);
109  GWEN_Buffer_GetStart(nameBuf),
110  "_EXISTS", exists?"TRUE":"FALSE");
111  GWEN_Buffer_free(nameBuf);
112 }
113 
114 
115 
116 void _setDefineHeaderExists(GWB_PROJECT *project, const char *header)
117 {
118  GWEN_BUFFER *nameBuf;
119 
120  nameBuf=GWEN_Buffer_new(0, 256, 0, 1);
121  GWEN_Buffer_AppendString(nameBuf, "HAVE_");
122  GWEN_Buffer_AppendString(nameBuf, header);
124  GWB_Project_SetDefine(project, GWEN_Buffer_GetStart(nameBuf), "1");
125 
126  GWEN_Buffer_free(nameBuf);
127 }
128 
129 
130 
132 {
133  while(ptr && *ptr) {
134  if (*ptr<32)
135  *ptr=32;
136  else if (*ptr=='.' || *ptr=='/')
137  *ptr='_';
138  else
139  *ptr=toupper(*ptr);
140  ptr++;
141  }
142 }
143 
144 
145 
147 {
148  while(ptr && *ptr) {
149  if (*ptr<32)
150  *ptr=32;
151  else if (*ptr=='.' || *ptr=='/')
152  *ptr='_';
153  ptr++;
154  }
155 }
156 
157 
158 
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:53
struct GWB_CONTEXT GWB_CONTEXT
Definition: context.h:17
GWEN_STRINGLIST * GWB_Parser_ReadXmlDataIntoStringList(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
Definition: parser.c:283
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
static void _setVarHeaderExists(GWEN_DB_NODE *db, const char *header, int exists)
static void _replacePointWithUnderscore(char *ptr)
static int _checkHeader(GWB_PROJECT *project, GWB_CONTEXT *currentContext, const char *header)
static void _toUpperAndReplacePointWithUnderscore(char *ptr)
#define NULL
Definition: binreloc.c:300
int GWB_ParseCheckHeaders(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
void GWB_Project_SetDefine(GWB_PROJECT *project, const char *name, const char *value)
Definition: project.c:298
struct GWB_PROJECT GWB_PROJECT
Definition: project.h:14
static void _setDefineHeaderExists(GWB_PROJECT *project, const char *header)
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:390
int GWB_Tools_TryCompile(GWB_CONTEXT *context, const char *testCode)
Definition: trycompile.c:26
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:406
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
GWEN_DB_NODE * GWB_Context_GetVars(const GWB_CONTEXT *ctx)
Definition: context.c:427
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition: buffer.c:1084
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:56
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:398
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
void GWB_Parser_SetItemValue(GWEN_DB_NODE *db, const char *sId, const char *suffix, const char *value)
Definition: parser.c:856
int GWEN_XMLNode_ExpandProperties(const GWEN_XMLNODE *n, GWEN_DB_NODE *dbVars)
Definition: xml.c:634
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989