stage4/generate_cc/generate_cc.cc
changeset 16 e8b99f896416
parent 14 d926ee71f228
child 17 38754701ac41
--- a/stage4/generate_cc/generate_cc.cc	Wed Feb 14 19:57:01 2007 +0100
+++ b/stage4/generate_cc/generate_cc.cc	Tue Feb 20 18:17:21 2007 +0100
@@ -38,6 +38,7 @@
 // #include <stdio.h>  /* required for NULL */
 #include <string>
 #include <iostream>
+#include <typeinfo>
 
 #include "../../util/symtable.hh"
 #include "../../util/dsymtable.hh"
@@ -176,6 +177,7 @@
 #include "decompose_var_instance_name.cc"
 #include "search_varfb_instance_type.cc"
 #include "search_constant_type.cc"
+#include "search_expression_type.cc"
 
 #include "generate_cc_base.cc"
 #include "generate_cc_typedecl.cc"
@@ -523,7 +525,7 @@
   symbol->fblock_name->accept(*this);
   s4o.print(FB_FUNCTION_SUFFIX);
   s4o.print("(");
-    /* first and only parameter is a pointer to the data */
+  /* first and only parameter is a pointer to the data */
   symbol->fblock_name->accept(*this);
   s4o.print(" *");
   s4o.print(FB_FUNCTION_PARAM);
@@ -549,23 +551,46 @@
   s4o.print(FB_FUNCTION_SUFFIX);
   s4o.print(s4o.indent_spaces + "() \n\n");
 
-
-
-
-
-
-
-#if 0
-
-+++++++++++++++++++++++++++++++++++++
-  s4o.print(s4o.indent_spaces + "class ");
-  symbol->fblock_name->accept(*this);
-  s4o.print(" {\n");
-  s4o.indent_right();
-
-  /* (A.2) Public variables: i.e. the function parameters... */
-  s4o.print(s4o.indent_spaces + "public:\n");
-  s4o.indent_right();
+  s4o.indent_left();
+  s4o.print("\n\n\n\n");
+
+  return NULL;
+}
+
+
+/* The remaining temp_var_decls_c, temp_var_decls_list_c
+ * and non_retentive_var_decls_c are handled in the generate_cc_vardecl_c class
+ */
+
+
+/**********************/
+/* B 1.5.3 - Programs */
+/**********************/
+
+
+
+public:
+/*  PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */
+//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;
+  TRACE("program_declaration_c");
+
+  /* start off by adding this declaration to the global
+   * program declaration symbol table...
+   */
+  program_type_symtable.insert(symbol->program_type_name, symbol);
+
+  /* (A) Program data structure declaration... */
+  /* (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();
+
+  /* (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_cc_vardecl_c(&s4o,
   				      generate_cc_vardecl_c::local_vf,
   				      generate_cc_vardecl_c::input_vt |
@@ -573,226 +598,60 @@
   				      generate_cc_vardecl_c::inoutput_vt);
   vardecl->print(symbol->var_declarations);
   delete vardecl;
-  s4o.indent_left();
   s4o.print("\n");
-
   /* (A.3) Private internal variables */
-  s4o.print(s4o.indent_spaces + "private:\n");
-  s4o.indent_right();
+  s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n");
   vardecl = new generate_cc_vardecl_c(&s4o,
   				      generate_cc_vardecl_c::local_vf,
-  				      generate_cc_vardecl_c::private_vt |
-  				      generate_cc_vardecl_c::located_vt);
-  vardecl->print(symbol->var_declarations);
-  delete vardecl;
-  s4o.indent_left();
-  s4o.print("\n");
-
----------------------------------
-  /* (B) Constructor */
-  s4o.print(s4o.indent_spaces + "public:\n");
-  s4o.indent_right();
-  s4o.print(s4o.indent_spaces);
-  symbol->fblock_name->accept(*this);
-  s4o.print("(void)\n");
-  s4o.indent_right();
-  s4o.print(s4o.indent_spaces);
-  vardecl = new generate_cc_vardecl_c(&s4o,
-  				      generate_cc_vardecl_c::constructorinit_vf,
-  				      generate_cc_vardecl_c::input_vt |
-  				      generate_cc_vardecl_c::output_vt |
-  				      generate_cc_vardecl_c::inoutput_vt |
-  				      generate_cc_vardecl_c::private_vt);
-  vardecl->print(symbol->var_declarations);
-  delete vardecl;
-  s4o.print("\n" + s4o.indent_spaces + "{}\n\n");
-  s4o.indent_left();
-  s4o.indent_left();
----------------------------------
-
-
-  /* (C) Public Function*/
-  /* (C.1) Public Function declaration */
-  s4o.print(s4o.indent_spaces + "public:\n");
-  s4o.indent_right();
-  s4o.print(s4o.indent_spaces + "void f(void) {\n");
-
-  /* (C.2) Temporary variables */
-  s4o.indent_right();
-  vardecl = new generate_cc_vardecl_c(&s4o, generate_cc_vardecl_c::localinit_vf, generate_cc_vardecl_c::temp_vt);
-  vardecl->print(symbol->var_declarations);
-  delete vardecl;
-  s4o.indent_left();
-  s4o.print("\n");
-
-  /* (C.3) Public Function body */
-  s4o.indent_right();
-  this->current_scope = symbol;
-  symbol->fblock_body->accept(*this);
-  this->current_scope = NULL;
-  s4o.indent_left();
-  s4o.print(s4o.indent_spaces + "} /* f() */\n\n");
-  s4o.indent_left();
-
-  /* (D) Close the class declaration... */
-  s4o.indent_left();
-  s4o.print(s4o.indent_spaces + "}; /* class ");
-  symbol->fblock_name->accept(*this);
-  s4o.print(" */\n");
-
----------------------------------
-  /* (E) Initialise the static member variables... */
-  vardecl = new generate_cc_vardecl_c(&s4o,
-  				      generate_cc_vardecl_c::globalinit_vf,
-  				      generate_cc_vardecl_c::located_vt);
-  vardecl->print(symbol->var_declarations, symbol->fblock_name);
-  delete vardecl;
-
-#endif
-
-  s4o.indent_left();
-  s4o.print("\n\n\n\n");
-
-  return NULL;
-}
-
-
-/* The remaining temp_var_decls_c, temp_var_decls_list_c
- * and non_retentive_var_decls_c are handled in the generate_cc_vardecl_c class
- */
-
-
-/**********************/
-/* B 1.5.3 - Programs */
-/**********************/
-
-
-
-public:
-/*  PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */
-//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;
-  TRACE("program_declaration_c");
-
-  /* start off by adding this declaration to the global
-   * program declaration symbol table...
-   */
-  program_type_symtable.insert(symbol->program_type_name, symbol);
-
-  /* (A) Class (Function Block) declaration... */
-  /* (A.1) Class (Function Block) name */
-  s4o.print("// PROGRAM\n");
-  s4o.print(s4o.indent_spaces);
-  symbol->program_type_name->accept(*this);
-  s4o.print("\n //Data part\n");
-  s4o.print("typedef struct {\n");
-  s4o.indent_right();
-
-  /* (A.2) Public variables: i.e. the program parameters... */
-  s4o.print(s4o.indent_spaces + "//PROGRAM interface IN OUT IN_OUT variables\n");
-  s4o.indent_right();
-  vardecl = new generate_cc_vardecl_c(&s4o,
-  				      generate_cc_vardecl_c::local_vf,
-  				      generate_cc_vardecl_c::input_vt |
-  				      generate_cc_vardecl_c::output_vt |
-  				      generate_cc_vardecl_c::inoutput_vt);
-  vardecl->print(symbol->var_declarations);
-  delete vardecl;
-  s4o.indent_left();
-  s4o.print("\n");
-
-  /* (A.3) Private internal variables */
-  s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n");
-  s4o.indent_right();
-  vardecl = new generate_cc_vardecl_c(&s4o,
-  				      generate_cc_vardecl_c::local_vf,
+				      generate_cc_vardecl_c::temp_vt |
   				      generate_cc_vardecl_c::private_vt |
   				      generate_cc_vardecl_c::located_vt |
-				      generate_cc_vardecl_c::external_vt);
+  				      generate_cc_vardecl_c::external_vt);
   vardecl->print(symbol->var_declarations);
   delete vardecl;
-  s4o.print("\n ");
+  s4o.print("\n");
+
+  /* (A.4) Program data structure type name. */
   s4o.indent_left();
   s4o.print("} ");
   symbol->program_type_name->accept(*this);
-  s4o.print(";\n\n ");
-  /* (B) Constructor */
-  /* (B.1) Constructor name... */
-  s4o.print("// Code part");
-  /*PROGRAM Interface*/
-  s4o.indent_right();
-  s4o.print(s4o.indent_spaces);
+  s4o.print(";\n\n");
+
+  /* (B) Function with PROGRAM body */
+  /* (B.1) Function declaration */
+  s4o.print("// Code part\n");
+  /* function interface */
   s4o.print("void ");
   symbol->program_type_name->accept(*this);
   s4o.print(FB_FUNCTION_SUFFIX);
-  /* (B.2) Constructor parameters (i.e. the external variables)... */
   s4o.print("(");
+  /* first and only parameter is a pointer to the data */
   symbol->program_type_name->accept(*this);
-  s4o.indent_right();
-  s4o.print(" ");
+  s4o.print(" *");
+  s4o.print(FB_FUNCTION_PARAM);
+  s4o.print(") {\n");
+  s4o.indent_right();
+
+  /* (B.2) Initialize TEMP variables */
+  /* function body */
+  s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n");
   vardecl = new generate_cc_vardecl_c(&s4o,
-  				      generate_cc_vardecl_c::finterface_vf,
-  				      generate_cc_vardecl_c::external_vt);
-  vardecl->print(symbol->var_declarations);
-  delete vardecl;
-  s4o.print(")");
-  s4o.print("{\n");
-  s4o.indent_left();
-
-  /* (B.2) Member initializations... */
-  s4o.indent_right();
-  s4o.print(s4o.indent_spaces + "//Initialise PROGRAM variables\n");
-  vardecl = new generate_cc_vardecl_c(&s4o,
-  				      generate_cc_vardecl_c::constructorinit_vf,
-  				      generate_cc_vardecl_c::input_vt |
-  				      generate_cc_vardecl_c::output_vt |
-  				      generate_cc_vardecl_c::inoutput_vt |
-  				      generate_cc_vardecl_c::private_vt |
-				      generate_cc_vardecl_c::external_vt);
-  vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->");
-  delete vardecl;
-  s4o.print("\n" + s4o.indent_spaces);
-  s4o.indent_left();
-  s4o.indent_left();
-
-  /* (C) Public Function*/
-  /* (C.1) Public Function declaration */
-  s4o.print(s4o.indent_spaces);
-  //s4o.indent_right();
-  //s4o.print(s4o.indent_spaces + "void f(void) {\n");
-
-  /* (C.2) Temporary variables */
-  //s4o.indent_right();
-  //vardecl = new generate_cc_vardecl_c(&s4o, generate_cc_vardecl_c::localinit_vf, generate_cc_vardecl_c::temp_vt);
-  //vardecl->print(symbol->var_declarations);
-  //delete vardecl;
-  //s4o.indent_left();
+  				      generate_cc_vardecl_c::init_vf,
+				      generate_cc_vardecl_c::temp_vt);
+  vardecl->print(symbol->var_declarations, NULL,  FB_FUNCTION_PARAM"->");
+  delete vardecl;
   s4o.print("\n");
 
-  /* (C.3) Public Function body */
-  s4o.indent_right();
+  /* (B.3) Function code */
   generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
   symbol->function_block_body->accept(generate_cc_code);
   s4o.indent_left();
-  s4o.print(s4o.indent_spaces + "} //");
+  s4o.print(s4o.indent_spaces + "} // ");
   symbol->program_type_name->accept(*this);
   s4o.print(FB_FUNCTION_SUFFIX);
-  s4o.print("()\n");
-  s4o.indent_left();
-
-  /* (D) Close the class declaration... */
-  s4o.indent_left();
-  s4o.print(s4o.indent_spaces + "}; /* void ");
-  symbol->program_type_name->accept(*this);
-  s4o.print(" */\n\n\n");
-
-  /* (E) Initialise the static member variables... */
-  vardecl = new generate_cc_vardecl_c(&s4o,
-  				      generate_cc_vardecl_c::globalinit_vf,
-  				      generate_cc_vardecl_c::located_vt);
-  vardecl->print(symbol->var_declarations, symbol->program_type_name);
-  delete vardecl;
+  s4o.print(s4o.indent_spaces + "() \n\n");
+
+  s4o.indent_left();
   s4o.print("\n\n\n\n");
 
   return NULL;