generate_IEC_std.py
changeset 307 fd1f6ae26d4f
parent 291 e580c945c62a
child 404 d5a5eaea7844
--- 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(&param_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;