stage4/generate_c/generate_c_st.cc
changeset 706 31553c22f318
parent 625 c0bda77b37a0
child 793 268bf4ca5fa1
--- a/stage4/generate_c/generate_c_st.cc	Thu Nov 08 18:55:57 2012 +0100
+++ b/stage4/generate_c/generate_c_st.cc	Thu Nov 15 22:28:53 2012 +0100
@@ -144,16 +144,24 @@
 void *print_getter(symbol_c *symbol) {
   unsigned int vartype = search_var_instance_decl->get_vartype(symbol);
   if (wanted_variablegeneration == fparam_output_vg) {
-    if (vartype == search_var_instance_decl_c::external_vt)
-      s4o.print(GET_EXTERNAL_BY_REF);
+    if (vartype == search_var_instance_decl_c::external_vt) {
+      if (search_var_instance_decl->type_is_fb(symbol))
+        s4o.print(GET_EXTERNAL_FB_BY_REF);
+      else
+        s4o.print(GET_EXTERNAL_BY_REF);
+    }
     else if (vartype == search_var_instance_decl_c::located_vt)
       s4o.print(GET_LOCATED_BY_REF);
     else
       s4o.print(GET_VAR_BY_REF);
   }
   else {
-    if (vartype == search_var_instance_decl_c::external_vt)
-      s4o.print(GET_EXTERNAL);
+    if (vartype == search_var_instance_decl_c::external_vt) {
+      if (search_var_instance_decl->type_is_fb(symbol))
+        s4o.print(GET_EXTERNAL_FB);
+      else
+        s4o.print(GET_EXTERNAL);
+    }
     else if (vartype == search_var_instance_decl_c::located_vt)
       s4o.print(GET_LOCATED);
     else
@@ -174,24 +182,33 @@
 }
 
 void *print_setter(symbol_c* symbol,
-		symbol_c* type,
-		symbol_c* value,
-		symbol_c* fb_symbol = NULL,
-		symbol_c* fb_value = NULL) {
+        symbol_c* type,
+        symbol_c* value,
+        symbol_c* fb_symbol = NULL,
+        symbol_c* fb_value = NULL) {
   
   bool type_is_complex = false;
   if (fb_symbol == NULL) {
     unsigned int vartype = search_var_instance_decl->get_vartype(symbol);
     type_is_complex = search_var_instance_decl->type_is_complex(symbol);
-    if (vartype == search_var_instance_decl_c::external_vt)
-      s4o.print(SET_EXTERNAL);
+    if (vartype == search_var_instance_decl_c::external_vt) {
+      if (search_var_instance_decl->type_is_fb(symbol))
+        s4o.print(SET_EXTERNAL_FB);
+      else
+        s4o.print(SET_EXTERNAL);
+    }
     else if (vartype == search_var_instance_decl_c::located_vt)
       s4o.print(SET_LOCATED);
     else
       s4o.print(SET_VAR);
   }
-  else
-	s4o.print(SET_VAR);
+  else {
+    unsigned int vartype = search_var_instance_decl->get_vartype(fb_symbol);
+    if (vartype == search_var_instance_decl_c::external_vt)
+      s4o.print(SET_EXTERNAL_FB);
+    else
+      s4o.print(SET_VAR);
+  }
   s4o.print("(");
 
   if (fb_symbol != NULL) {
@@ -288,14 +305,14 @@
   if (strlen(symbol->value) == 0) ERROR;
   if (this->is_variable_prefix_null()) {
     if (wanted_variablegeneration != fparam_output_vg)
-	  s4o.print("*(");
+      s4o.print("*(");
   }
   else {
     switch (wanted_variablegeneration) {
       case expression_vg:
-  	    s4o.print(GET_LOCATED);
-  	    s4o.print("(");
-  	    break;
+        s4o.print(GET_LOCATED);
+        s4o.print("(");
+        break;
       case fparam_output_vg:
         s4o.print(GET_LOCATED_BY_REF);
         s4o.print("(");
@@ -307,7 +324,7 @@
   this->print_variable_prefix();
   s4o.printlocation(symbol->value + 1);
   if ((this->is_variable_prefix_null() && wanted_variablegeneration != fparam_output_vg) ||
-	  wanted_variablegeneration != assignment_vg)
+      wanted_variablegeneration != assignment_vg)
     s4o.print(")");
   return NULL;
 }
@@ -325,8 +342,8 @@
     case complextype_base_assignment_vg:
       symbol->record_variable->accept(*this);
       if (!type_is_complex) {
-    	s4o.print(".");
-    	symbol->field_selector->accept(*this);
+        s4o.print(".");
+        symbol->field_selector->accept(*this);
       }
       break;
     case complextype_suffix_vg:
@@ -343,12 +360,12 @@
       break;
     default:
       if (this->is_variable_prefix_null()) {
-    	symbol->record_variable->accept(*this);
-    	s4o.print(".");
-    	symbol->field_selector->accept(*this);
+        symbol->record_variable->accept(*this);
+        s4o.print(".");
+        symbol->field_selector->accept(*this);
       }
       else
-    	print_getter(symbol);
+        print_getter(symbol);
       break;
   }
   return NULL;
@@ -377,18 +394,18 @@
       break;
     default:
       if (this->is_variable_prefix_null()) {
-    	symbol->subscripted_variable->accept(*this);
-
-    	current_array_type = search_varfb_instance_type->get_basetype_decl(symbol->subscripted_variable);
-    	if (current_array_type == NULL) ERROR;
-
-    	s4o.print(".table");
+        symbol->subscripted_variable->accept(*this);
+
+        current_array_type = search_varfb_instance_type->get_basetype_decl(symbol->subscripted_variable);
+        if (current_array_type == NULL) ERROR;
+
+        s4o.print(".table");
         symbol->subscript_list->accept(*this);
 
         current_array_type = NULL;
       }
       else
-    	print_getter(symbol);
+        print_getter(symbol);
       break;
   }
   return NULL;
@@ -399,9 +416,9 @@
   array_dimension_iterator_c* array_dimension_iterator = new array_dimension_iterator_c(current_array_type);
   for (int i =  0; i < symbol->n; i++) {
     symbol_c* dimension = array_dimension_iterator->next();
-	if (dimension == NULL) ERROR;
-
-	s4o.print("[(");
+    if (dimension == NULL) ERROR;
+
+    s4o.print("[(");
     symbol->elements[i]->accept(*this);
     s4o.print(") - (");
     dimension->accept(*this);
@@ -570,8 +587,8 @@
 
 void *visit(add_expression_c *symbol) {
   symbol_c *left_type = search_expression_type->get_type(symbol->l_exp);
-	symbol_c *right_type = search_expression_type->get_type(symbol->r_exp);
-	if ((typeid(*left_type) == typeid(time_type_name_c) && typeid(*right_type) == typeid(time_type_name_c)) ||
+  symbol_c *right_type = search_expression_type->get_type(symbol->r_exp);
+  if ((typeid(*left_type) == typeid(time_type_name_c) && typeid(*right_type) == typeid(time_type_name_c)) ||
       (typeid(*left_type) == typeid(tod_type_name_c) && typeid(*right_type) == typeid(time_type_name_c)) ||
       (typeid(*left_type) == typeid(dt_type_name_c) && typeid(*right_type) == typeid(time_type_name_c)))
     return print_binary_function("__time_add", symbol->l_exp, symbol->r_exp);
@@ -650,15 +667,15 @@
   symbol_c *left_type = search_expression_type->get_type(symbol->l_exp);
   symbol_c *right_type = search_expression_type->get_type(symbol->r_exp);
   if (search_expression_type->is_real_type(left_type) && search_expression_type->is_num_type(right_type)) {
-	s4o.print("EXPT__LREAL__LREAL__LREAL((BOOL)__BOOL_LITERAL(TRUE),\n");
-	s4o.indent_right();
-	s4o.print(s4o.indent_spaces + "NULL,\n");
-	s4o.print(s4o.indent_spaces + "(LREAL)(");
-	symbol->l_exp->accept(*this);
-	s4o.print("),\n");
-	s4o.print(s4o.indent_spaces + "(LREAL)(");
-	symbol->r_exp->accept(*this);
-	s4o.print("))");
+    s4o.print("EXPT__LREAL__LREAL__LREAL((BOOL)__BOOL_LITERAL(TRUE),\n");
+    s4o.indent_right();
+    s4o.print(s4o.indent_spaces + "NULL,\n");
+    s4o.print(s4o.indent_spaces + "(LREAL)(");
+    symbol->l_exp->accept(*this);
+    s4o.print("),\n");
+    s4o.print(s4o.indent_spaces + "(LREAL)(");
+    symbol->r_exp->accept(*this);
+    s4o.print("))");
     return NULL;
   }
   ERROR;
@@ -824,9 +841,9 @@
           
     switch (PARAM_DIRECTION) {
       case function_param_iterator_c::direction_in:
-    	if (nb_param > 0)
-    	  s4o.print(",\n"+s4o.indent_spaces);
-    	if (param_value == NULL) {
+        if (nb_param > 0)
+          s4o.print(",\n"+s4o.indent_spaces);
+        if (param_value == NULL) {
           /* If not, get the default value of this variable's type */
           param_value = (symbol_c *)current_param_type->accept(*type_initial_value_c::instance());
         }
@@ -844,18 +861,18 @@
         break;
       case function_param_iterator_c::direction_out:
       case function_param_iterator_c::direction_inout:
-    	if (!has_output_params) {
+        if (!has_output_params) {
           if (nb_param > 0)
-        	s4o.print(",\n"+s4o.indent_spaces);
-    	  if (param_value == NULL)
+            s4o.print(",\n"+s4o.indent_spaces);
+          if (param_value == NULL)
             s4o.print("NULL");
           else {
             wanted_variablegeneration = fparam_output_vg;
             param_value->accept(*this);
             wanted_variablegeneration = expression_vg;
           }
-    	  nb_param++;
-    	}
+          nb_param++;
+        }
         break;
       case function_param_iterator_c::direction_extref:
         /* TODO! */
@@ -895,7 +912,7 @@
     print_check_function(left_type, symbol->r_exp);
   }
   else {
-	print_setter(symbol->l_exp, left_type, symbol->r_exp);
+    print_setter(symbol->l_exp, left_type, symbol->r_exp);
   }
   return NULL;
 }
@@ -970,7 +987,9 @@
   /* now call the function... */
   function_block_type_name->accept(*this);
   s4o.print(FB_FUNCTION_SUFFIX);
-  s4o.print("(&");
+  s4o.print("(");
+  if (search_var_instance_decl->get_vartype(symbol->fb_name) != search_var_instance_decl_c::external_vt)
+    s4o.print("&");
   print_variable_prefix();
   symbol->fb_name->accept(*this);
   s4o.print(")");
@@ -1111,9 +1130,9 @@
   s4o.indent_right();
   s4o.print(s4o.indent_spaces);
   if (search_expression_type->is_literal_integer_type(expression_type))
-	search_expression_type->lint_type_name.accept(*this);
+    search_expression_type->lint_type_name.accept(*this);
   else if (search_expression_type->is_literal_real_type(expression_type))
-	search_expression_type->lreal_type_name.accept(*this);
+    search_expression_type->lreal_type_name.accept(*this);
   else
     expression_type->accept(*this);
   s4o.print(" __case_expression = ");
@@ -1128,10 +1147,10 @@
   first_subrange_case_list = true;
   symbol->case_element_list->accept(*this);
   if (symbol->statement_list != NULL) {
-	if (!first_subrange_case_list) {
+    if (!first_subrange_case_list) {
       s4o.print(s4o.indent_spaces + "else {\n");
       s4o.indent_right();
-	}
+    }
     symbol->statement_list->accept(*this);
     if (!first_subrange_case_list) {
       s4o.indent_left();
@@ -1161,7 +1180,7 @@
       case_element_iterator = new case_element_iterator_c(symbol->case_list, case_element_iterator_c::element_single);
       for (element = case_element_iterator->next(); element != NULL; element = case_element_iterator->next()) {
         if (first_element) first_element = false;
-    	s4o.print(s4o.indent_spaces + "case ");
+        s4o.print(s4o.indent_spaces + "case ");
         element->accept(*this);
         s4o.print(":\n");
       }
@@ -1177,7 +1196,7 @@
             first_subrange_case_list = false;
           }
           else {
-        	  s4o.print(s4o.indent_spaces + "else if (");
+            s4o.print(s4o.indent_spaces + "else if (");
           }
           first_element = false;
         }
@@ -1205,9 +1224,9 @@
         s4o.indent_left();
         break;
       case subrange_cg:
-    	s4o.indent_left();
-  	    s4o.print(s4o.indent_spaces + "}\n");
-  	    break;
+        s4o.indent_left();
+        s4o.print(s4o.indent_spaces + "}\n");
+        break;
       default:
         break;
     }