diff -r a7d9e0b8636b -r 9c6c588fd708 stage4/generate_c/generate_c_typedecl.cc --- a/stage4/generate_c/generate_c_typedecl.cc Wed Feb 19 22:25:10 2014 +0100 +++ b/stage4/generate_c/generate_c_typedecl.cc Wed Feb 19 22:27:11 2014 +0100 @@ -31,16 +31,9 @@ private: symbol_c* current_type_name; bool array_is_derived; - generate_c_base_c *basedecl; public: - generate_c_typedecl_c(stage4out_c *s4o_ptr, stage4out_c *s4o_incl_ptr): generate_c_base_c(s4o_ptr), s4o_incl(*s4o_incl_ptr) { - current_typedefinition = none_td; - current_basetypedeclaration = none_bd; - current_type_name = NULL; - basedecl = new generate_c_base_c(&s4o_incl); - } generate_c_typedecl_c(stage4out_c *s4o_ptr): generate_c_base_c(s4o_ptr), s4o_incl(*s4o_ptr) { current_typedefinition = none_td; current_basetypedeclaration = none_bd; @@ -98,9 +91,6 @@ return NULL; } - bool type_is_fb(symbol_c* type_decl) { - return search_base_type_c::type_is_fb(type_decl); - } /***************************/ /* B 0 - Programming Model */ @@ -193,6 +183,7 @@ /* integer_type_name '(' subrange')' */ void *visit(subrange_specification_c *symbol) { + TRACE("subrange_specification_c"); if (current_typedefinition == subrange_td) { switch (current_basetypedeclaration) { case subrangebasetype_bd: @@ -200,45 +191,52 @@ break; case subrangetest_bd: if (symbol->subrange != NULL) { - current_type_name->accept(*this); - s4o.print(" __CHECK_"); - current_type_name->accept(*this); - s4o.print("("); - current_type_name->accept(*this); - s4o.print(" value) {\n"); - s4o.indent_right(); - - if (search_base_type_c::type_is_subrange(symbol->integer_type_name)) { - s4o.print(s4o.indent_spaces + "value = __CHECK_"); + s4o_incl.print("static inline "); + current_type_name->accept(*basedecl); + s4o_incl.print(" __CHECK_"); + current_type_name->accept(*basedecl); + s4o_incl.print("("); + current_type_name->accept(*basedecl); + s4o_incl.print(" value) {\n"); + s4o_incl.indent_right(); + + /* NOTE: IEC 61131-3 v2 syntax mandates that the integer type name be one of SINT, ..., LINT, USINT, ... ULIT */ + /* For this reason, the following condition will always be false, and therefore this is a block + * of dead code. However, let's not delete it for now. It might come in useful for IEC 61131-3 v3. + * For the moment, we just comment it out! + */ + /* + if (get_datatype_info_c::is_subrange(symbol->integer_type_name)) { + s4o_incl.print(s4o_incl.indent_spaces + "value = __CHECK_"); symbol->integer_type_name->accept(*this); - s4o.print("(value);\n"); + s4o_incl.print("(value);\n"); } + */ symbol->subrange->accept(*this); - s4o.indent_left(); - s4o.print("}\n"); + s4o_incl.indent_left(); + s4o_incl.print("}\n"); } else { - s4o.print("#define __CHECK_"); - current_type_name->accept(*this); - s4o.print(" __CHECK_"); - symbol->integer_type_name->accept(*this); - s4o.print("\n"); + s4o_incl.print("#define __CHECK_"); + current_type_name->accept(*basedecl); + s4o_incl.print(" __CHECK_"); + symbol->integer_type_name->accept(*basedecl); + s4o_incl.print("\n"); } break; default: break; } } - else { - symbol->integer_type_name->accept(*basedecl); - } - return NULL; -} + return NULL; +} + /* signed_integer DOTDOT signed_integer */ void *visit(subrange_c *symbol) { + TRACE("subrange_c"); int dimension; switch (current_typedefinition) { case array_td: @@ -251,26 +249,26 @@ symbol->lower_limit->accept(*this); break; case subrange_td: - s4o.print(s4o.indent_spaces + "if (value < "); - symbol->lower_limit->accept(*this); - s4o.print(")\n"); - s4o.indent_right(); - s4o.print(s4o.indent_spaces + "return "); - symbol->lower_limit->accept(*this); - s4o.print(";\n"); - s4o.indent_left(); - s4o.print(s4o.indent_spaces + "else if (value > "); - symbol->upper_limit->accept(*this); - s4o.print(")\n"); - s4o.indent_right(); - s4o.print(s4o.indent_spaces + "return "); - symbol->upper_limit->accept(*this); - s4o.print(";\n"); - s4o.indent_left(); - s4o.print(s4o.indent_spaces + "else\n"); - s4o.indent_right(); - s4o.print(s4o.indent_spaces + "return value;\n"); - s4o.indent_left(); + s4o_incl.print(s4o_incl.indent_spaces + "if (value < "); + symbol->lower_limit->accept(*basedecl); + s4o_incl.print(")\n"); + s4o_incl.indent_right(); + s4o_incl.print(s4o_incl.indent_spaces + "return "); + symbol->lower_limit->accept(*basedecl); + s4o_incl.print(";\n"); + s4o_incl.indent_left(); + s4o_incl.print(s4o_incl.indent_spaces + "else if (value > "); + symbol->upper_limit->accept(*basedecl); + s4o_incl.print(")\n"); + s4o_incl.indent_right(); + s4o_incl.print(s4o_incl.indent_spaces + "return "); + symbol->upper_limit->accept(*basedecl); + s4o_incl.print(";\n"); + s4o_incl.indent_left(); + s4o_incl.print(s4o_incl.indent_spaces + "else\n"); + s4o_incl.indent_right(); + s4o_incl.print(s4o_incl.indent_spaces + "return value;\n"); + s4o_incl.indent_left(); default: break; } @@ -311,29 +309,15 @@ /* helper symbol for enumerated_specification->enumerated_spec_init */ /* enumerated_value_list ',' enumerated_value */ void *visit(enumerated_value_list_c *symbol) { + TRACE("enumerated_value_list_c"); print_list_incl(symbol, s4o_incl.indent_spaces, ",\n"+s4o_incl.indent_spaces, "\n"); return NULL; } /* enumerated_type_name '#' identifier */ -void *visit(enumerated_value_c *symbol) { - if (current_typedefinition == enumerated_td) - current_type_name->accept(*basedecl); - else { - if (NULL == symbol->datatype) { - debug_c::print(symbol); - ERROR; - } - symbol_c *type_name = get_datatype_info_c::get_id(symbol->datatype); - if (NULL == type_name) { -// ERROR_MSG("generate_c does not support anonymous enumerated data types."); - } else - type_name->accept(*basedecl); - } - s4o_incl.print("__"); - symbol->value->accept(*basedecl); - return NULL; -} +/* Handled by generate_c_base_c class!! +void *visit(enumerated_value_c *symbol) {} +*/ /* identifier ':' array_spec_init */ void *visit(array_type_declaration_c *symbol) { @@ -396,6 +380,7 @@ /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ void *visit(array_specification_c *symbol) { + TRACE("array_specification_c"); switch (current_basetypedeclaration) { case arraybasetype_bd: symbol->non_generic_type_name->accept(*this); @@ -412,18 +397,12 @@ return NULL; } -/* helper symbol for array_specification */ -/* array_subrange_list ',' subrange */ -void *visit(array_subrange_list_c *symbol) { - print_list(symbol); - return NULL; -} /* TYPE type_declaration_list END_TYPE */ void *visit(data_type_declaration_c *symbol) { TRACE("data_type_declaration_c"); symbol->type_declaration_list->accept(*this); - s4o.print("\n\n"); + s4o_incl.print("\n\n"); return NULL; } @@ -443,12 +422,12 @@ symbol->simple_spec_init->accept(*this); s4o_incl.print(")\n"); - if (search_base_type_c::type_is_subrange(symbol->simple_type_name)) { - s4o.print("#define __CHECK_"); - current_type_name->accept(*this); - s4o.print(" __CHECK_"); + if (get_datatype_info_c::is_subrange(symbol->simple_type_name)) { + s4o_incl.print("#define __CHECK_"); + current_type_name->accept(*basedecl); + s4o_incl.print(" __CHECK_"); symbol->simple_spec_init->accept(*this); - s4o.print("\n"); + s4o_incl.print("\n"); } return NULL; @@ -568,7 +547,7 @@ s4o_incl.print(" "); symbol->structure_element_name->accept(*basedecl); s4o_incl.print(";\n"); - s4o_incl.print(s4o.indent_spaces); + s4o_incl.print(s4o_incl.indent_spaces); return NULL; }