# HG changeset patch # User Manuele Conti # Date 1339533129 -7200 # Node ID 1ecf916cc397d6f160e16839f04ca0b61adf38f2 # Parent b602f0459f176877683a965b27269244c3f900ce Fix extract_integer_value. Now we handle signed and unsigned in different mode. (Thanks to Andreas) diff -r b602f0459f17 -r 1ecf916cc397 absyntax_utils/absyntax_utils.cc --- a/absyntax_utils/absyntax_utils.cc Tue Jun 12 17:15:24 2012 +0100 +++ b/absyntax_utils/absyntax_utils.cc Tue Jun 12 22:32:09 2012 +0200 @@ -99,21 +99,51 @@ /* extract the value of an integer from an integer_c object !! */ /* NOTE: it must ignore underscores! */ -long long extract_integer_value(symbol_c *sym) { +int64_t extract_int64_value(symbol_c *sym, bool *overflow) { std::string str = ""; integer_c *integer; neg_integer_c * neg_integer; + char *endptr; + int64_t ret; if ((neg_integer = dynamic_cast(sym)) != NULL) - return - extract_integer_value(neg_integer->exp); - + return - extract_int64_value(neg_integer->exp, overflow); + if ((integer = dynamic_cast(sym)) == NULL) ERROR; for(unsigned int i = 0; i < strlen(integer->value); i++) if (integer->value[i] != '_') str += integer->value[i]; - /* return atoi(str.c_str()); */ - return atoll(str.c_str()); + errno = 0; + ret = strtoll(str.c_str(), &endptr, 10); + if (overflow != NULL) + *overflow = (errno == ERANGE); + if ((errno != 0) && (errno != ERANGE)) + ERROR; + + return ret; +} + +uint64_t extract_uint64_value(symbol_c *sym, bool *overflow) { + std::string str = ""; + integer_c *integer; + neg_integer_c * neg_integer; + char *endptr; + uint64_t ret; + + if ((integer = dynamic_cast(sym)) == NULL) ERROR; + + for(unsigned int i = 0; i < strlen(integer->value); i++) + if (integer->value[i] != '_') str += integer->value[i]; + + errno = 0; + ret = strtoull(str.c_str(), &endptr, 10); + if (overflow != NULL) + *overflow = (errno == ERANGE); + if ((errno != 0) && (errno != ERANGE)) + ERROR; + + return ret; } @@ -153,9 +183,8 @@ * exponent [Ee]([+-]?){integer} * integer {digit}((_?{digit})*) */ -real64_t extract_real_value(symbol_c *sym, bool *overflow = NULL) { +real64_t extract_real_value(symbol_c *sym, bool *overflow) { std::string str = ""; - char *endptr; real_c * real_sym; real64_t ret; diff -r b602f0459f17 -r 1ecf916cc397 absyntax_utils/absyntax_utils.hh --- a/absyntax_utils/absyntax_utils.hh Tue Jun 12 17:15:24 2012 +0100 +++ b/absyntax_utils/absyntax_utils.hh Tue Jun 12 22:32:09 2012 +0200 @@ -56,9 +56,10 @@ int compare_identifiers(symbol_c *ident1, symbol_c *ident2); /* extract the value of an integer/hex_integer/real from an integer_c/hex_integer_c/real_c symbol !! */ -long long extract_integer_value(symbol_c *sym); +int64_t extract_int64_value (symbol_c *sym, bool *overflow = NULL); +int64_t extract_uint64_value (symbol_c *sym, bool *overflow = NULL); uint64_t extract_hex_value (symbol_c *sym); -real64_t extract_real_value (symbol_c *sym, bool *overflow); +real64_t extract_real_value (symbol_c *sym, bool *overflow = NULL); /* A symbol table with all globally declared functions... */ extern function_declaration_c null_symbol1; diff -r b602f0459f17 -r 1ecf916cc397 absyntax_utils/function_param_iterator.cc --- a/absyntax_utils/function_param_iterator.cc Tue Jun 12 17:15:24 2012 +0100 +++ b/absyntax_utils/function_param_iterator.cc Tue Jun 12 22:32:09 2012 +0200 @@ -130,7 +130,7 @@ if (extensible_parameter != NULL) { sym = extensible_parameter->var_name; current_param_is_extensible = true; - _first_extensible_param_index = extract_integer_value(extensible_parameter->first_index); + _first_extensible_param_index = extract_int64_value(extensible_parameter->first_index); } identifier_c *variable_name = dynamic_cast(sym); if (variable_name == NULL) ERROR; @@ -167,7 +167,7 @@ if (extensible_parameter != NULL) { var_name = extensible_parameter->var_name; current_param_is_extensible = true; - _first_extensible_param_index = extract_integer_value(extensible_parameter->first_index); + _first_extensible_param_index = extract_int64_value(extensible_parameter->first_index); } identifier_c *variable_name = dynamic_cast(var_name); if (variable_name == NULL) ERROR; @@ -265,7 +265,7 @@ if (extensible_parameter != NULL) { sym = extensible_parameter->var_name; current_param_is_extensible = true; - _first_extensible_param_index = extract_integer_value(extensible_parameter->first_index); + _first_extensible_param_index = extract_int64_value(extensible_parameter->first_index); current_extensible_param_index = _first_extensible_param_index; } identifier = dynamic_cast(sym); diff -r b602f0459f17 -r 1ecf916cc397 stage3/constant_folding.cc --- a/stage3/constant_folding.cc Tue Jun 12 17:15:24 2012 +0100 +++ b/stage3/constant_folding.cc Tue Jun 12 22:32:09 2012 +0200 @@ -431,8 +431,9 @@ void *constant_folding_c::visit(integer_c *symbol) { - NEW_CVALUE( int64, symbol); SET_CVALUE( int64, symbol, extract_integer_value(symbol)); - NEW_CVALUE(uint64, symbol); SET_CVALUE(uint64, symbol, extract_integer_value(symbol)); + bool overflow; + NEW_CVALUE( int64, symbol); SET_CVALUE( int64, symbol, extract_int64_value(symbol, &overflow)); + NEW_CVALUE(uint64, symbol); SET_CVALUE(uint64, symbol, extract_uint64_value(symbol, &overflow)); return NULL; } diff -r b602f0459f17 -r 1ecf916cc397 stage4/generate_c/generate_c.cc --- a/stage4/generate_c/generate_c.cc Tue Jun 12 17:15:24 2012 +0100 +++ b/stage4/generate_c/generate_c.cc Tue Jun 12 22:32:09 2012 +0200 @@ -782,7 +782,7 @@ /* signed_integer DOTDOT signed_integer */ //SYM_REF2(subrange_c, lower_limit, upper_limit) void *visit(subrange_c *symbol) { - int dimension = extract_integer_value(symbol->upper_limit) - extract_integer_value(symbol->lower_limit) + 1; + int dimension = extract_int64_value(symbol->upper_limit) - extract_int64_value(symbol->lower_limit) + 1; switch (current_mode) { case arrayname_im: current_array_name += "_"; diff -r b602f0459f17 -r 1ecf916cc397 stage4/generate_c/generate_c_typedecl.cc --- a/stage4/generate_c/generate_c_typedecl.cc Tue Jun 12 17:15:24 2012 +0100 +++ b/stage4/generate_c/generate_c_typedecl.cc Tue Jun 12 22:32:09 2012 +0200 @@ -255,7 +255,7 @@ case array_td: if (current_basetypedeclaration == arraysubrange_bd) { s4o_incl.print("["); - dimension = extract_integer_value(symbol->upper_limit) - extract_integer_value(symbol->lower_limit) + 1; + dimension = extract_int64_value(symbol->upper_limit) - extract_int64_value(symbol->lower_limit) + 1; print_integer_incl(dimension); s4o_incl.print("]"); } diff -r b602f0459f17 -r 1ecf916cc397 stage4/generate_c/generate_c_vardecl.cc --- a/stage4/generate_c/generate_c_vardecl.cc Tue Jun 12 17:15:24 2012 +0100 +++ b/stage4/generate_c/generate_c_vardecl.cc Tue Jun 12 22:32:09 2012 +0200 @@ -211,7 +211,7 @@ /* signed_integer DOTDOT signed_integer */ //SYM_REF2(subrange_c, lower_limit, upper_limit) void *visit(subrange_c *symbol) { - int dimension = extract_integer_value(symbol->upper_limit) - extract_integer_value(symbol->lower_limit) + 1; + int dimension = extract_int64_value(symbol->upper_limit) - extract_int64_value(symbol->lower_limit) + 1; switch (current_mode) { case arraysize_am: array_size *= dimension; @@ -264,7 +264,7 @@ switch (current_mode) { case initializationvalue_am: - initial_element_number = extract_integer_value(symbol->integer); + initial_element_number = extract_int64_value(symbol->integer); if (current_initialization_count < defined_values_count) { int temp_element_number = 0; int diff = defined_values_count - current_initialization_count; @@ -1407,7 +1407,7 @@ /* signed_integer DOTDOT signed_integer */ //SYM_REF2(subrange_c, lower_limit, upper_limit) void *visit(subrange_c *symbol) { - long long dimension = extract_integer_value(symbol->upper_limit) - extract_integer_value(symbol->lower_limit) + 1; + long long dimension = extract_int64_value(symbol->upper_limit) - extract_int64_value(symbol->lower_limit) + 1; s4o.print("_"); print_integer(dimension); return NULL;