106 """ |
106 """ |
107 Convert ANY_XXX IEC type declaration into IEC2C's generated type test. |
107 Convert ANY_XXX IEC type declaration into IEC2C's generated type test. |
108 This tests are defined in search_expression_type.cc |
108 This tests are defined in search_expression_type.cc |
109 """ |
109 """ |
110 return {"ANY" : "", |
110 return {"ANY" : "", |
111 "ANY_BIT" : "if(search_expression_type->is_binary_type(%(paramname)s_type_symbol))", |
111 "ANY_BIT" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_binary_type(%(paramname)s_type_symbol))", |
112 "ANY_NBIT" : "if(search_expression_type->is_nbinary_type(%(paramname)s_type_symbol))", |
112 "ANY_NBIT" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_nbinary_type(%(paramname)s_type_symbol))", |
113 "ANY_NUM" : "if(search_expression_type->is_num_type(%(paramname)s_type_symbol))", |
113 "ANY_NUM" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_num_type(%(paramname)s_type_symbol))", |
114 "ANY_REAL" : "if(search_expression_type->is_real_type(%(paramname)s_type_symbol))", |
114 "ANY_REAL" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_real_type(%(paramname)s_type_symbol))", |
115 "ANY_INT" : "if(search_expression_type->is_integer_type(%(paramname)s_type_symbol))" |
115 "ANY_INT" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_integer_type(%(paramname)s_type_symbol))" |
116 }.get(typename, |
116 }.get(typename, |
117 #"if (typeid(*last_type_symbol) == typeid(%(typename)s_type_name_c))")%{ |
117 #"if (typeid(*last_type_symbol) == typeid(%(typename)s_type_name_c))")%{ |
118 "if(search_expression_type->is_same_type(&search_constant_type_c::%(typename)s_type_name, last_type_symbol))")%{ |
118 "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_same_type(&search_constant_type_c::%(typename)s_type_name, last_type_symbol))")%{ |
119 "paramname" : paramname, "typename": typename.lower()} |
119 "paramname" : paramname, "typename": typename.lower()} |
120 |
120 |
121 def recurse_and_indent(fdecls, indent, do_type_search_only = False, do_il = False): |
121 def recurse_and_indent(fdecls, indent, do_type_search_only = False, do_il = False): |
122 """ |
122 """ |
123 This function generate visit(function_invocation) code for |
123 This function generate visit(function_invocation) code for |
149 res += """ |
149 res += """ |
150 { |
150 { |
151 identifier_c param_name("%(input_name)s"); |
151 identifier_c param_name("%(input_name)s"); |
152 /* Get the value from a foo(<param_name> = <param_value>) style call */ |
152 /* Get the value from a foo(<param_name> = <param_value>) style call */ |
153 symbol_c *%(input_name)s_param_value = function_call_param_iterator.search(¶m_name); |
153 symbol_c *%(input_name)s_param_value = function_call_param_iterator.search(¶m_name); |
|
154 symbol_c *%(input_name)s_type_symbol = NULL; |
154 |
155 |
155 /* Get the value from a foo(<param_value>) style call */ |
156 /* Get the value from a foo(<param_value>) style call */ |
156 if (%(input_name)s_param_value == NULL) |
157 if (%(input_name)s_param_value == NULL) |
157 %(input_name)s_param_value = function_call_param_iterator.next(); |
158 %(input_name)s_param_value = function_call_param_iterator.next(); |
158 symbol_c *%(input_name)s_type_symbol = search_expression_type->get_type(%(input_name)s_param_value); |
159 if (%(input_name)s_param_value != NULL) { |
159 last_type_symbol = last_type_symbol && search_expression_type->is_same_type(%(input_name)s_type_symbol, last_type_symbol) ? search_expression_type->common_type(%(input_name)s_type_symbol, last_type_symbol) : %(input_name)s_type_symbol ; |
160 %(input_name)s_type_symbol = search_expression_type->get_type(%(input_name)s_param_value); |
|
161 last_type_symbol = last_type_symbol && %(input_name)s_type_symbol && search_expression_type->is_same_type(%(input_name)s_type_symbol, last_type_symbol) ? search_expression_type->common_type(%(input_name)s_type_symbol, last_type_symbol) : %(input_name)s_type_symbol ; |
|
162 } |
160 """%{"input_name":Paramname} |
163 """%{"input_name":Paramname} |
161 |
164 |
162 for ParamType,NextParamDecl in ParamTypes.iteritems(): |
165 for ParamType,NextParamDecl in ParamTypes.iteritems(): |
163 |
166 |
164 res += """ |
167 res += """ |
186 |
189 |
187 if code_gen[1] is not None: |
190 if code_gen[1] is not None: |
188 res += "function_name = (symbol_c*)(new pragma_c(\"%s\"));\n"%code_gen[1] |
191 res += "function_name = (symbol_c*)(new pragma_c(\"%s\"));\n"%code_gen[1] |
189 if fdecl["extensible"]: |
192 if fdecl["extensible"]: |
190 res += """ |
193 res += """ |
|
194 if (nb_param < %(min_nb_param)d) |
|
195 nb_param = %(min_nb_param)d; |
191 char* nb_param_str = new char[10]; |
196 char* nb_param_str = new char[10]; |
192 sprintf(nb_param_str, "%d", nb_param); |
197 sprintf(nb_param_str, "%%d", nb_param); |
193 ADD_PARAM_LIST((symbol_c*)(new integer_c((const char *)nb_param_str)), (symbol_c*)(new int_type_name_c()), function_param_iterator_c::direction_in) |
198 ADD_PARAM_LIST((symbol_c*)(new integer_c((const char *)nb_param_str)), (symbol_c*)(new int_type_name_c()), function_param_iterator_c::direction_in) |
194 """ |
199 """%{"min_nb_param" : len(fdecl["inputs"])} |
195 for paramname,paramtype,unused in fdecl["inputs"]: |
200 for paramname,paramtype,unused in fdecl["inputs"]: |
196 res += "ADD_PARAM_LIST(%(input_name)s_param_value, %(input_name)s_type_symbol, function_param_iterator_c::direction_in)\n"%{"input_name" : paramname} |
201 res += """ |
197 |
202 if (%(input_name)s_type_symbol == NULL) |
|
203 %(input_name)s_type_symbol = last_type_symbol; |
|
204 ADD_PARAM_LIST(%(input_name)s_param_value, %(input_name)s_type_symbol, function_param_iterator_c::direction_in) |
|
205 """%{"input_name" : paramname} |
198 if fdecl["extensible"]: |
206 if fdecl["extensible"]: |
199 res += """ |
207 res += """ |
200 int base_num = %d; |
208 int base_num = %d; |
201 symbol_c *param_value = NULL; |
209 symbol_c *param_value = NULL; |
202 do{ |
210 do{ |