unsigned long long strtoull(FAR const char *nptr, FAR char **endptr, int base) { unsigned long long accum = 0; int value; if (nptr) { /* Skip leading spaces */ lib_skipspace(&nptr); /* Check for unspecified base */ base = lib_checkbase(base, &nptr); /* Accumulate each "digit" */ while (lib_isbasedigit(*nptr, base, &value)) { accum = accum*base + value; nptr++; } /* Return the final pointer to the unused value */ if (endptr) { *endptr = (char *)nptr; } } return accum; }
unsigned long long strtoull(const char *nptr, char **endptr, int base) { unsigned long long prev, accum = 0; int value; if (nptr) { /* Skip leading spaces */ lib_skipspace(&nptr); /* Check for unspecified base */ base = lib_checkbase(base, &nptr); if (base < 0) { set_errno(EINVAL); return 0; } /* Accumulate each "digit" */ while (lib_isbasedigit(*nptr, base, &value)) { prev = accum; accum = accum * base + value; nptr++; /* Check for overflow */ if (accum < prev) { set_errno(ERANGE); accum = 0; break; } } /* Return the final pointer to the unused value */ if (endptr) { *endptr = (char *)nptr; } } return accum; }