gwenhywfar 5.14.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
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
#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:1087
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
#define DBG_INFO(dbg_logger, format,...)
Definition debug.h:181
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
#define GWEN_LOGDOMAIN
Definition logger.h:32
int TM2C_BuildTree2GetByMember(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition tm2c_tree2.c:30
static void _addGetByMemberDeclaration(TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_BUFFER *tbuf)
Definition tm2c_tree2.c:141
static int _addGetByMemberImplementation(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition tm2c_tree2.c:71
static void _addGetByMemberProtoType(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm)
Definition tm2c_tree2.c:46
void Typemaker2_Builder_AddCode(TYPEMAKER2_BUILDER *tb, const char *s)
Definition tm_builder.c:204
void Typemaker2_Builder_AddPublicDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
Definition tm_builder.c:172
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
Definition tm_builder.c:133
int Typemaker2_Builder_Invoke_CompareFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst, GWEN_BUFFER *dbuf)
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
Definition tm_builder.h:26
TYPEMAKER2_TYPE * Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:467
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
Definition tm_member.c:83
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
Definition tm_member.h:21
int Typemaker2_Type_GetType(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:171
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:585
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
Definition tm_type.c:607
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
Definition tm_type.h:21
@ TypeMaker2_Type_Array
Definition tm_type.h:79
@ TypeMaker2_Type_Pointer
Definition tm_type.h:78
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER