diff -r f2323f79252e -r 31553c22f318 stage4/generate_c/generate_c_st.cc --- 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; }