gwenhywfar 5.10.1
p_checklibs.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
22
23static int _parseChildNodes(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
24static int _parseLib(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
25static GWEN_BUFFER *_createTestCodeForLib(const char *fnName);
26
27
28
29
30
31
32int GWB_ParseCheckLibs(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
33{
34 int rv;
35
36 rv=_parseChildNodes(project, currentContext, xmlNode);
37 if (rv<0) {
38 DBG_INFO(NULL, "here (%d)", rv);
39 return rv;
40 }
41
42 return 0;
43}
44
45
46
47int _parseChildNodes(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
48{
49 GWEN_XMLNODE *n;
50
51 n=GWEN_XMLNode_GetFirstTag(xmlNode);
52 while (n) {
53 const char *name;
54
56 if (name && *name) {
57 int rv;
58
59 DBG_DEBUG(NULL, "Handling element \"%s\"", name);
60
61 if (strcasecmp(name, "lib")==0)
62 rv=_parseLib(project, currentContext, n);
63 else {
64 DBG_INFO(NULL, "Element not handled");
65 rv=0;
66 }
67 if (rv<0) {
68 DBG_ERROR(GWEN_LOGDOMAIN, "Error in element \"%s\", aborting", name);
69 return rv;
70 }
71 }
72
74 }
75
76 return 0;
77}
78
79
80
81int _parseLib(GWEN_UNUSED GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
82{
83 int rv;
84 const char *sId;
85 const char *sName;
86 const char *sFunction;
87 GWEN_DB_NODE *db;
88
89 db=GWB_Context_GetVars(currentContext);
90
91 rv=GWEN_XMLNode_ExpandProperties(xmlNode, db);
92 if (rv<0) {
93 DBG_INFO(NULL, "here (%d)", rv);
94 return rv;
95 }
96
97 sId=GWEN_XMLNode_GetProperty(xmlNode, "id", NULL);
98 if (!(sId && *sId)) {
99 DBG_ERROR(NULL, "Dependency has no id");
100 return GWEN_ERROR_GENERIC;
101 }
102
103 sName=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
104 if (!(sName && *sName)) {
105 DBG_ERROR(NULL, "Dependency has no name");
106 return GWEN_ERROR_GENERIC;
107 }
108
109
110 sFunction=GWEN_XMLNode_GetProperty(xmlNode, "function", NULL);
111 if (sFunction && *sFunction) {
112 GWEN_BUFFER *codeBuf;
113
114 codeBuf=_createTestCodeForLib(sFunction);
115 rv=GWB_Tools_TryLink(currentContext, GWEN_Buffer_GetStart(codeBuf), sName);
116 GWEN_Buffer_free(codeBuf);
117 }
118 else
119 rv=GWB_Tools_TryLink(currentContext, "int main(int argc, char **argv) {return 0;}", sName);
120 if (rv<0) {
121 DBG_INFO(NULL, "here (%d)", rv);
122 return rv;
123 }
124 else if (rv==0) {
125 GWEN_BUFFER *dbuf;
126
127 GWB_Parser_SetItemValue(db, sId, "_EXISTS", "TRUE");
128 dbuf=GWEN_Buffer_new(0, 256, 0, 1);
129 GWEN_Buffer_AppendString(dbuf, "-l");
130 GWEN_Buffer_AppendString(dbuf, sId);
131 GWB_Parser_SetItemValue(db, sId, "_LIBS", GWEN_Buffer_GetStart(dbuf));
132 GWEN_Buffer_free(dbuf);
133
134 fprintf(stdout, " lib %s: found\n", sName);
135 }
136 else {
137 GWB_Parser_SetItemValue(GWB_Context_GetVars(currentContext), sId, "_EXISTS", "FALSE");
138 fprintf(stdout, " lib %s: not found\n", sName);
139 }
140 return 0;
141}
142
143
144
146{
147 GWEN_BUFFER *codeBuf;
148
149 codeBuf=GWEN_Buffer_new(0, 256, 0, 1);
150 GWEN_Buffer_AppendArgs(codeBuf, "int %s(void);\n", fnName);
151 GWEN_Buffer_AppendArgs(codeBuf, "int main(int argc, char **argv) {return %s();}", fnName);
152 return codeBuf;
153}
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_DEBUG(dbg_logger, format, args...)
Definition: debug.h:214
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
#define GWEN_ERROR_GENERIC
Definition: error.h:62
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
#define GWEN_UNUSED
#define GWEN_LOGDOMAIN
Definition: logger.h:35
static int _parseChildNodes(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_checklibs.c:47
static int _parseLib(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
int GWB_ParseCheckLibs(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_checklibs.c:32
static GWEN_BUFFER * _createTestCodeForLib(const char *fnName)
Definition: p_checklibs.c:145
void GWB_Parser_SetItemValue(GWEN_DB_NODE *db, const char *sId, const char *suffix, const char *value)
Definition: parser.c:856
struct GWB_PROJECT GWB_PROJECT
Definition: project.h:14
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition: xml.c:705
GWEN_XMLNODE * GWEN_XMLNode_GetNextTag(const GWEN_XMLNODE *n)
Definition: xml.c:712
int GWEN_XMLNode_ExpandProperties(const GWEN_XMLNODE *n, GWEN_DB_NODE *dbVars)
Definition: xml.c:634
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156