diff -r 3d24cc85bb3c -r c96d1a4c23f8 stage4/generate_cc/generate_cc.cc --- a/stage4/generate_cc/generate_cc.cc Wed Aug 01 13:50:14 2007 +0200 +++ b/stage4/generate_cc/generate_cc.cc Thu Aug 02 16:56:56 2007 +0200 @@ -189,8 +189,8 @@ #include "search_expression_type.cc" #include "generate_cc_base.cc" +#include "generate_cc_typedecl.cc" #include "generate_cc_sfcdecl.cc" -#include "generate_cc_typedecl.cc" #include "generate_cc_vardecl.cc" #include "generate_cc_configbody.cc" #include "generate_location_list.cc" @@ -751,6 +751,7 @@ //SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused) void *visit(program_declaration_c *symbol) { generate_cc_vardecl_c *vardecl; + generate_cc_sfcdecl_c *sfcdecl; TRACE("program_declaration_c"); /* start off by adding this declaration to the global @@ -787,10 +788,10 @@ vardecl->print(symbol->var_declarations); delete vardecl; /* (A.4) Generate private internal variables for SFC */ - generate_cc_sfctables_c generate_cc_sfctables(&s4o); - symbol->function_block_body->accept(generate_cc_sfctables); - s4o.print("\n"); - + sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::sfcdecl_sg); + sfcdecl->print(symbol->function_block_body); + delete sfcdecl; + /* (A.5) Program data structure type name. */ s4o.indent_left(); s4o.print("} "); @@ -823,15 +824,27 @@ generate_cc_vardecl_c::external_vt); vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); delete vardecl; + s4o.print("\n"); + /* (B.3) Generate private internal variables for SFC */ + sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::sfcinit_sg); + sfcdecl->print(symbol->function_block_body,FB_FUNCTION_PARAM"->"); + delete sfcdecl; + s4o.indent_left(); - s4o.print("\n" + s4o.indent_spaces + "}\n\n"); + s4o.print(s4o.indent_spaces + "}\n\n"); /* (C) Function with PROGRAM body */ - /* (C.1) Step and Action definitions */ - generate_cc_sfcdecl_c generate_cc_sfcdecl(&s4o); - symbol->function_block_body->accept(generate_cc_sfcdecl); - - /* (C.2) Function declaration */ + /* (C.1) Step definitions */ + sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::stepdef_sg); + sfcdecl->print(symbol->function_block_body); + delete sfcdecl; + + /* (C.2) Action definitions */ + sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::actiondef_sg); + sfcdecl->print(symbol->function_block_body); + delete sfcdecl; + + /* (C.3) Function declaration */ s4o.print("// Code part\n"); /* function interface */ s4o.print("void "); @@ -845,7 +858,7 @@ s4o.print(") {\n"); s4o.indent_right(); - /* (C.3) Initialize TEMP variables */ + /* (C.4) Initialize TEMP variables */ /* function body */ s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n"); vardecl = new generate_cc_vardecl_c(&s4o, @@ -855,7 +868,7 @@ delete vardecl; s4o.print("\n"); - /* (C.4) Function code */ + /* (C.5) Function code */ generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->"); symbol->function_block_body->accept(generate_cc_code); s4o.indent_left(); @@ -864,10 +877,16 @@ s4o.print(FB_FUNCTION_SUFFIX); s4o.print(s4o.indent_spaces + "() \n\n"); - /* (C.5) Step and Action undefinitions */ - generate_cc_sfcundecl_c generate_cc_sfcundecl(&s4o); - symbol->function_block_body->accept(generate_cc_sfcundecl); - + /* (C.6) Step undefinitions */ + sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::stepundef_sg); + sfcdecl->print(symbol->function_block_body); + delete sfcdecl; + + /* (C.7) Action undefinitions */ + sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::actionundef_sg); + sfcdecl->print(symbol->function_block_body); + delete sfcdecl; + s4o.indent_left(); s4o.print("\n\n\n\n");