diff -r 74640e3c7f53 -r 9e8ce092e169 stage4/generate_c/generate_c.cc --- a/stage4/generate_c/generate_c.cc Wed Apr 16 09:49:28 2008 +0200 +++ b/stage4/generate_c/generate_c.cc Mon May 19 14:07:31 2008 +0200 @@ -454,8 +454,8 @@ class generate_c_pous_c: public generate_c_typedecl_c { public: - generate_c_pous_c(stage4out_c *s4o_ptr) - : generate_c_typedecl_c(s4o_ptr) {}; + generate_c_pous_c(stage4out_c *s4o_ptr, stage4out_c *s4o_incl_ptr) + : generate_c_typedecl_c(s4o_ptr, s4o_incl_ptr) {}; virtual ~generate_c_pous_c(void) {} @@ -625,6 +625,7 @@ void *visit(function_block_declaration_c *symbol) { generate_c_vardecl_c *vardecl; generate_c_sfcdecl_c *sfcdecl; + generate_c_typedecl_c *typedecl; TRACE("function_block_declaration_c"); /* start off by adding this declaration to the global @@ -633,25 +634,26 @@ function_block_type_symtable.insert(symbol->fblock_name, symbol); /* (A) Function Block data structure declaration... */ + typedecl = new generate_c_typedecl_c(&s4o_incl); /* (A.1) Data structure declaration */ - s4o.print("// FUNCTION_BLOCK "); - symbol->fblock_name->accept(*this); - s4o.print("\n// Data part\n"); - s4o.print("typedef struct {\n"); - s4o.indent_right(); + s4o_incl.print("// FUNCTION_BLOCK "); + symbol->fblock_name->accept(*typedecl); + s4o_incl.print("\n// Data part\n"); + s4o_incl.print("typedef struct {\n"); + s4o_incl.indent_right(); /* (A.2) Public variables: i.e. the function parameters... */ - s4o.print(s4o.indent_spaces + "// FB Interface - IN, OUT, IN_OUT variables\n"); - vardecl = new generate_c_vardecl_c(&s4o, + s4o_incl.print(s4o_incl.indent_spaces + "// FB Interface - IN, OUT, IN_OUT variables\n"); + vardecl = new generate_c_vardecl_c(&s4o_incl, generate_c_vardecl_c::local_vf, generate_c_vardecl_c::input_vt | generate_c_vardecl_c::output_vt | generate_c_vardecl_c::inoutput_vt); vardecl->print(symbol->var_declarations); delete vardecl; - s4o.print("\n"); + s4o_incl.print("\n"); /* (A.3) Private internal variables */ - s4o.print(s4o.indent_spaces + "// FB private variables - TEMP, private and located variables\n"); - vardecl = new generate_c_vardecl_c(&s4o, + s4o_incl.print(s4o_incl.indent_spaces + "// FB private variables - TEMP, private and located variables\n"); + vardecl = new generate_c_vardecl_c(&s4o_incl, generate_c_vardecl_c::local_vf, generate_c_vardecl_c::temp_vt | generate_c_vardecl_c::private_vt | @@ -660,17 +662,17 @@ vardecl->print(symbol->var_declarations); delete vardecl; /* (A.4) Generate private internal variables for SFC */ - sfcdecl = new generate_c_sfcdecl_c(&s4o, generate_c_sfcdecl_c::sfcdecl_sd); + sfcdecl = new generate_c_sfcdecl_c(&s4o_incl, generate_c_sfcdecl_c::sfcdecl_sd); sfcdecl->print(symbol->fblock_body); delete sfcdecl; - s4o.print("\n"); - + s4o_incl.print("\n"); + /* (A.5) Function Block data structure type name. */ - s4o.indent_left(); - s4o.print("} "); - symbol->fblock_name->accept(*this); - s4o.print(";\n\n"); - + s4o_incl.indent_left(); + s4o_incl.print("} "); + symbol->fblock_name->accept(*typedecl); + s4o_incl.print(";\n\n"); + delete typedecl; /* (B) Constructor */ /* (B.1) Constructor name... */ @@ -785,6 +787,7 @@ void *visit(program_declaration_c *symbol) { generate_c_vardecl_c *vardecl; generate_c_sfcdecl_c *sfcdecl; + generate_c_typedecl_c *typedecl; TRACE("program_declaration_c"); /* start off by adding this declaration to the global @@ -793,26 +796,27 @@ program_type_symtable.insert(symbol->program_type_name, symbol); /* (A) Program data structure declaration... */ + typedecl = new generate_c_typedecl_c(&s4o_incl); /* (A.1) Data structure declaration */ - s4o.print("// PROGRAM "); - symbol->program_type_name->accept(*this); - s4o.print("\n// Data part\n"); - s4o.print("typedef struct {\n"); - s4o.indent_right(); + s4o_incl.print("// PROGRAM "); + symbol->program_type_name->accept(*typedecl); + s4o_incl.print("\n// Data part\n"); + s4o_incl.print("typedef struct {\n"); + s4o_incl.indent_right(); /* (A.2) Public variables: i.e. the program parameters... */ - s4o.print(s4o.indent_spaces + "// PROGRAM Interface - IN, OUT, IN_OUT variables\n"); - vardecl = new generate_c_vardecl_c(&s4o, + s4o_incl.print(s4o_incl.indent_spaces + "// PROGRAM Interface - IN, OUT, IN_OUT variables\n"); + vardecl = new generate_c_vardecl_c(&s4o_incl, generate_c_vardecl_c::local_vf, generate_c_vardecl_c::input_vt | generate_c_vardecl_c::output_vt | generate_c_vardecl_c::inoutput_vt); vardecl->print(symbol->var_declarations); delete vardecl; - s4o.print("\n"); + s4o_incl.print("\n"); /* (A.3) Private internal variables */ - s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n"); - vardecl = new generate_c_vardecl_c(&s4o, + s4o_incl.print(s4o_incl.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n"); + vardecl = new generate_c_vardecl_c(&s4o_incl, generate_c_vardecl_c::local_vf, generate_c_vardecl_c::temp_vt | generate_c_vardecl_c::private_vt | @@ -821,15 +825,16 @@ vardecl->print(symbol->var_declarations); delete vardecl; /* (A.4) Generate private internal variables for SFC */ - sfcdecl = new generate_c_sfcdecl_c(&s4o, generate_c_sfcdecl_c::sfcdecl_sd); + sfcdecl = new generate_c_sfcdecl_c(&s4o_incl, generate_c_sfcdecl_c::sfcdecl_sd); sfcdecl->print(symbol->function_block_body); delete sfcdecl; /* (A.5) Program data structure type name. */ - s4o.indent_left(); - s4o.print("} "); - symbol->program_type_name->accept(*this); - s4o.print(";\n\n"); + s4o_incl.indent_left(); + s4o_incl.print("} "); + symbol->program_type_name->accept(*typedecl); + s4o_incl.print(";\n\n"); + delete typedecl; /* (B) Constructor */ /* (B.1) Constructor name... */ @@ -1211,6 +1216,7 @@ } /* (A.3) POUs inclusion */ + s4o.print("#include \"POUS.h\"\n\n"); s4o.print("#include \"POUS.c\"\n\n"); /* (A.4) Resource programs declaration... */ @@ -1436,10 +1442,10 @@ protected: stage4out_c &s4o; stage4out_c pous_s4o; + stage4out_c pous_incl_s4o; stage4out_c located_variables_s4o; stage4out_c variables_s4o; generate_c_pous_c generate_c_pous; - generate_var_list_c *generate_var_list; symbol_c *current_configuration; @@ -1452,9 +1458,10 @@ generate_c_c(stage4out_c *s4o_ptr, const char *builddir): s4o(*s4o_ptr), pous_s4o(builddir, "POUS", "c"), + pous_incl_s4o(builddir, "POUS", "h"), located_variables_s4o(builddir, "LOCATED_VARIABLES","h"), variables_s4o(builddir, "VARIABLES","csv"), - generate_c_pous(&pous_s4o) { + generate_c_pous(&pous_s4o, &pous_incl_s4o) { current_builddir = builddir; current_configuration = NULL; } @@ -1465,13 +1472,15 @@ /* B 0 - Programming Model */ /***************************/ void *visit(library_c *symbol) { - generate_var_list = new generate_var_list_c(&variables_s4o, symbol); - + pous_incl_s4o.print("#ifndef __POUS_H\n#define __POUS_H\n\n"); for(int i = 0; i < symbol->n; i++) { symbol->elements[i]->accept(*this); } - - delete generate_var_list; + pous_incl_s4o.print("#endif //__POUS_H\n"); + + generate_var_list_c generate_var_list(&variables_s4o, symbol); + generate_var_list.generate_programs(symbol); + generate_var_list.generate_variables(symbol); generate_location_list_c generate_location_list(&located_variables_s4o); symbol->accept(generate_location_list); @@ -1556,8 +1565,6 @@ current_configuration = NULL; - symbol->accept(*generate_var_list); - return NULL; }