gwenhywfar  5.10.1
tm2c_tree2.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Thu Jul 02 2009
3  copyright : (C) 2018 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 
15 #include "tm2c_tree2.h"
16 #include "tm2c_misc.h"
17 
18 #include <gwenhywfar/debug.h>
19 
20 #include <ctype.h>
21 
22 
26 
27 
28 
29 
31 {
32  int rv;
33 
34  _addGetByMemberProtoType(tb, ty, tm);
35  rv=_addGetByMemberImplementation(tb, ty, tm);
36  if (rv<0) {
37  DBG_INFO(NULL, "here (%d)", rv);
38  return rv;
39  }
40 
41  return 0;
42 }
43 
44 
45 
47 {
48  GWEN_BUFFER *tbuf;
49  const char *s;
51  TYPEMAKER2_TYPE *mty;
52 
55  assert(mty);
56 
57  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
58 
60  if (s)
61  GWEN_Buffer_AppendArgs(tbuf, "%s ", s);
62  _addGetByMemberDeclaration(ty, tm, tbuf);
63  GWEN_Buffer_AppendString(tbuf, ";\n");
64 
66  GWEN_Buffer_free(tbuf);
67 }
68 
69 
70 
72 {
73  GWEN_BUFFER *tbuf;
74  TYPEMAKER2_TYPE *mty;
75  const char *sTypeId;
76  const char *sTypePrefix;
77  const char *sMemberName;
78 
80  assert(mty);
81 
83  sTypePrefix=Typemaker2_Type_GetPrefix(ty);
84  sMemberName=Typemaker2_Member_GetName(tm);
85 
86  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
87 
88  _addGetByMemberDeclaration(ty, tm, tbuf);
89  GWEN_Buffer_AppendString(tbuf, "{\n");
90 
91  GWEN_Buffer_AppendArgs(tbuf, " %s *p_struct;\n\n", sTypeId);
92  GWEN_Buffer_AppendString(tbuf, " assert(p_object);\n");
93  GWEN_Buffer_AppendArgs(tbuf, " p_struct = %s_Tree2_GetFirstChild(p_object);\n", sTypePrefix);
94  GWEN_Buffer_AppendString(tbuf, " while(p_struct) {\n");
95  GWEN_Buffer_AppendString(tbuf, " int p_rv;\n");
96  GWEN_Buffer_AppendString(tbuf, "\n");
97 
98  GWEN_Buffer_AppendString(tbuf, " ");
99  if (1) {
100  GWEN_BUFFER *dstbuf;
101  GWEN_BUFFER *srcbuf;
102  int rv;
103 
104  srcbuf=GWEN_Buffer_new(0, 256, 0, 1);
105  GWEN_Buffer_AppendString(srcbuf, "p_cmp");
106 
107  dstbuf=GWEN_Buffer_new(0, 256, 0, 1);
108  GWEN_Buffer_AppendArgs(dstbuf, "p_struct->%s", sMemberName);
109 
111  GWEN_Buffer_GetStart(srcbuf),
112  GWEN_Buffer_GetStart(dstbuf),
113  tbuf);
114  GWEN_Buffer_free(srcbuf);
115  GWEN_Buffer_free(dstbuf);
116  if (rv<0) {
117  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
118  GWEN_Buffer_free(tbuf);
119  return rv;
120  }
121  GWEN_Buffer_AppendString(tbuf, "\n");
122  }
123 
124 
125  GWEN_Buffer_AppendString(tbuf, " if (p_rv == 0)\n");
126  GWEN_Buffer_AppendString(tbuf, " return p_struct;\n");
127  GWEN_Buffer_AppendArgs(tbuf, " p_struct = %s_Tree2_GetBelow(p_struct);\n", sTypePrefix);
128  GWEN_Buffer_AppendString(tbuf, " }\n");
129 
130  GWEN_Buffer_AppendString(tbuf, " return NULL;\n");
131  GWEN_Buffer_AppendString(tbuf, "}\n");
132 
134  GWEN_Buffer_free(tbuf);
135 
136  return 0;
137 }
138 
139 
140 
142 {
143  TYPEMAKER2_TYPE *mty;
144  const char *sTypeId;
145  const char *sTypePrefix;
146  const char *sMemberName;
147  const char *sMemberTypeId;
148 
150  assert(mty);
151 
152  sTypeId=Typemaker2_Type_GetIdentifier(ty);
153  sTypePrefix=Typemaker2_Type_GetPrefix(ty);
154  sMemberName=Typemaker2_Member_GetName(tm);
155  sMemberTypeId=Typemaker2_Type_GetIdentifier(mty);
156 
158  "%s *%s_Tree2_GetBy%c%s(const %s *p_object, ",
159  sTypeId,
160  sTypePrefix,
161  toupper(*sMemberName),
162  sMemberName+1,
163  sTypeId);
166  GWEN_Buffer_AppendArgs(tbuf, " const %s *", sMemberTypeId);
167  else
168  GWEN_Buffer_AppendArgs(tbuf, "%s ", sMemberTypeId);
169  GWEN_Buffer_AppendString(tbuf, "p_cmp)");
170 }
171 
172 
173 
int Typemaker2_Builder_Invoke_CompareFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
Definition: tm_builder.c:133
TYPEMAKER2_TYPE * Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:467
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
static void _addGetByMemberDeclaration(TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition: tm2c_tree2.c:141
#define NULL
Definition: binreloc.c:300
#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
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:543
int GWEN_Buffer_AppendArgs(GWEN_BUFFER *bf, const char *fmt,...)
Definition: buffer.c:1084
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition: tm_builder.h:26
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
int TM2C_BuildTree2GetByMember(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_tree2.c:30
void Typemaker2_Builder_AddCode(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:204
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition: tm_type.h:21
void Typemaker2_Builder_AddPublicDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition: tm_builder.c:172
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:565
int Typemaker2_Type_GetType(const TYPEMAKER2_TYPE *ty)
Definition: tm_type.c:171
static void _addGetByMemberProtoType(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_tree2.c:46
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition: tm_member.h:21
static int _addGetByMemberImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition: tm2c_tree2.c:71
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition: tm_member.c:83
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989