--- a/generate_IEC_std.py Mon Jan 19 17:07:03 2009 +0100
+++ b/generate_IEC_std.py Mon Jan 19 17:08:17 2009 +0100
@@ -108,14 +108,14 @@
This tests are defined in search_expression_type.cc
"""
return {"ANY" : "",
- "ANY_BIT" : "if(search_expression_type->is_binary_type(%(paramname)s_type_symbol))",
- "ANY_NBIT" : "if(search_expression_type->is_nbinary_type(%(paramname)s_type_symbol))",
- "ANY_NUM" : "if(search_expression_type->is_num_type(%(paramname)s_type_symbol))",
- "ANY_REAL" : "if(search_expression_type->is_real_type(%(paramname)s_type_symbol))",
- "ANY_INT" : "if(search_expression_type->is_integer_type(%(paramname)s_type_symbol))"
+ "ANY_BIT" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_binary_type(%(paramname)s_type_symbol))",
+ "ANY_NBIT" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_nbinary_type(%(paramname)s_type_symbol))",
+ "ANY_NUM" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_num_type(%(paramname)s_type_symbol))",
+ "ANY_REAL" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_real_type(%(paramname)s_type_symbol))",
+ "ANY_INT" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_integer_type(%(paramname)s_type_symbol))"
}.get(typename,
#"if (typeid(*last_type_symbol) == typeid(%(typename)s_type_name_c))")%{
- "if(search_expression_type->is_same_type(&search_constant_type_c::%(typename)s_type_name, last_type_symbol))")%{
+ "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_same_type(&search_constant_type_c::%(typename)s_type_name, last_type_symbol))")%{
"paramname" : paramname, "typename": typename.lower()}
def recurse_and_indent(fdecls, indent, do_type_search_only = False, do_il = False):
@@ -151,12 +151,15 @@
identifier_c param_name("%(input_name)s");
/* Get the value from a foo(<param_name> = <param_value>) style call */
symbol_c *%(input_name)s_param_value = function_call_param_iterator.search(¶m_name);
+ symbol_c *%(input_name)s_type_symbol = NULL;
/* Get the value from a foo(<param_value>) style call */
if (%(input_name)s_param_value == NULL)
%(input_name)s_param_value = function_call_param_iterator.next();
- symbol_c *%(input_name)s_type_symbol = search_expression_type->get_type(%(input_name)s_param_value);
- 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 ;
+ if (%(input_name)s_param_value != NULL) {
+ %(input_name)s_type_symbol = search_expression_type->get_type(%(input_name)s_param_value);
+ 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 ;
+ }
"""%{"input_name":Paramname}
for ParamType,NextParamDecl in ParamTypes.iteritems():
@@ -188,13 +191,18 @@
res += "function_name = (symbol_c*)(new pragma_c(\"%s\"));\n"%code_gen[1]
if fdecl["extensible"]:
res += """
+if (nb_param < %(min_nb_param)d)
+ nb_param = %(min_nb_param)d;
char* nb_param_str = new char[10];
-sprintf(nb_param_str, "%d", nb_param);
+sprintf(nb_param_str, "%%d", nb_param);
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)
-"""
+"""%{"min_nb_param" : len(fdecl["inputs"])}
for paramname,paramtype,unused in fdecl["inputs"]:
- res += "ADD_PARAM_LIST(%(input_name)s_param_value, %(input_name)s_type_symbol, function_param_iterator_c::direction_in)\n"%{"input_name" : paramname}
-
+ res += """
+if (%(input_name)s_type_symbol == NULL)
+ %(input_name)s_type_symbol = last_type_symbol;
+ADD_PARAM_LIST(%(input_name)s_param_value, %(input_name)s_type_symbol, function_param_iterator_c::direction_in)
+"""%{"input_name" : paramname}
if fdecl["extensible"]:
res += """
int base_num = %d;