393{
396
397 if (*_number ==
__T(
'\0') || iswspace((wint_t)*_number)) {
398 throw new NumericConvertException(_number, _base, 0);
399 }
400
401 NumericConvertException::Error error = NumericConvertException::NoError;
402 errno = 0;
403 wchar_t* endptr =
NULL;
404 unsigned long n = wcstoul(_number, &endptr, _base);
405 if (errno == ERANGE) {
406 if (ULONG_MAX == n) {
407 error = NumericConvertException::Overflow;
408 }
409#if __WORDSIZE > 32
411 error = NumericConvertException::Overflow;
412 }
413#endif
414 }
415
416 if (NumericConvertException::NoError != error) {
417 throw new NumericConvertException(
418 error,
419 _number,
420 _base
421 );
422 }
423
424 if ((endptr && *endptr != '\0') || errno == EINVAL) {
425 throw new NumericConvertException(
426 _number,
427 _base,
428 endptr ? (endptr - _number) : 0
429 );
430 }
431
432 return (uint32_t) n;
433}