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