absyntax_utils/absyntax_utils.cc
changeset 587 1ecf916cc397
parent 576 8368ec909825
child 589 de4c2a058767
equal deleted inserted replaced
586:b602f0459f17 587:1ecf916cc397
    97 }
    97 }
    98 
    98 
    99 
    99 
   100 /* extract the value of an integer from an integer_c object !! */
   100 /* extract the value of an integer from an integer_c object !! */
   101 /* NOTE: it must ignore underscores! */
   101 /* NOTE: it must ignore underscores! */
   102 long long extract_integer_value(symbol_c *sym) {
   102 int64_t extract_int64_value(symbol_c *sym, bool *overflow) {
   103   std::string str = "";
   103   std::string str = "";
   104   integer_c *integer;
   104   integer_c *integer;
   105   neg_integer_c * neg_integer;
   105   neg_integer_c * neg_integer;
       
   106   char *endptr;
       
   107   int64_t ret;
   106 
   108 
   107   if ((neg_integer = dynamic_cast<neg_integer_c *>(sym)) != NULL)
   109   if ((neg_integer = dynamic_cast<neg_integer_c *>(sym)) != NULL)
   108     return - extract_integer_value(neg_integer->exp);
   110     return - extract_int64_value(neg_integer->exp, overflow);
   109   
   111 
   110   if ((integer = dynamic_cast<integer_c *>(sym)) == NULL) ERROR;
   112   if ((integer = dynamic_cast<integer_c *>(sym)) == NULL) ERROR;
   111 
   113 
   112   for(unsigned int i = 0; i < strlen(integer->value); i++)
   114   for(unsigned int i = 0; i < strlen(integer->value); i++)
   113     if (integer->value[i] != '_')  str += integer->value[i];
   115     if (integer->value[i] != '_')  str += integer->value[i];
   114 
   116 
   115   /* return atoi(str.c_str()); */
   117   errno = 0;
   116   return atoll(str.c_str());
   118   ret = strtoll(str.c_str(), &endptr, 10);
       
   119   if (overflow != NULL)
       
   120     *overflow = (errno == ERANGE);
       
   121   if ((errno != 0) && (errno != ERANGE))
       
   122     ERROR;
       
   123 
       
   124   return ret;
       
   125 }
       
   126 
       
   127 uint64_t extract_uint64_value(symbol_c *sym, bool *overflow) {
       
   128   std::string str = "";
       
   129   integer_c *integer;
       
   130   neg_integer_c * neg_integer;
       
   131   char *endptr;
       
   132   uint64_t ret;
       
   133   
       
   134   if ((integer = dynamic_cast<integer_c *>(sym)) == NULL) ERROR;
       
   135 
       
   136   for(unsigned int i = 0; i < strlen(integer->value); i++)
       
   137     if (integer->value[i] != '_')  str += integer->value[i];
       
   138 
       
   139   errno = 0;
       
   140   ret = strtoull(str.c_str(), &endptr, 10);
       
   141   if (overflow != NULL)
       
   142     *overflow = (errno == ERANGE);
       
   143   if ((errno != 0) && (errno != ERANGE))
       
   144     ERROR;
       
   145 
       
   146   return ret;
   117 }
   147 }
   118 
   148 
   119 
   149 
   120 /* extract the value of an hex integer from an hex_integer_c object !! */
   150 /* extract the value of an hex integer from an hex_integer_c object !! */
   121 /* NOTE: it must ignore underscores! */
   151 /* NOTE: it must ignore underscores! */
   151  * real		{integer}\.{integer}{exponent}
   181  * real		{integer}\.{integer}{exponent}
   152  * fixed_point		{integer}\.{integer}
   182  * fixed_point		{integer}\.{integer}
   153  * exponent        [Ee]([+-]?){integer}
   183  * exponent        [Ee]([+-]?){integer}
   154  * integer         {digit}((_?{digit})*)
   184  * integer         {digit}((_?{digit})*)
   155  */
   185  */
   156 real64_t extract_real_value(symbol_c *sym, bool *overflow = NULL) {
   186 real64_t extract_real_value(symbol_c *sym, bool *overflow) {
   157   std::string str = "";
   187   std::string str = "";
   158   char *endptr;
       
   159   real_c * real_sym;
   188   real_c * real_sym;
   160   real64_t ret;
   189   real64_t ret;
   161 
   190 
   162   if ((real_sym = dynamic_cast<real_c *>(sym)) == NULL) ERROR;
   191   if ((real_sym = dynamic_cast<real_c *>(sym)) == NULL) ERROR;
   163   for(unsigned int i = 0; i < strlen(real_sym->value); i++)
   192   for(unsigned int i = 0; i < strlen(real_sym->value); i++)