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 
23 static int _parseChildNodes(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
24 static int _parseLib(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
25 static GWEN_BUFFER *_createTestCodeForLib(const char *fnName);
26 
27 
28 
29 
30 
31 
32 int 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 
47 int _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 
55  name=GWEN_XMLNode_GetData(n);
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 
81 int _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 
145 GWEN_BUFFER *_createTestCodeForLib(const char *fnName)
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 
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWB_CONTEXT GWB_CONTEXT
Definition: context.h:17
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
#define NULL
Definition: binreloc.c:300
struct GWB_PROJECT GWB_PROJECT
Definition: project.h:14
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
static GWEN_BUFFER * _createTestCodeForLib(const char *fnName)
Definition: p_checklibs.c:145
GWEN_DB_NODE * GWB_Context_GetVars(const GWB_CONTEXT *ctx)
Definition: context.c:427
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:214
GWEN_XMLNODE * GWEN_XMLNode_GetNextTag(const GWEN_XMLNODE *n)
Definition: xml.c:712
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition: buffer.c:1084
#define GWEN_ERROR_GENERIC
Definition: error.h:62
int GWB_ParseCheckLibs(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_checklibs.c:32
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
static int _parseChildNodes(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_checklibs.c:47
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition: xml.c:705
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
#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
static int _parseLib(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
#define GWEN_UNUSED
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989