Return the value of a decimal exponent of the form [+-]ddddddd. If the exponent overflows, returns a large exponent with the appropriate sign. */
| 237 | If the exponent overflows, returns a large exponent with the |
| 238 | appropriate sign. */ |
| 239 | static Expected<int> readExponent(StringRef::iterator begin, |
| 240 | StringRef::iterator end) { |
| 241 | bool isNegative; |
| 242 | unsigned int absExponent; |
| 243 | const unsigned int overlargeExponent = 24000; /* FIXME. */ |
| 244 | StringRef::iterator p = begin; |
| 245 | |
| 246 | // Treat no exponent as 0 to match binutils |
| 247 | if (p == end || ((*p == '-' || *p == '+') && (p + 1) == end)) { |
| 248 | return 0; |
| 249 | } |
| 250 | |
| 251 | isNegative = (*p == '-'); |
| 252 | if (*p == '-' || *p == '+') { |
| 253 | p++; |
| 254 | if (p == end) |
| 255 | return createError("Exponent has no digits"); |
| 256 | } |
| 257 | |
| 258 | absExponent = decDigitValue(*p++); |
| 259 | if (absExponent >= 10U) |
| 260 | return createError("Invalid character in exponent"); |
| 261 | |
| 262 | for (; p != end; ++p) { |
| 263 | unsigned int value; |
| 264 | |
| 265 | value = decDigitValue(*p); |
| 266 | if (value >= 10U) |
| 267 | return createError("Invalid character in exponent"); |
| 268 | |
| 269 | absExponent = absExponent * 10U + value; |
| 270 | if (absExponent >= overlargeExponent) { |
| 271 | absExponent = overlargeExponent; |
| 272 | break; |
| 273 | } |
| 274 | } |
| 275 | |
| 276 | if (isNegative) |
| 277 | return -(int) absExponent; |
| 278 | else |
| 279 | return (int) absExponent; |
| 280 | } |
| 281 | |
| 282 | /* This is ugly and needs cleaning up, but I don't immediately see |
| 283 | how whilst remaining safe. */ |
no test coverage detected