absyntax_utils/absyntax_utils.cc
changeset 587 1ecf916cc397
parent 576 8368ec909825
child 589 de4c2a058767
--- 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<neg_integer_c *>(sym)) != NULL)
-    return - extract_integer_value(neg_integer->exp);
-  
+    return - extract_int64_value(neg_integer->exp, overflow);
+
   if ((integer = dynamic_cast<integer_c *>(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<integer_c *>(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;