stage4/generate_c/generate_c_sfcdecl.cc
changeset 244 3a478229db8b
parent 229 ca7bc1324540
child 279 c0453b7f99df
--- a/stage4/generate_c/generate_c_sfcdecl.cc	Thu May 20 23:36:53 2010 +0200
+++ b/stage4/generate_c/generate_c_sfcdecl.cc	Wed Jun 02 18:21:15 2010 +0200
@@ -31,8 +31,10 @@
  * code.
  */
 
-
-
+typedef struct
+{
+  identifier_c *symbol;
+} VARIABLE;
 
 /***********************************************************************/
 /***********************************************************************/
@@ -55,25 +57,32 @@
        } sfcdeclaration_t;
   
   private:
-    char step_number;
-    char action_number;
-    char transition_number;
+    int step_number;
+    int action_number;
+    int transition_number;
+    std::list<VARIABLE> variable_list;
     
     sfcdeclaration_t wanted_sfcdeclaration;
+
+    search_var_instance_decl_c *search_var_instance_decl;
     
   public:
-    generate_c_sfcdecl_c(stage4out_c *s4o_ptr, sfcdeclaration_t sfcdeclaration)
+    generate_c_sfcdecl_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL)
     : generate_c_typedecl_c(s4o_ptr) {
-      wanted_sfcdeclaration = sfcdeclaration;
-    }
-    ~generate_c_sfcdecl_c(void) {}
-    
-    void print(symbol_c *symbol, const char *variable_prefix = NULL) {
       this->set_variable_prefix(variable_prefix);
-      
+      search_var_instance_decl = new search_var_instance_decl_c(scope);
+    }
+    ~generate_c_sfcdecl_c(void) {
+      variable_list.clear();
+      delete search_var_instance_decl;
+    }
+    
+    void generate(symbol_c *symbol, sfcdeclaration_t declaration_type) {
+      wanted_sfcdeclaration = declaration_type;
+
       symbol->accept(*this);
     }
-    
+
 /*********************************************/
 /* B.1.6  Sequential function chart elements */
 /*********************************************/
@@ -143,7 +152,7 @@
           for(int i = 0; i < symbol->n; i++)
             symbol->elements[i]->accept(*this);
           
-          /* steps table count */
+          /* actions table count */
           wanted_sfcdeclaration = actioncount_sd;
           for(int i = 0; i < symbol->n; i++)
             symbol->elements[i]->accept(*this);
@@ -192,6 +201,18 @@
           break;
         case actiondef_sd:
           s4o.print("// Actions definitions\n");
+          {
+            std::list<VARIABLE>::iterator pt;
+            for(pt = variable_list.begin(); pt != variable_list.end(); pt++) {
+              s4o.print("#define ");
+              s4o.print(SFC_STEP_ACTION_PREFIX);
+              pt->symbol->accept(*this);
+              s4o.print(" ");
+              s4o.print_integer(action_number);
+              s4o.print("\n");
+              action_number++;
+            }
+          }
           for(int i = 0; i < symbol->n; i++)
             symbol->elements[i]->accept(*this);
           s4o.print("\n");
@@ -204,6 +225,15 @@
           break;
         case actionundef_sd:
           s4o.print("// Actions undefinitions\n");
+          {
+            std::list<VARIABLE>::iterator pt;
+            for(pt = variable_list.begin(); pt != variable_list.end(); pt++) {
+              s4o.print("#undef ");
+              s4o.print(SFC_STEP_ACTION_PREFIX);
+              pt->symbol->accept(*this);
+              s4o.print("\n");
+            }
+          }
           for(int i = 0; i < symbol->n; i++)
             symbol->elements[i]->accept(*this);
           s4o.print("\n");
@@ -216,8 +246,12 @@
     
     void *visit(initial_step_c *symbol) {
       switch (wanted_sfcdeclaration) {
+        case actioncount_sd:
+          symbol->action_association_list->accept(*this);
+          break;
+        case sfcdecl_sd:
+          symbol->action_association_list->accept(*this);
         case stepcount_sd:
-        case sfcdecl_sd:
           step_number++;
           break;
         case sfcinit_sd:
@@ -253,8 +287,12 @@
     
     void *visit(step_c *symbol) {
       switch (wanted_sfcdeclaration) {
+        case actioncount_sd:
+          symbol->action_association_list->accept(*this);
+          break;
+        case sfcdecl_sd:
+          symbol->action_association_list->accept(*this);
         case stepcount_sd:
-        case sfcdecl_sd:
         case sfcinit_sd:
           step_number++;
           break;
@@ -279,6 +317,25 @@
       return NULL;
     }
 
+    void *visit(action_association_c *symbol) {
+      /* we try to find the variable instance declaration, to determine if symbol is variable... */
+      symbol_c *var_decl = search_var_instance_decl->get_decl(symbol->action_name);
+
+      if (var_decl != NULL) {
+    	std::list<VARIABLE>::iterator pt;
+        for(pt = variable_list.begin(); pt != variable_list.end(); pt++) {
+          if (!compare_identifiers(pt->symbol, symbol->action_name))
+            return NULL;
+        }
+        VARIABLE *variable;
+        variable = new VARIABLE;
+        variable->symbol = (identifier_c*)(symbol->action_name);
+        variable_list.push_back(*variable);
+        action_number++;
+      }
+      return NULL;
+    }
+
     void *visit(transition_c *symbol) {
       switch (wanted_sfcdeclaration) {
         case sfcdecl_sd: