1 #include <fstream>
2
3 #include "gen_c_body.h"
4 #include "gen.h"
5
6 // TODO: В шаблон добавить указание использовать табуляцию или пробелы и их количество
7
Generator_C_USER_Body_Prolog(CTemplate & tpl,CDomain & tmpDom,CTor & tmpTor,ofstream & src)8 int Generator_C_USER_Body_Prolog(CTemplate &tpl, CDomain &tmpDom,
9 CTor &tmpTor, ofstream &src){
10 size_t arg_idx, tmpTor_args_size /* , art_trace_n_args */;
11 CArg tmpArg;
12
13 if(tmpTor.cpp_alias != ""){
14 // Игнорировать в С++
15 return(0);
16 }
17
18 tmpArg = tmpTor.args[0];
19 src << tmpArg.type << "\t" << tpl.prefix << tmpTor.name << "(";
20 tmpTor_args_size = tmpTor.args.size();
21 for(arg_idx = 1; arg_idx < tmpTor_args_size; arg_idx++){
22 tmpArg = tmpTor.args[arg_idx];
23 src << tmpArg.type << " " << tmpArg.name << ", ";
24 }
25 src << "const char *" << tpl.prefix << "file, size_t " <<
26 tpl.prefix << "line){" << endl;
27
28 if(tmpTor.args[0].type != "void"){
29 src << "\t" << tmpTor.args[0].type << " " <<
30 tpl.prefix << "stored_retcode;" << endl;
31 }
32 if(tmpTor.is_handle_arg_out){
33 src << "\t" << tmpDom.handle << " " <<
34 tpl.prefix << "stored_handle;" << endl;
35 }
36 if(tpl.multithreaded){
37 if(tpl.threading == "posix"){
38 src << "\tint retval;" << endl;
39 }
40 else if(tpl.threading == "win32"){
41 src << "\tDWORD dwWaitObject; BOOL bReleaseMutex;" << endl;
42 }
43 }
44 src << endl;
45
46 if(tpl.multithreaded){
47 if(tpl.threading == "posix"){
48 src << "\tretval = pthread_mutex_lock(&art_mutex);" << endl;
49 src << "\tif(retval){arterrlog(\"pthread_mutex_lock()\", __FILE__, __LINE__); exit(-2);}" << endl;
50 }
51 else if(tpl.threading == "win32"){
52 src << "\tdwWaitObject = WaitForSingleObject(art_mutex, INFINITE);" << endl;
53 src << "\tif(dwWaitObject == WAIT_FAILED){arterrlog(\"WaitForSingleObject()\", __FILE__, __LINE__); exit(-2);}" << endl;
54 }
55 }
56
57 // PROLOG. FORMAT: DOMAIN TOR'NAME FILE LINE
58 #ifdef ART_DEBUG_INSERT_DEVEL_COMMENT
59 src << "\t/* PROLOG */" << endl;
60 #endif
61 src << "\tart_trace(1, \"" << tmpDom.name << "\");" << endl;
62 src << "\tart_trace(1, \"" << tmpTor.name << "\");" << endl;
63 src << "\tart_trace(1, " << tpl.prefix << "file);" << endl;
64 src << "\tart_trace(1, artsize_t2str(" << tpl.prefix << "line));" << endl;
65
66 return (0);
67 }
68
Generator_C_USER_Body_Validation(CTemplate & tpl,CDomain & tmpDom,CTor & tmpTor,ofstream & src)69 int Generator_C_USER_Body_Validation(CTemplate &tpl, CDomain &tmpDom,
70 CTor &tmpTor, ofstream &src){
71 size_t domid, // Domain ID (just index in vector of Domains)
72 t, // arg counter
73 tmpTor_validateDom_before_size;
74 string domname;
75 CArg tmpArg;
76
77 if(tmpTor.cpp_alias != ""){
78 // Игнорировать в С++
79 return(0);
80 }
81
82 // VALIDATION-IN.
83 #ifdef ART_DEBUG_INSERT_DEVEL_COMMENT
84 src << "\t/* VALIDATION-IN */" << endl;
85 #endif
86 tmpTor_validateDom_before_size = tmpTor.validateDom_before.size();
87 for(t = 1/* coz 0 is retval, ignoring */; t < tmpTor_validateDom_before_size;
88 t++){
89 domname = tmpTor.validateDom_before[t];
90 if(domname != ""){
91 domid = Domaintoid(tpl, domname);
92 if(((size_t)-1) != domid) { // found ;)
93 CExpr validationExpr;
94 string type;
95 validationExpr = tpl.domains[domid].bad_handle;
96 type = tpl.domains[domid].handle;
97
98 src << "\tif(" << tmpTor.args[t].name << " "
99 << validationExpr.oper << " "
100 << validationExpr.value << "){" << endl
101 << "\t\tart_trace(3, \"" << domname << "\", \"BAD\", artuint64tostr1("
102 #ifdef ART_FORCE_CAST_FOR_ARTUINT64TOSTR
103 << "(artuint64)"
104 #endif
105 << tmpTor.args[t].name << "));" << endl
106 << "\t}" << endl;
107 src << "\telse\t{" << endl
108 << "\t\tart_trace(3, \"" << domname << "\", \"OK\", artuint64tostr1("
109 #ifdef ART_FORCE_CAST_FOR_ARTUINT64TOSTR
110 << "(artuint64)"
111 #endif
112 << tmpTor.args[t].name << "));" << endl
113 << "\t}" << endl;
114
115 }
116 else {/* фиктивный домен */}
117 }
118 // else domname == "", it's ok
119 }
120
121 // float_arg_n1; float_arg_n2;
122 if(tmpDom.float_handle){
123 if(tmpTor.float_arg_n1){
124 src << "\tart_trace(1, artuint64tostr1("
125 #ifdef ART_FORCE_CAST_FOR_ARTUINT64TOSTR
126 << "(artuint64)"
127 #endif
128 << tmpTor.args[tmpTor.float_arg_n1].name << "));" << endl;
129
130 if(tmpTor.float_arg_n2){
131 src << "\tart_trace(1, artuint64tostr1("
132 #ifdef ART_FORCE_CAST_FOR_ARTUINT64TOSTR
133 << "(artuint64)"
134 #endif
135 << tmpTor.args[tmpTor.float_arg_n2].name
136 << "));" << endl;
137 }
138 }
139 }
140 else {/* просто не имеет значения */}
141 return (0);
142 }
143
Generator_C_USER_Body_Action(CTemplate & tpl,CDomain & tmpDom,CTor & tmpTor,ofstream & src)144 int Generator_C_USER_Body_Action(CTemplate &tpl, CDomain &tmpDom,
145 CTor &tmpTor, ofstream &src){
146 size_t arg_idx, tmpTor_args_size;
147 CArg tmpArg;
148
149 (void)tmpDom;
150
151 if(tmpTor.cpp_alias != ""){
152 // Игнорировать в С++
153 return(0);
154 }
155
156 // action
157 // Если у функции нет возвращаемого значения, то просто
158 // вызываем оригинальную функцию, в противном случае сохраняем
159 // это значение
160 #ifdef ART_DEBUG_INSERT_DEVEL_COMMENT
161 src << "\t/* ACTION */" << endl;
162 #endif
163
164 //#ifdef ART_DEBUG
165 //cout << "tmpTor.name = " << tmpTor.name << endl;
166 //cout << "tmpTor.args[0].type = " << tmpTor.args[0].type << endl;
167 //#endif
168
169 if(tmpTor.args[0].type != "void"){
170 src << "\t" << tpl.prefix << "stored_retcode = ";
171 }
172 if(tmpTor.is_handle_arg_out && tmpTor.handle_arg_out == 0 && tmpTor.args[0].type != "void"){
173 if(tmpTor.args[0].type != "void"){
174 // "\t" already printed, nothing to do
175 }
176 else {
177 // "\t" don't printed, so print
178 src << "\t";
179 }
180 src << tpl.prefix << "stored_handle = ";
181 }
182 else {
183 // случай tmpTor.handle_arg_out == 0 && tmpTor.args[0].type == "void"
184 // игнорируем, т.к. возвращаемого значения нет (оно void).
185 }
186
187 if(tmpTor.args[0].type == "void"){
188 // we should print it
189 src << "\t";
190 }
191
192 // action(args)
193 src << tmpTor.name << "(";
194 tmpTor_args_size = tmpTor.args.size();
195 for(arg_idx = 1; arg_idx < tmpTor_args_size - 1; arg_idx++){
196 tmpArg = tmpTor.args[arg_idx];
197 src << tmpArg.name << ", ";
198 }
199 tmpArg = tmpTor.args[arg_idx];
200 src << tmpArg.name << ");" << endl;
201
202 if(tmpTor.is_handle_arg_out && tmpTor.handle_arg_out > 0){
203 tmpArg = tmpTor.args[tmpTor.handle_arg_out];
204 src << "\t" << tpl.prefix << "stored_handle = " <<
205 tmpArg.name << ";" << endl;
206 }
207
208 return (0);
209 }
210
Generator_C_USER_Body_Epilog(CTemplate & tpl,CDomain & tmpDom,CTor & tmpTor,ofstream & src)211 int Generator_C_USER_Body_Epilog(CTemplate &tpl, CDomain &tmpDom,
212 CTor &tmpTor, ofstream &src){
213 // not used CArg tmpArg;
214
215 if(tmpTor.cpp_alias != ""){
216 // Игнорировать в С++
217 return(0);
218 }
219
220 // epilog
221 #ifdef ART_DEBUG_INSERT_DEVEL_COMMENT
222 src << "\t/* EPILOG */" << endl;
223 #endif
224
225 //#ifdef ART_DEBUG
226 //cout << "tmpTor.name = " << tmpTor.name << endl;
227 //cout << "tmpTor.badRetCode.type = " << tmpTor.badRetCode.type << endl;
228 //#endif
229
230 // retcode processing
231 if(tmpTor.badRetCode.type == "void"){
232 src << "\tart_trace(1, \"void\");" << endl;
233 }
234 else if(tmpTor.badRetCode.type == ""){
235 src << "\tart_trace(1, " << "\"-\");" << endl;
236 }
237 else {
238 src << "\tif(" << tpl.prefix << "stored_retcode "
239 << tmpTor.badRetCode.oper << " " << tmpTor.badRetCode.value
240 << "){" << endl
241 << "\t\tart_trace(1, " << "\"BAD\");" << endl
242 << "\t}" << endl
243 << "\telse\t{" << endl
244 << "\t\tart_trace(1, " << "\"OK\");" << endl
245 << "\t}" << endl;
246 }
247
248 // TODO: интегрировать ART_FORCE_CAST_FOR_ARTUINT64TOSTR в код навсегда
249
250 // HANDLE-OUT processing
251 // пологаем что HANDLE-OUT из того же домена
252 if(tmpTor.is_handle_arg_out && tmpTor.handle_arg_out == 0){
253 src << "\tif(" << tpl.prefix << "stored_handle "
254 << tmpDom.bad_handle.oper << " " << tmpDom.bad_handle.value
255 << "){" << endl
256 << "\t\tart_trace(2, " << "\"BAD\", artuint64tostr1("
257 #ifdef ART_FORCE_CAST_FOR_ARTUINT64TOSTR
258 << "(artuint64)"
259 #endif
260 << tpl.prefix << "stored_handle" << "));" << endl
261 << "\t}" << endl
262 << "\telse\t{" << endl
263 << "\t\tart_trace(2, " << "\"OK\", artuint64tostr1("
264 #ifdef ART_FORCE_CAST_FOR_ARTUINT64TOSTR
265 << "(artuint64)"
266 #endif
267 << tpl.prefix << "stored_handle" << "));" << endl
268 << "\t}" << endl;
269 }
270 else if(!tmpTor.is_handle_arg_out){
271 src << "\tart_trace(1, \"-\");" << endl;
272 }
273 else {
274 src << "\tif(" << tmpTor.args[tmpTor.handle_arg_out].name
275 << tmpDom.bad_handle.oper << tmpDom.bad_handle.value << "){"<<endl
276 << "\t\tart_trace(2, " << "\"BAD\", artuint64tostr1("
277 #ifdef ART_FORCE_CAST_FOR_ARTUINT64TOSTR
278 << "(artuint64)"
279 #endif
280 << tmpTor.args[tmpTor.handle_arg_out].name << "));" << endl
281 << "\t}" << endl
282 << "\telse\t{" << endl
283 << "\t\tart_trace(2, " << "\"OK\", artuint64tostr1("
284 #ifdef ART_FORCE_CAST_FOR_ARTUINT64TOSTR
285 << "(artuint64)"
286 #endif
287 << tmpTor.args[tmpTor.handle_arg_out].name << "));" << endl
288 << "\t}" << endl;
289 }
290
291 #ifdef ART_PUT_EXTRA_NL_IN_TRACEFILE
292 if(!tpl.remote_mode){
293 src << "\tfwrite(\"\\n\", 1, 1, art_tracefile);" << endl;
294 }
295 else {src << "\tsend(art_socket, \"\\n\", 1, 0);" << endl;}
296 #endif
297
298 if(tpl.multithreaded){
299 if(tpl.threading == "posix"){
300 src << "\tretval = pthread_mutex_unlock(&art_mutex);" << endl;
301 src << "\tif(retval){arterrlog(\"pthread_mutex_unlock()\", __FILE__, __LINE__); exit(-2);}" << endl;
302 }
303 else if(tpl.threading == "win32"){
304 src << "\tbReleaseMutex = ReleaseMutex(art_mutex);" << endl;
305 src << "\tif(!bReleaseMutex){arterrlog(\"ReleaseMutex()\", __FILE__, __LINE__); exit(-2);}" << endl;
306 }
307 }
308 if(tmpTor.args[0].type != "void"){
309 src << "\t" << "return (" << tpl.prefix << "stored_retcode);" << endl;
310 }
311 src << "}" << endl << endl;
312
313 return (0);
314 }
315