--- 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;
}