diff -r 72ae82e65dbc -r eef5e62048c7 stage4/generate_c/generate_c.cc --- a/stage4/generate_c/generate_c.cc Thu Sep 25 10:26:10 2008 +0200 +++ b/stage4/generate_c/generate_c.cc Fri Sep 26 14:42:05 2008 +0200 @@ -570,28 +570,34 @@ generate_c_vardecl_c::finterface_vf, generate_c_vardecl_c::input_vt | generate_c_vardecl_c::output_vt | - generate_c_vardecl_c::inoutput_vt); + generate_c_vardecl_c::inoutput_vt | + generate_c_vardecl_c::eneno_vt); + vardecl->print(symbol->var_declarations_list); + if (!vardecl->is_en_declared()) { + s4o.print(",\n" + s4o.indent_spaces + "BOOL EN"); + } + if (!vardecl->is_eno_declared()) { + s4o.print(",\n" + s4o.indent_spaces + "BOOL *ENO"); + } + delete vardecl; + + s4o.indent_left(); + + s4o.print(")\n" + s4o.indent_spaces + "{\n"); + + /* (B) Function local variable declaration */ + /* (B.1) Variables declared in ST source code */ + s4o.indent_right(); + + vardecl = new generate_c_vardecl_c(&s4o, + generate_c_vardecl_c::localinit_vf, + generate_c_vardecl_c::output_vt | + generate_c_vardecl_c::inoutput_vt | + generate_c_vardecl_c::private_vt); vardecl->print(symbol->var_declarations_list); delete vardecl; - s4o.indent_left(); - - s4o.print(")\n" + s4o.indent_spaces + "{\n"); - - /* (B) Function local variable declaration */ - /* (B.1) Variables declared in ST source code */ - s4o.indent_right(); - vardecl = new generate_c_vardecl_c(&s4o, - generate_c_vardecl_c::foutputdecl_vf, - generate_c_vardecl_c::output_vt | - generate_c_vardecl_c::inoutput_vt); - vardecl->print(symbol->var_declarations_list); - delete vardecl; - - vardecl = new generate_c_vardecl_c(&s4o, generate_c_vardecl_c::localinit_vf, generate_c_vardecl_c::private_vt); - vardecl->print(symbol->var_declarations_list); - delete vardecl; - - /* (B.2) Temporary variable for function's return value */ + + /* (B.2) Temporary variable for function's return value */ /* It will have the same name as the function itself! */ s4o.print(s4o.indent_spaces); symbol->type_name->accept(*this); /* return type */ @@ -605,7 +611,30 @@ default_value->accept(*this); } s4o.print(";\n\n"); - + + s4o.print(s4o.indent_spaces + "// Control execution\n"); + s4o.print(s4o.indent_spaces + "if (!EN) {\n"); + s4o.indent_right(); + s4o.print(s4o.indent_spaces + "if (ENO != NULL) {\n"); + s4o.indent_right(); + s4o.print(s4o.indent_spaces + "*ENO = __BOOL_LITERAL(FALSE);\n"); + s4o.indent_left(); + s4o.print(s4o.indent_spaces + "}\n"); + s4o.print(s4o.indent_spaces + "return "); + symbol->derived_function_name->accept(*this); + s4o.print(";\n"); + s4o.indent_left(); + s4o.print(s4o.indent_spaces + "}\n"); + s4o.print(s4o.indent_spaces + "else {\n"); + s4o.indent_right(); + s4o.print(s4o.indent_spaces + "if (ENO != NULL) {\n"); + s4o.indent_right(); + s4o.print(s4o.indent_spaces + "*ENO = __BOOL_LITERAL(TRUE);\n"); + s4o.indent_left(); + s4o.print(s4o.indent_spaces + "}\n"); + s4o.indent_left(); + s4o.print(s4o.indent_spaces + "}\n"); + /* (C) Function body */ generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol); symbol->function_body->accept(generate_c_code); @@ -663,8 +692,15 @@ generate_c_vardecl_c::local_vf, generate_c_vardecl_c::input_vt | generate_c_vardecl_c::output_vt | - generate_c_vardecl_c::inoutput_vt); + generate_c_vardecl_c::inoutput_vt | + generate_c_vardecl_c::eneno_vt); vardecl->print(symbol->var_declarations); + if (!vardecl->is_en_declared()) { + s4o_incl.print(s4o_incl.indent_spaces + "BOOL EN;\n"); + } + if (!vardecl->is_eno_declared()) { + s4o_incl.print(s4o_incl.indent_spaces + "BOOL ENO;\n"); + } delete vardecl; s4o_incl.print("\n"); /* (A.3) Private internal variables */ @@ -677,6 +713,7 @@ generate_c_vardecl_c::external_vt); vardecl->print(symbol->var_declarations); delete vardecl; + /* (A.4) Generate private internal variables for SFC */ sfcdecl = new generate_c_sfcdecl_c(&s4o_incl, generate_c_sfcdecl_c::sfcdecl_sd); sfcdecl->print(symbol->fblock_body); @@ -713,8 +750,19 @@ generate_c_vardecl_c::inoutput_vt | generate_c_vardecl_c::private_vt | generate_c_vardecl_c::located_vt | - generate_c_vardecl_c::external_vt); + generate_c_vardecl_c::external_vt | + generate_c_vardecl_c::eneno_vt); vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); + if (!vardecl->is_en_declared()) { + s4o.print("\n" + s4o.indent_spaces); + s4o.print(FB_FUNCTION_PARAM); + s4o.print("->EN = __BOOL_LITERAL(TRUE);"); + } + if (!vardecl->is_eno_declared()) { + s4o.print("\n" + s4o.indent_spaces); + s4o.print(FB_FUNCTION_PARAM); + s4o.print("->ENO = __BOOL_LITERAL(TRUE);"); + } delete vardecl; s4o.print("\n"); /* (B.3) Generate private internal variables for SFC */ @@ -750,6 +798,25 @@ s4o.print(") {\n"); s4o.indent_right(); + s4o.print(s4o.indent_spaces + "// Control execution\n"); + s4o.print(s4o.indent_spaces + "if (!"); + s4o.print(FB_FUNCTION_PARAM); + s4o.print("->EN) {\n"); + s4o.indent_right(); + s4o.print(s4o.indent_spaces); + s4o.print(FB_FUNCTION_PARAM); + s4o.print("->ENO = __BOOL_LITERAL(FALSE);\n"); + s4o.print(s4o.indent_spaces + "return;\n"); + s4o.indent_left(); + s4o.print(s4o.indent_spaces + "}\n"); + s4o.print(s4o.indent_spaces + "else {\n"); + s4o.indent_right(); + s4o.print(s4o.indent_spaces); + s4o.print(FB_FUNCTION_PARAM); + s4o.print("->ENO = __BOOL_LITERAL(TRUE);\n"); + s4o.indent_left(); + s4o.print(s4o.indent_spaces + "}\n"); + /* (C.4) Initialize TEMP variables */ /* function body */ s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n");