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++) |