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
25static int _checkHeader(GWB_PROJECT *project, GWB_CONTEXT *currentContext, const char *header);
26static void _setVarHeaderExists(GWEN_DB_NODE *db, const char *header, int exists);
27static void _setDefineHeaderExists(GWB_PROJECT *project, const char *header);
28static void _toUpperAndReplacePointWithUnderscore(char *ptr);
29static void _replacePointWithUnderscore(char *ptr);
30
31
32
33
34
35
36int 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
75int _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
99void _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
116void _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
#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
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition: buffer.c:1084
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
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
GWEN_DB_NODE * GWB_Context_GetVars(const GWB_CONTEXT *ctx)
Definition: context.c:427
struct GWB_CONTEXT GWB_CONTEXT
Definition: context.h:17
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
static void _setVarHeaderExists(GWEN_DB_NODE *db, const char *header, int exists)
static void _toUpperAndReplacePointWithUnderscore(char *ptr)
static void _setDefineHeaderExists(GWB_PROJECT *project, const char *header)
static void _replacePointWithUnderscore(char *ptr)
static int _checkHeader(GWB_PROJECT *project, GWB_CONTEXT *currentContext, const char *header)
int GWB_ParseCheckHeaders(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
GWEN_STRINGLIST * GWB_Parser_ReadXmlDataIntoStringList(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
Definition: parser.c:283
void GWB_Parser_SetItemValue(GWEN_DB_NODE *db, const char *sId, const char *suffix, const char *value)
Definition: parser.c:856
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
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_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 GWB_Tools_TryCompile(GWB_CONTEXT *context, const char *testCode)
Definition: trycompile.c:26
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