msousa@666: /* msousa@666: * matiec - a compiler for the programming languages defined in IEC 61131-3 msousa@666: * msousa@666: * Copyright (C) 2003-2012 Mario de Sousa (msousa@fe.up.pt) msousa@666: * Copyright (C) 2007-2011 Laurent Bessard and Edouard Tisserant msousa@676: * Copyright (C) 2012 Manuele Conti (conti.ma@alice.it) msousa@666: * msousa@666: * This program is free software: you can redistribute it and/or modify msousa@666: * it under the terms of the GNU General Public License as published by msousa@666: * the Free Software Foundation, either version 3 of the License, or msousa@666: * (at your option) any later version. msousa@666: * msousa@666: * This program is distributed in the hope that it will be useful, msousa@666: * but WITHOUT ANY WARRANTY; without even the implied warranty of msousa@666: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the msousa@666: * GNU General Public License for more details. msousa@666: * msousa@666: * You should have received a copy of the GNU General Public License msousa@666: * along with this program. If not, see . msousa@666: * msousa@666: * msousa@666: * This code is made available on the understanding that it will not be msousa@666: * used in safety-critical situations without a full and competent review. msousa@666: */ msousa@666: msousa@666: /* msousa@666: * An IEC 61131-3 compiler. msousa@666: * msousa@666: * Based on the msousa@666: * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10) msousa@666: * msousa@666: */ msousa@666: msousa@666: /* Determine the characteristics of a specific data type msousa@666: * e.g., is it an enumeration, is it an array, is it ANY_INT, etc... msousa@666: * msousa@666: * The methods of this class may be passed either: msousa@666: * - a data type declaration symbol_c, msousa@666: * OR msousa@666: * - the name of a data type (identifier_c) msousa@666: * In this case, we shall first serach for the basetype declaration using search_base_type_c, and then msousa@666: * run the normal process. msousa@666: */ msousa@666: #include "absyntax_utils.hh" msousa@666: msousa@666: #include "../main.hh" // required for ERROR() and ERROR_MSG() macros. msousa@666: msousa@666: msousa@666: msousa@666: #include // required for typeid msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: static search_base_type_c search_base_type; msousa@666: msousa@666: msousa@666: msousa@666: msousa@676: msousa@676: bool get_datatype_info_c::is_type_equal(symbol_c *first_type, symbol_c *second_type) { msousa@676: if ((NULL == first_type) || (NULL == second_type)) msousa@676: return false; msousa@676: if (typeid(* first_type) == typeid(invalid_type_name_c)) msousa@676: return false; msousa@676: if (typeid(*second_type) == typeid(invalid_type_name_c)) msousa@676: return false; msousa@676: msousa@676: if (get_datatype_info_c::is_ANY_ELEMENTARY(first_type)) { msousa@676: if (typeid(*first_type) == typeid(*second_type)) msousa@676: return true; msousa@676: } else /* ANY_DERIVED */ msousa@676: return (first_type == second_type); msousa@676: msousa@676: return false; msousa@676: } msousa@676: msousa@676: msousa@676: msousa@676: bool get_datatype_info_c::is_type_valid(symbol_c *type) { msousa@676: if (NULL == type) msousa@676: return false; msousa@676: if (typeid(*type) == typeid(invalid_type_name_c)) msousa@676: return false; msousa@676: msousa@676: return true; msousa@676: } msousa@676: msousa@676: msousa@676: msousa@676: msousa@676: msousa@676: msousa@666: bool get_datatype_info_c::is_sfc_initstep(symbol_c *type_symbol) { msousa@666: symbol_c *type_decl = search_base_type.get_basetype_decl(type_symbol); msousa@666: if (typeid(*type_decl) == typeid(initial_step_c)) {return true;} /* INITIAL_STEP step_name ':' action_association_list END_STEP */ /* A pseudo data type! */ msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_sfc_step(symbol_c *type_symbol) { msousa@666: symbol_c *type_decl = search_base_type.get_basetype_decl(type_symbol); msousa@666: if (typeid(*type_decl) == typeid(initial_step_c)) {return true;} /* INITIAL_STEP step_name ':' action_association_list END_STEP */ /* A pseudo data type! */ msousa@666: if (typeid(*type_decl) == typeid( step_c)) {return true;} /* STEP step_name ':' action_association_list END_STEP */ /* A pseudo data type! */ msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_function_block(symbol_c *type_symbol) { msousa@666: symbol_c *type_decl = search_base_type.get_basetype_decl(type_symbol); msousa@666: if (typeid(*type_decl) == typeid(function_block_declaration_c)) {return true;} /* FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */ msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_subrange(symbol_c *type_symbol) { msousa@666: symbol_c *type_decl = search_base_type.get_basetype_decl(type_symbol); /* NOTE: will work correctly once we update the way search_base_type_c works, by adding a new search_effective_type:c */ msousa@666: msousa@666: if (typeid(*type_decl) == typeid(subrange_type_declaration_c)) {return true;} /* subrange_type_name ':' subrange_spec_init */ msousa@666: if (typeid(*type_decl) == typeid(subrange_spec_init_c)) {return true;} /* subrange_specification ASSIGN signed_integer */ msousa@666: if (typeid(*type_decl) == typeid(subrange_specification_c)) {return true;} /* integer_type_name '(' subrange')' */ msousa@666: msousa@666: if (typeid(*type_decl) == typeid(subrange_c)) {ERROR;} /* signed_integer DOTDOT signed_integer */ msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_enumerated(symbol_c *type_symbol) { msousa@666: symbol_c *type_decl = search_base_type.get_basetype_decl(type_symbol); msousa@666: msousa@666: if (typeid(*type_decl) == typeid(enumerated_type_declaration_c)) {return true;} /* enumerated_type_name ':' enumerated_spec_init */ msousa@666: if (typeid(*type_decl) == typeid(enumerated_spec_init_c)) {return true;} /* enumerated_specification ASSIGN enumerated_value */ msousa@666: if (typeid(*type_decl) == typeid(enumerated_value_list_c)) {return true;} /* enumerated_value_list ',' enumerated_value */ /* once we change the way we handle enums, this will probably become an ERROR! */ msousa@666: msousa@666: if (typeid(*type_decl) == typeid(enumerated_value_c)) {ERROR;} /* enumerated_type_name '#' identifier */ msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_array(symbol_c *type_symbol) { msousa@666: symbol_c *type_decl = search_base_type.get_basetype_decl(type_symbol); msousa@666: msousa@666: if (typeid(*type_decl) == typeid(array_type_declaration_c)) {return true;} /* identifier ':' array_spec_init */ msousa@666: if (typeid(*type_decl) == typeid(array_spec_init_c)) {return true;} /* array_specification [ASSIGN array_initialization} */ msousa@666: if (typeid(*type_decl) == typeid(array_specification_c)) {return true;} /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ msousa@666: msousa@666: if (typeid(*type_decl) == typeid(array_subrange_list_c)) {ERROR;} /* array_subrange_list ',' subrange */ msousa@666: if (typeid(*type_decl) == typeid(array_initial_elements_list_c)) {ERROR;} /* array_initialization: '[' array_initial_elements_list ']' */ /* array_initial_elements_list ',' array_initial_elements */ msousa@666: if (typeid(*type_decl) == typeid(array_initial_elements_c)) {ERROR;} /* integer '(' [array_initial_element] ')' */ msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_structure(symbol_c *type_symbol) { msousa@666: symbol_c *type_decl = search_base_type.get_basetype_decl(type_symbol); msousa@666: msousa@666: if (typeid(*type_decl) == typeid(structure_type_declaration_c)) {return true;} /* structure_type_name ':' structure_specification */ msousa@666: if (typeid(*type_decl) == typeid(initialized_structure_c)) {return true;} /* structure_type_name ASSIGN structure_initialization */ msousa@666: if (typeid(*type_decl) == typeid(structure_element_declaration_list_c)) {return true;} /* structure_declaration: STRUCT structure_element_declaration_list END_STRUCT */ /* structure_element_declaration_list structure_element_declaration ';' */ msousa@666: msousa@666: if (typeid(*type_decl) == typeid(structure_element_declaration_c)) {ERROR;} /* structure_element_name ':' *_spec_init */ msousa@666: if (typeid(*type_decl) == typeid(structure_element_initialization_list_c)) {ERROR;} /* structure_initialization: '(' structure_element_initialization_list ')' */ /* structure_element_initialization_list ',' structure_element_initialization */ msousa@666: if (typeid(*type_decl) == typeid(structure_element_initialization_c)) {ERROR;} /* structure_element_name ASSIGN value */ msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_ELEMENTARY(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_MAGNITUDE(type_symbol)) {return true;} msousa@666: if (is_ANY_BIT (type_symbol)) {return true;} msousa@666: if (is_ANY_STRING (type_symbol)) {return true;} msousa@666: if (is_ANY_DATE (type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_SAFEELEMENTARY(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_SAFEMAGNITUDE(type_symbol)) {return true;} msousa@666: if (is_ANY_SAFEBIT (type_symbol)) {return true;} msousa@666: if (is_ANY_SAFESTRING (type_symbol)) {return true;} msousa@666: if (is_ANY_SAFEDATE (type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_ELEMENTARY_compatible(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_ELEMENTARY (type_symbol)) {return true;} msousa@666: if (is_ANY_SAFEELEMENTARY(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_MAGNITUDE(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@668: if (is_TIME(type_symbol)) {return true;} msousa@666: if (is_ANY_NUM(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_SAFEMAGNITUDE(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@668: if (is_SAFETIME(type_symbol)) {return true;} msousa@666: if (is_ANY_SAFENUM(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_MAGNITUDE_compatible(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_MAGNITUDE (type_symbol)) {return true;} msousa@666: if (is_ANY_SAFEMAGNITUDE(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_signed_MAGNITUDE(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (typeid(*type_symbol) == typeid(time_type_name_c)) {return true;} msousa@666: if (is_ANY_signed_NUM(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_signed_SAFEMAGNITUDE(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (typeid(*type_symbol) == typeid(safetime_type_name_c)) {return true;} msousa@666: return is_ANY_signed_SAFENUM(type_symbol); msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_signed_MAGNITUDE_compatible(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_signed_MAGNITUDE (type_symbol)) {return true;} msousa@666: if (is_ANY_signed_SAFEMAGNITUDE(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_NUM(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_REAL(type_symbol)) {return true;} msousa@666: if (is_ANY_INT (type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_SAFENUM(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_SAFEREAL(type_symbol)) {return true;} msousa@666: if (is_ANY_SAFEINT (type_symbol)) {return true;} msousa@676: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_NUM_compatible(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_NUM (type_symbol)) {return true;} msousa@666: if (is_ANY_SAFENUM(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_signed_NUM(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_REAL (type_symbol)) {return true;} msousa@666: if (is_ANY_signed_INT(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_signed_SAFENUM(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_SAFEREAL (type_symbol)) {return true;} msousa@666: if (is_ANY_signed_SAFEINT(type_symbol)) {return true;} msousa@676: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_signed_NUM_compatible(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_signed_NUM (type_symbol)) {return true;} msousa@666: if (is_ANY_signed_SAFENUM(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_INT(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_signed_INT (type_symbol)) {return true;} msousa@666: if (is_ANY_unsigned_INT(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_SAFEINT(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_signed_SAFEINT (type_symbol)) {return true;} msousa@666: if (is_ANY_unsigned_SAFEINT(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_INT_compatible(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_INT (type_symbol)) {return true;} msousa@666: if (is_ANY_SAFEINT(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_signed_INT(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (typeid(*type_symbol) == typeid(sint_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(int_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(dint_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(lint_type_name_c)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_signed_SAFEINT(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (typeid(*type_symbol) == typeid(safesint_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(safeint_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(safedint_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(safelint_type_name_c)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_signed_INT_compatible(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_signed_INT (type_symbol)) {return true;} msousa@666: if (is_ANY_signed_SAFEINT(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_unsigned_INT(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (typeid(*type_symbol) == typeid(usint_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(uint_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(udint_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(ulint_type_name_c)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_unsigned_SAFEINT(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (typeid(*type_symbol) == typeid(safeusint_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(safeuint_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(safeudint_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(safeulint_type_name_c)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_unsigned_INT_compatible(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_unsigned_INT (type_symbol)) {return true;} msousa@666: if (is_ANY_unsigned_SAFEINT(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_REAL(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (typeid(*type_symbol) == typeid(real_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(lreal_type_name_c)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_SAFEREAL(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (typeid(*type_symbol) == typeid(safereal_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(safelreal_type_name_c)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_REAL_compatible(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_REAL (type_symbol)) {return true;} msousa@666: if (is_ANY_SAFEREAL(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_nBIT(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (typeid(*type_symbol) == typeid(byte_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(word_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(dword_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(lword_type_name_c)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_SAFEnBIT(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (typeid(*type_symbol) == typeid(safebyte_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(safeword_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(safedword_type_name_c)) {return true;} msousa@666: if (typeid(*type_symbol) == typeid(safelword_type_name_c)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_nBIT_compatible(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_nBIT (type_symbol)) {return true;} msousa@666: if (is_ANY_SAFEnBIT(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_BOOL(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (typeid(*type_symbol) == typeid(bool_type_name_c)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_SAFEBOOL(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (typeid(*type_symbol) == typeid(safebool_type_name_c)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_BOOL_compatible(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_BOOL (type_symbol)) {return true;} msousa@666: if (is_SAFEBOOL(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_BIT(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_BOOL (type_symbol)) {return true;} msousa@666: if (is_ANY_nBIT(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_SAFEBIT(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_SAFEBOOL (type_symbol)) {return true;} msousa@666: if (is_ANY_SAFEnBIT(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: bool get_datatype_info_c::is_ANY_BIT_compatible(symbol_c *type_symbol) { msousa@666: if (type_symbol == NULL) {return false;} msousa@666: if (is_ANY_BIT (type_symbol)) {return true;} msousa@666: if (is_ANY_SAFEBIT(type_symbol)) {return true;} msousa@666: return false; msousa@666: } msousa@666: msousa@666: msousa@666: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: bool get_datatype_info_c::is_TIME(symbol_c *type_symbol) { msousa@668: if (type_symbol == NULL) {return false;} msousa@668: if (typeid(*type_symbol) == typeid(time_type_name_c)) {return true;} msousa@668: return false; msousa@668: } msousa@668: msousa@668: msousa@668: bool get_datatype_info_c::is_SAFETIME(symbol_c *type_symbol) { msousa@668: if (type_symbol == NULL) {return false;} msousa@668: if (typeid(*type_symbol) == typeid(safetime_type_name_c)) {return true;} msousa@668: return false; msousa@668: } msousa@668: msousa@668: msousa@668: bool get_datatype_info_c::is_TIME_compatible(symbol_c *type_symbol) { msousa@668: if (type_symbol == NULL) {return false;} msousa@668: if (is_TIME (type_symbol)) {return true;} msousa@668: if (is_SAFETIME(type_symbol)) {return true;} msousa@668: return false; msousa@668: } msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: bool get_datatype_info_c::is_ANY_DATE(symbol_c *type_symbol) { msousa@668: if (type_symbol == NULL) {return false;} msousa@668: if (typeid(*type_symbol) == typeid(date_type_name_c)) {return true;} msousa@668: if (typeid(*type_symbol) == typeid(tod_type_name_c)) {return true;} msousa@668: if (typeid(*type_symbol) == typeid(dt_type_name_c)) {return true;} msousa@668: return false; msousa@668: } msousa@668: msousa@668: msousa@668: bool get_datatype_info_c::is_ANY_SAFEDATE(symbol_c *type_symbol) { msousa@668: if (type_symbol == NULL) {return false;} msousa@668: if (typeid(*type_symbol) == typeid(safedate_type_name_c)) {return true;} msousa@668: if (typeid(*type_symbol) == typeid(safetod_type_name_c)) {return true;} msousa@668: if (typeid(*type_symbol) == typeid(safedt_type_name_c)) {return true;} msousa@668: return false; msousa@668: } msousa@668: msousa@668: msousa@668: bool get_datatype_info_c::is_ANY_DATE_compatible(symbol_c *type_symbol) { msousa@668: if (type_symbol == NULL) {return false;} msousa@668: if (is_ANY_DATE (type_symbol)) {return true;} msousa@668: if (is_ANY_SAFEDATE(type_symbol)) {return true;} msousa@668: return false; msousa@668: } msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: bool get_datatype_info_c::is_ANY_STRING(symbol_c *type_symbol) { msousa@668: if (type_symbol == NULL) {return false;} msousa@668: if (typeid(*type_symbol) == typeid(string_type_name_c)) {return true;} msousa@668: if (typeid(*type_symbol) == typeid(wstring_type_name_c)) {return true;} msousa@668: return false; msousa@668: } msousa@668: msousa@668: msousa@668: bool get_datatype_info_c::is_ANY_SAFESTRING(symbol_c *type_symbol) { msousa@668: if (type_symbol == NULL) {return false;} msousa@668: if (typeid(*type_symbol) == typeid(safestring_type_name_c)) {return true;} msousa@668: if (typeid(*type_symbol) == typeid(safewstring_type_name_c)) {return true;} msousa@668: return false; msousa@668: } msousa@668: msousa@668: msousa@668: bool get_datatype_info_c::is_ANY_STRING_compatible(symbol_c *type_symbol) { msousa@668: if (type_symbol == NULL) {return false;} msousa@668: if (is_ANY_STRING (type_symbol)) {return true;} msousa@668: if (is_ANY_SAFESTRING(type_symbol)) {return true;} msousa@668: return false; msousa@668: } msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: msousa@668: /* Can't we do away with this?? */ msousa@668: bool get_datatype_info_c::is_ANY_REAL_literal(symbol_c *type_symbol) { msousa@668: if (type_symbol == NULL) {return true;} /* Please make sure things will work correctly before changing this to false!! */ msousa@668: if (typeid(*type_symbol) == typeid(real_c)) {return true;} msousa@668: if (typeid(*type_symbol) == typeid(neg_real_c)) {return true;} msousa@668: return false; msousa@668: } msousa@668: msousa@668: /* Can't we do away with this?? */ msousa@668: bool get_datatype_info_c::is_ANY_INT_literal(symbol_c *type_symbol) { msousa@668: if (type_symbol == NULL) {return true;} /* Please make sure things will work correctly before changing this to false!! */ msousa@668: if (typeid(*type_symbol) == typeid(integer_c)) {return true;} msousa@668: if (typeid(*type_symbol) == typeid(neg_integer_c)) {return true;} msousa@668: if (typeid(*type_symbol) == typeid(binary_integer_c)) {return true;} msousa@668: if (typeid(*type_symbol) == typeid(octal_integer_c)) {return true;} msousa@668: if (typeid(*type_symbol) == typeid(hex_integer_c)) {return true;} msousa@668: return false; msousa@668: } msousa@668: msousa@693: msousa@693: msousa@693: msousa@693: msousa@693: msousa@693: msousa@693: msousa@693: msousa@693: msousa@693: invalid_type_name_c get_datatype_info_c::invalid_type_name; msousa@693: msousa@693: /**********************/ msousa@693: /* B.1.3 - Data types */ msousa@693: /**********************/ msousa@693: /***********************************/ msousa@693: /* B 1.3.1 - Elementary Data Types */ msousa@693: /***********************************/ msousa@693: real_type_name_c get_datatype_info_c::lreal_type_name; msousa@693: real_type_name_c get_datatype_info_c::real_type_name; msousa@693: msousa@693: lint_type_name_c get_datatype_info_c::lint_type_name; msousa@693: dint_type_name_c get_datatype_info_c::dint_type_name; msousa@693: int_type_name_c get_datatype_info_c::int_type_name; msousa@693: sint_type_name_c get_datatype_info_c::sint_type_name; msousa@693: msousa@693: ulint_type_name_c get_datatype_info_c::ulint_type_name; msousa@693: udint_type_name_c get_datatype_info_c::udint_type_name; msousa@693: uint_type_name_c get_datatype_info_c::uint_type_name; msousa@693: usint_type_name_c get_datatype_info_c::usint_type_name; msousa@693: msousa@693: lword_type_name_c get_datatype_info_c::lword_type_name; msousa@693: dword_type_name_c get_datatype_info_c::dword_type_name; msousa@693: word_type_name_c get_datatype_info_c::word_type_name; msousa@693: byte_type_name_c get_datatype_info_c::byte_type_name; msousa@693: bool_type_name_c get_datatype_info_c::bool_type_name; msousa@693: msousa@693: wstring_type_name_c get_datatype_info_c::wstring_type_name; msousa@693: string_type_name_c get_datatype_info_c::string_type_name; msousa@693: msousa@693: dt_type_name_c get_datatype_info_c::dt_type_name; msousa@693: date_type_name_c get_datatype_info_c::date_type_name; msousa@693: tod_type_name_c get_datatype_info_c::tod_type_name; msousa@693: time_type_name_c get_datatype_info_c::time_type_name; msousa@693: msousa@693: msousa@693: /******************************************************/ msousa@693: /* Extensions to the base standard as defined in */ msousa@693: /* "Safety Software Technical Specification, */ msousa@693: /* Part 1: Concepts and Function Blocks, */ msousa@693: /* Version 1.0 – Official Release" */ msousa@693: /* by PLCopen - Technical Committee 5 - 2006-01-31 */ msousa@693: /******************************************************/ msousa@693: safereal_type_name_c get_datatype_info_c::safelreal_type_name; msousa@693: safereal_type_name_c get_datatype_info_c::safereal_type_name; msousa@693: msousa@693: safelint_type_name_c get_datatype_info_c::safelint_type_name; msousa@693: safedint_type_name_c get_datatype_info_c::safedint_type_name; msousa@693: safeint_type_name_c get_datatype_info_c::safeint_type_name; msousa@693: safesint_type_name_c get_datatype_info_c::safesint_type_name; msousa@693: msousa@693: safeulint_type_name_c get_datatype_info_c::safeulint_type_name; msousa@693: safeudint_type_name_c get_datatype_info_c::safeudint_type_name; msousa@693: safeuint_type_name_c get_datatype_info_c::safeuint_type_name; msousa@693: safeusint_type_name_c get_datatype_info_c::safeusint_type_name; msousa@693: msousa@693: safelword_type_name_c get_datatype_info_c::safelword_type_name; msousa@693: safedword_type_name_c get_datatype_info_c::safedword_type_name; msousa@693: safeword_type_name_c get_datatype_info_c::safeword_type_name; msousa@693: safebyte_type_name_c get_datatype_info_c::safebyte_type_name; msousa@693: safebool_type_name_c get_datatype_info_c::safebool_type_name; msousa@693: msousa@693: safewstring_type_name_c get_datatype_info_c::safewstring_type_name; msousa@693: safestring_type_name_c get_datatype_info_c::safestring_type_name; msousa@693: msousa@693: safedt_type_name_c get_datatype_info_c::safedt_type_name; msousa@693: safedate_type_name_c get_datatype_info_c::safedate_type_name; msousa@693: safetod_type_name_c get_datatype_info_c::safetod_type_name; msousa@693: safetime_type_name_c get_datatype_info_c::safetime_type_name; msousa@693: msousa@693: msousa@693: msousa@693: msousa@693: