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;