stage4/generate_cc/generate_cc.cc
changeset 66 501e9d494744
parent 65 c6d41c1287de
child 69 41cb5b80416e
--- a/stage4/generate_cc/generate_cc.cc	Fri Oct 05 17:58:44 2007 +0200
+++ b/stage4/generate_cc/generate_cc.cc	Wed Oct 17 17:51:24 2007 +0200
@@ -621,6 +621,7 @@
 //SYM_REF4(function_block_declaration_c, fblock_name, var_declarations, fblock_body, unused)
 void *visit(function_block_declaration_c *symbol) {
   generate_cc_vardecl_c *vardecl;
+  generate_cc_sfcdecl_c *sfcdecl;
   TRACE("function_block_declaration_c");
 
   /* start off by adding this declaration to the global
@@ -655,9 +656,13 @@
   				      generate_cc_vardecl_c::external_vt);
   vardecl->print(symbol->var_declarations);
   delete vardecl;
+  /* (A.4) Generate private internal variables for SFC */
+  sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::sfcdecl_sd);
+  sfcdecl->print(symbol->fblock_body);
+  delete sfcdecl;
   s4o.print("\n");
 
-  /* (A.4) Function Block data structure type name. */
+  /* (A.5) Function Block data structure type name. */
   s4o.indent_left();
   s4o.print("} ");
   symbol->fblock_name->accept(*this);
@@ -688,14 +693,29 @@
   				      generate_cc_vardecl_c::private_vt |
 				        generate_cc_vardecl_c::located_vt |
 				        generate_cc_vardecl_c::external_vt);
-  vardecl->print(symbol->var_declarations, NULL,  FB_FUNCTION_PARAM"->");
+  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_sd);
+  sfcdecl->print(symbol->fblock_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 FB body */
-  /* (C.1) Function declaration */
+  /* (C.1) Step definitions */
+  sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::stepdef_sd);
+  sfcdecl->print(symbol->fblock_body);
+  delete sfcdecl;
+  
+  /* (C.2) Action definitions */
+  sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::actiondef_sd);
+  sfcdecl->print(symbol->fblock_body);
+  delete sfcdecl;
+  
+  /* (C.3) Function declaration */
   s4o.print("// Code part\n");
   /* function interface */
   s4o.print("void ");
@@ -709,7 +729,7 @@
   s4o.print(") {\n");
   s4o.indent_right();
 
-  /* (C.2) 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,
@@ -719,7 +739,7 @@
   delete vardecl;
   s4o.print("\n");
 
-  /* (C.3) Function code */
+  /* (C.5) Function code */
   generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
   symbol->fblock_body->accept(generate_cc_code);
   s4o.indent_left();
@@ -728,6 +748,16 @@
   s4o.print(FB_FUNCTION_SUFFIX);
   s4o.print(s4o.indent_spaces + "() \n\n");
 
+  /* (C.6) Step undefinitions */
+  sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::stepundef_sd);
+  sfcdecl->print(symbol->fblock_body);
+  delete sfcdecl;
+  
+  /* (C.7) Action undefinitions */
+  sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::actionundef_sd);
+  sfcdecl->print(symbol->fblock_body);
+  delete sfcdecl;
+
   s4o.indent_left();
   s4o.print("\n\n\n\n");