266{
269
270 if (*_number ==
__T(
'\0') || iswspace((wint_t)*_number)) {
271 throw new NumericConvertException(_number, _base, 0);
272 }
273
274 NumericConvertException::Error error = NumericConvertException::NoError;
275 errno = 0;
276 wchar_t* endptr =
NULL;
277 long n = wcstol(_number, &endptr, _base);
278 if (errno == ERANGE) {
279 if (LONG_MIN == n) {
280 error = NumericConvertException::Underflow;
281 }
282 else if (LONG_MAX == n) {
283 error = NumericConvertException::Overflow;
284 }
285#if __WORDSIZE > 32
287 error = NumericConvertException::Underflow;
288 }
290 error = NumericConvertException::Overflow;
291 }
292#endif
293 }
294
295 if (NumericConvertException::NoError != error) {
296 throw new NumericConvertException(
297 error,
298 _number,
299 _base
300 );
301 }
302
303 if ((endptr && *endptr != '\0') || errno == EINVAL) {
304 throw new NumericConvertException(
305 _number,
306 _base,
307 endptr ? (endptr - _number) : 0
308 );
309 }
310
311 return (int32_t)n;
312}