msousa@417: /* msousa@417: * matiec - a compiler for the programming languages defined in IEC 61131-3 msousa@417: * msousa@417: * Copyright (C) 2009-2012 Mario de Sousa (msousa@fe.up.pt) msousa@417: * Copyright (C) 2012 Manuele Conti (conti.ma@alice.it) msousa@417: * msousa@417: * This program is free software: you can redistribute it and/or modify msousa@417: * it under the terms of the GNU General Public License as published by msousa@417: * the Free Software Foundation, either version 3 of the License, or msousa@417: * (at your option) any later version. msousa@417: * msousa@417: * This program is distributed in the hope that it will be useful, msousa@417: * but WITHOUT ANY WARRANTY; without even the implied warranty of msousa@417: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the msousa@417: * GNU General Public License for more details. msousa@417: * msousa@417: * You should have received a copy of the GNU General Public License msousa@417: * along with this program. If not, see . msousa@417: * msousa@417: * msousa@417: * This code is made available on the understanding that it will not be msousa@417: * used in safety-critical situations without a full and competent review. msousa@417: */ msousa@417: msousa@417: #include "datatype_functions.hh" msousa@417: #include "../absyntax_utils/absyntax_utils.hh" msousa@417: msousa@417: /* msousa@417: * 2.5.1.5.6 Functions of time data types msousa@417: * Table 30 - page 64 msousa@417: */ msousa@417: msousa@417: const struct widen_entry widen_ADD_table[] = { msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name }, msousa@417: { &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name }, msousa@417: { &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name }, msousa@417: { &search_constant_type_c::tod_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::tod_type_name }, msousa@417: { &search_constant_type_c::safetod_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::tod_type_name }, msousa@417: { &search_constant_type_c::tod_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::tod_type_name }, msousa@417: { &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetod_type_name }, msousa@417: { &search_constant_type_c::dt_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::dt_type_name }, msousa@417: { &search_constant_type_c::safedt_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::dt_type_name }, msousa@417: { &search_constant_type_c::dt_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::dt_type_name }, msousa@417: { &search_constant_type_c::safedt_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safedt_type_name }, msousa@417: { NULL, NULL, NULL }, msousa@417: }; msousa@417: msousa@417: msousa@417: const struct widen_entry widen_SUB_table[] = { msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name }, msousa@417: { &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name }, msousa@417: { &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name }, msousa@417: msousa@417: { &search_constant_type_c::tod_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::tod_type_name }, msousa@417: { &search_constant_type_c::safetod_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::tod_type_name }, msousa@417: { &search_constant_type_c::tod_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::tod_type_name }, msousa@417: { &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetod_type_name }, msousa@417: { &search_constant_type_c::dt_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::dt_type_name }, msousa@417: { &search_constant_type_c::safedt_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::dt_type_name }, msousa@417: { &search_constant_type_c::dt_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::dt_type_name }, msousa@417: { &search_constant_type_c::safedt_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safedt_type_name }, msousa@417: { &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::safetod_type_name, &search_constant_type_c::tod_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::tod_type_name, &search_constant_type_c::safetod_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::date_type_name, &search_constant_type_c::date_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::safedate_type_name, &search_constant_type_c::date_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::date_type_name, &search_constant_type_c::safedate_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::safedate_type_name, &search_constant_type_c::safedate_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::safedt_type_name, &search_constant_type_c::dt_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::dt_type_name, &search_constant_type_c::safedt_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { NULL, NULL, NULL }, msousa@417: }; msousa@417: msousa@417: const struct widen_entry widen_MUL_table[] = { msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::lreal_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::real_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::dint_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::int_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::sint_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::ulint_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::udint_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::uint_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::usint_type_name, &search_constant_type_c::time_type_name }, msousa@417: msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::lreal_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::real_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::dint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::int_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::sint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::ulint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::udint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::uint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::usint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safelreal_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safereal_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safedint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safeint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safesint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safeulint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safeudint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safeuint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safeusint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: msousa@417: { NULL, NULL, NULL }, msousa@417: }; msousa@417: msousa@417: const struct widen_entry widen_DIV_table[] = { msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::lreal_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::real_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::dint_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::int_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::sint_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::ulint_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::udint_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::uint_type_name, &search_constant_type_c::time_type_name }, msousa@417: { &search_constant_type_c::time_type_name, &search_constant_type_c::usint_type_name, &search_constant_type_c::time_type_name }, msousa@417: msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::lreal_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::real_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::dint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::int_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::sint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::ulint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::udint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::uint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::usint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safelreal_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safereal_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safedint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safeint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safesint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safeulint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safeudint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safeuint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safeusint_type_name, &search_constant_type_c::safetime_type_name }, msousa@417: msousa@417: { NULL, NULL, NULL }, msousa@417: }; msousa@417: msousa@425: /* Search for a datatype inside a candidate_datatypes list. msousa@425: * Returns: position of datatype in the list, or -1 if not found. msousa@417: */ msousa@425: int search_in_datatype_list(symbol_c *datatype, std::vector candidate_datatypes) { msousa@425: for(unsigned int i = 0; i < candidate_datatypes.size(); i++) msousa@425: if (is_type_equal(datatype, candidate_datatypes[i])) msousa@425: return i; msousa@425: /* Not found ! */ msousa@425: return -1; msousa@425: } msousa@425: msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_ELEMENTARY_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: return is_ANY_MAGNITUDE_type(type_symbol) msousa@417: || is_ANY_BIT_type (type_symbol) msousa@417: || is_ANY_STRING_type (type_symbol) msousa@417: || is_ANY_DATE_type (type_symbol); msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_SAFEELEMENTARY_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: return is_ANY_SAFEMAGNITUDE_type(type_symbol) msousa@417: || is_ANY_SAFEBIT_type (type_symbol) msousa@417: || is_ANY_SAFESTRING_type (type_symbol) msousa@417: || is_ANY_SAFEDATE_type (type_symbol); msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_ELEMENTARY_compatible(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: /* NOTE: doing msousa@417: * return is_ANY_SAFEELEMENTARY_type() || is_ANY_ELEMENTARY_type() msousa@417: * is incorrect, as the literals would never be considered compatible... msousa@417: */ msousa@417: return is_ANY_MAGNITUDE_compatible(type_symbol) msousa@417: || is_ANY_BIT_compatible (type_symbol) msousa@417: || is_ANY_STRING_compatible (type_symbol) msousa@417: || is_ANY_DATE_compatible (type_symbol); msousa@417: } msousa@417: msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_MAGNITUDE_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(time_type_name_c)) {return true;} msousa@417: return is_ANY_NUM_type(type_symbol); msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_SAFEMAGNITUDE_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(safetime_type_name_c)) {return true;} msousa@417: return is_ANY_SAFENUM_type(type_symbol); msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_MAGNITUDE_compatible(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (is_ANY_MAGNITUDE_type (type_symbol)) {return true;} msousa@417: if (is_ANY_SAFEMAGNITUDE_type(type_symbol)) {return true;} msousa@417: msousa@417: return is_ANY_NUM_compatible(type_symbol); msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_NUM_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (is_ANY_REAL_type(type_symbol)) {return true;} msousa@417: if (is_ANY_INT_type(type_symbol)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_SAFENUM_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: return is_ANY_SAFEREAL_type(type_symbol) msousa@417: || is_ANY_SAFEINT_type (type_symbol); msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_NUM_compatible(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (is_ANY_REAL_compatible(type_symbol)) {return true;} msousa@417: if (is_ANY_INT_compatible(type_symbol)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_DATE_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(date_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(tod_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(dt_type_name_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_SAFEDATE_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(safedate_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safetod_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safedt_type_name_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_DATE_compatible(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (is_ANY_DATE_type (type_symbol)) {return true;} msousa@417: if (is_ANY_SAFEDATE_type(type_symbol)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_STRING_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(string_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(wstring_type_name_c)) {return true;} msousa@417: // TODO literal_string ??? msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_SAFESTRING_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(safestring_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safewstring_type_name_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_STRING_compatible(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (is_ANY_STRING_type (type_symbol)) {return true;} msousa@417: if (is_ANY_SAFESTRING_type(type_symbol)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_INT_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(sint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(int_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(dint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(lint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(usint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(uint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(udint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(ulint_type_name_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_SAFEINT_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(safesint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safeint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safedint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safelint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safeusint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safeuint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safeudint_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safeulint_type_name_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_INT_compatible(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (is_ANY_INT_type (type_symbol)) {return true;} msousa@417: if (is_ANY_SAFEINT_type(type_symbol)) {return true;} msousa@425: // if (is_literal_integer_type(type_symbol)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_REAL_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(real_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(lreal_type_name_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_SAFEREAL_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(safereal_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safelreal_type_name_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_REAL_compatible(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (is_ANY_REAL_type (type_symbol)) {return true;} msousa@417: if (is_ANY_SAFEREAL_type(type_symbol)) {return true;} msousa@425: // if (is_literal_real_type(type_symbol)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_BIT_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(bool_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(byte_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(word_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(dword_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(lword_type_name_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_SAFEBIT_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(safebool_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safebyte_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safeword_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safedword_type_name_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(safelword_type_name_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_BIT_compatible(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (is_ANY_BIT_type (type_symbol)) {return true;} msousa@417: if (is_ANY_SAFEBIT_type(type_symbol)) {return true;} msousa@425: // if (is_nonneg_literal_integer_type(type_symbol)) {return true;} msousa@425: // if (is_literal_bool_type(type_symbol)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_BOOL_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(bool_type_name_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_SAFEBOOL_type(symbol_c *type_symbol){ msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(safebool_type_name_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_ANY_BOOL_compatible(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (is_BOOL_type (type_symbol)) {return true;} msousa@417: if (is_SAFEBOOL_type(type_symbol)) {return true;} msousa@425: // if (is_literal_bool_type(type_symbol)) {return true;} msousa@425: return false; msousa@425: } msousa@425: msousa@425: msousa@425: msousa@425: #if 0 msousa@417: /* A helper function... */ msousa@417: bool is_literal_integer_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(neg_integer_c)) {return true;} msousa@417: return is_nonneg_literal_integer_type(type_symbol); msousa@417: } msousa@417: msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_nonneg_literal_integer_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(integer_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(binary_integer_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(octal_integer_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(hex_integer_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_literal_real_type(symbol_c *type_symbol) { msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(real_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(neg_real_c)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: msousa@417: /* A helper function... */ msousa@417: bool is_literal_bool_type(symbol_c *type_symbol) { msousa@417: bool_type_name_c bool_t; msousa@417: msousa@417: if (type_symbol == NULL) {return false;} msousa@417: if (typeid(*type_symbol) == typeid(boolean_true_c)) {return true;} msousa@417: if (typeid(*type_symbol) == typeid(boolean_false_c)) {return true;} msousa@417: if (is_nonneg_literal_integer_type(type_symbol)) msousa@417: if (sizeoftype(&bool_t) >= sizeoftype(type_symbol)) {return true;} msousa@417: return false; msousa@417: } msousa@417: msousa@417: /* Determine the common data type between two data types. msousa@417: * If no common data type found, return NULL. msousa@417: * msousa@417: * If data types are identical, return the first (actually any would do...). msousa@417: * If any of the data types is a literal, we confirm that msousa@417: * the literal uses less bits than the fixed size data type. msousa@417: * e.g. BYTE and 1024 returns NULL msousa@417: * BYTE and 255 returns BYTE msousa@417: * msousa@417: * If two literals, then return the literal that requires more bits... msousa@417: */ msousa@417: msousa@417: symbol_c *common_type(symbol_c *first_type, symbol_c *second_type) { msousa@417: if (first_type == NULL && second_type == NULL) {return NULL;} msousa@417: if (first_type == NULL) {return second_type;} msousa@417: if (second_type == NULL) {return first_type;} msousa@417: msousa@417: if (is_literal_integer_type(first_type) && is_literal_integer_type(second_type)) msousa@417: {return ((sizeoftype(first_type) > sizeoftype(second_type))? first_type:second_type);} msousa@417: msousa@417: if (is_literal_real_type(first_type) && is_literal_real_type(second_type)) msousa@417: {return ((sizeoftype(first_type) > sizeoftype(second_type))? first_type:second_type);} msousa@417: msousa@417: if (is_literal_bool_type(first_type) && is_literal_bool_type(second_type)) msousa@417: {return first_type;} msousa@417: msousa@417: /* The following check can only be made after the is_literal_XXXX checks */ msousa@417: /* When two literals of the same type, with identical typeid's are checked, msousa@417: * we must return the one that occupies more bits... This is done above. msousa@417: */ msousa@417: if (typeid(*first_type) == typeid(*second_type)) {return first_type;} msousa@417: msousa@417: /* NOTE Although a BOOL is also an ANY_BIT, we must check it explicitly since some msousa@417: * literal bool values are not literal integers... msousa@417: */ msousa@417: if (is_BOOL_type(first_type) && is_literal_bool_type(second_type)) {return first_type;} msousa@417: if (is_BOOL_type(second_type) && is_literal_bool_type(first_type)) {return second_type;} msousa@417: msousa@417: if (is_SAFEBOOL_type(first_type) && is_literal_bool_type(second_type)) {return first_type;} msousa@417: if (is_SAFEBOOL_type(second_type) && is_literal_bool_type(first_type)) {return second_type;} msousa@417: msousa@417: if (is_SAFEBOOL_type(first_type) && is_BOOL_type(second_type)) {return second_type;} msousa@417: if (is_SAFEBOOL_type(second_type) && is_BOOL_type(first_type)) {return first_type;} msousa@417: msousa@417: if (is_ANY_BIT_type(first_type) && is_nonneg_literal_integer_type(second_type)) msousa@417: {return ((sizeoftype(first_type) >= sizeoftype(second_type))? first_type :NULL);} msousa@417: if (is_ANY_BIT_type(second_type) && is_nonneg_literal_integer_type(first_type)) msousa@417: {return ((sizeoftype(second_type) >= sizeoftype(first_type)) ? second_type:NULL);} msousa@417: msousa@417: if (is_ANY_SAFEBIT_type(first_type) && is_nonneg_literal_integer_type(second_type)) msousa@417: {return ((sizeoftype(first_type) >= sizeoftype(second_type))? first_type :NULL);} msousa@417: if (is_ANY_SAFEBIT_type(second_type) && is_nonneg_literal_integer_type(first_type)) msousa@417: {return ((sizeoftype(second_type) >= sizeoftype(first_type)) ? second_type:NULL);} msousa@417: msousa@417: if (is_ANY_SAFEBIT_type(first_type) && is_ANY_BIT_type(second_type)) msousa@417: {return ((sizeoftype(first_type) == sizeoftype(second_type))? second_type:NULL);} msousa@417: if (is_ANY_SAFEBIT_type(second_type) && is_ANY_BIT_type(first_type)) msousa@417: {return ((sizeoftype(first_type) == sizeoftype(second_type))? first_type :NULL);} msousa@417: msousa@417: if (is_ANY_INT_type(first_type) && is_literal_integer_type(second_type)) msousa@417: {return ((sizeoftype(first_type) >= sizeoftype(second_type))? first_type :NULL);} msousa@417: if (is_ANY_INT_type(second_type) && is_literal_integer_type(first_type)) msousa@417: {return ((sizeoftype(second_type) >= sizeoftype(first_type)) ? second_type:NULL);} msousa@417: msousa@417: if (is_ANY_SAFEINT_type(first_type) && is_literal_integer_type(second_type)) msousa@417: {return ((sizeoftype(first_type) >= sizeoftype(second_type))? first_type :NULL);} msousa@417: if (is_ANY_SAFEINT_type(second_type) && is_literal_integer_type(first_type)) msousa@417: {return ((sizeoftype(second_type) >= sizeoftype(first_type)) ? second_type:NULL);} msousa@417: msousa@417: if (is_ANY_SAFEINT_type(first_type) && is_ANY_INT_type(second_type)) msousa@417: {return ((sizeoftype(first_type) == sizeoftype(second_type))? second_type:NULL);} msousa@417: if (is_ANY_SAFEINT_type(second_type) && is_ANY_INT_type(first_type)) msousa@417: {return ((sizeoftype(first_type) == sizeoftype(second_type))? first_type :NULL);} msousa@417: msousa@417: if (is_ANY_REAL_type(first_type) && is_literal_real_type(second_type)) msousa@417: {return ((sizeoftype(first_type) >= sizeoftype(second_type))? first_type :NULL);} msousa@417: if (is_ANY_REAL_type(second_type) && is_literal_real_type(first_type)) msousa@417: {return ((sizeoftype(second_type) >= sizeoftype(first_type)) ? second_type:NULL);} msousa@417: msousa@417: if (is_ANY_SAFEREAL_type(first_type) && is_literal_real_type(second_type)) msousa@417: {return ((sizeoftype(first_type) >= sizeoftype(second_type))? first_type :NULL);} msousa@417: if (is_ANY_SAFEREAL_type(second_type) && is_literal_real_type(first_type)) msousa@417: {return ((sizeoftype(second_type) >= sizeoftype(first_type)) ? second_type:NULL);} msousa@417: msousa@417: if (is_ANY_SAFEREAL_type(first_type) && is_ANY_REAL_type(second_type)) msousa@417: {return ((sizeoftype(first_type) == sizeoftype(second_type))? second_type:NULL);} msousa@417: if (is_ANY_SAFEREAL_type(second_type) && is_ANY_REAL_type(first_type)) msousa@417: {return ((sizeoftype(first_type) == sizeoftype(second_type))? first_type :NULL);} msousa@417: msousa@417: /* the Time and Date types... */ msousa@417: if (is_type(first_type, safetime_type_name_c) && is_type(second_type, time_type_name_c)) {return second_type;} msousa@417: if (is_type(second_type, safetime_type_name_c) && is_type( first_type, time_type_name_c)) {return first_type;} msousa@417: msousa@417: if (is_type(first_type, safedate_type_name_c) && is_type(second_type, date_type_name_c)) {return second_type;} msousa@417: if (is_type(second_type, safedate_type_name_c) && is_type( first_type, date_type_name_c)) {return first_type;} msousa@417: msousa@417: if (is_type(first_type, safedt_type_name_c) && is_type(second_type, dt_type_name_c)) {return second_type;} msousa@417: if (is_type(second_type, safedt_type_name_c) && is_type( first_type, dt_type_name_c)) {return first_type;} msousa@417: msousa@417: if (is_type(first_type, safetod_type_name_c) && is_type(second_type, tod_type_name_c)) {return second_type;} msousa@417: if (is_type(second_type, safetod_type_name_c) && is_type( first_type, tod_type_name_c)) {return first_type;} msousa@417: msousa@417: /* no common type */ msousa@417: return NULL; msousa@417: } msousa@417: msousa@417: /* Return TRUE if the second (value) data type may be assigned to a variable of the first (variable) data type msousa@417: * such as: msousa@417: * var_type value_type msousa@417: * BOOL BYTE#7 -> returns false msousa@417: * INT INT#7 -> returns true msousa@417: * INT 7 -> returns true msousa@417: * REAL 7.89 -> returns true msousa@417: * REAL 7 -> returns true msousa@417: * INT 7.89 -> returns false msousa@417: * SAFEBOOL BOOL#1 -> returns false !!! msousa@417: * etc... msousa@417: * msousa@417: * NOTE: It is assumed that the var_type is the data type of an lvalue msousa@417: */ msousa@417: bool is_valid_assignment(symbol_c *var_type, symbol_c *value_type) { msousa@417: if (var_type == NULL) {/* STAGE3_ERROR(value_type, value_type, "Var_type == NULL"); */ return false;} msousa@417: if (value_type == NULL) {/* STAGE3_ERROR(var_type, var_type, "Value_type == NULL"); */ return false;} msousa@417: msousa@417: symbol_c *common_type_symbol = common_type(var_type, value_type); msousa@417: if (NULL == common_type_symbol) msousa@417: return false; msousa@417: return (typeid(*var_type) == typeid(*common_type_symbol)); msousa@417: } msousa@417: msousa@417: msousa@417: /* Return TRUE if there is a common data type, otherwise return FALSE msousa@417: * i.e., return TRUE if both data types may be used simultaneously in an expression msousa@417: * such as: msousa@417: * BOOL#0 AND BYTE#7 -> returns false msousa@417: * 0 AND BYTE#7 -> returns true msousa@417: * INT#10 AND INT#7 -> returns true msousa@417: * INT#10 AND 7 -> returns true msousa@417: * REAL#34.3 AND 7.89 -> returns true msousa@417: * REAL#34.3 AND 7 -> returns true msousa@417: * INT#10 AND 7.89 -> returns false msousa@417: * SAFEBOOL#0 AND BOOL#1 -> returns true !!! msousa@417: * etc... msousa@417: */ msousa@417: bool is_compatible_type(symbol_c *first_type, symbol_c *second_type) { msousa@417: if (first_type == NULL || second_type == NULL) {return false;} msousa@417: return (NULL != common_type(first_type, second_type)); msousa@417: } msousa@425: #endif msousa@417: msousa@417: bool is_type_equal(symbol_c *first_type, symbol_c *second_type) msousa@417: { msousa@417: if (first_type == NULL || second_type == NULL) { msousa@417: return false; msousa@417: } msousa@417: if (is_ANY_ELEMENTARY_type(first_type)) { msousa@417: if (typeid(*first_type) == typeid(*second_type)) msousa@417: return true; msousa@417: } else /* ANY_DERIVED */ msousa@417: return (first_type == second_type); msousa@417: msousa@417: return false; msousa@417: }