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; }
long long strtoll(const char *nptr, char **endptr, int base) { unsigned long long accum = 0; bool negate = false; if (nptr) { /* Skip leading spaces */ lib_skipspace(&nptr); /* Check for leading + or - */ if (*nptr == '-') { negate = true; nptr++; } else if (*nptr == '+') { nptr++; } /* Get the unsigned value */ accum = strtoull(nptr, endptr, base); /* Correct the sign of the result */ if (negate) { return -(long long)accum; } } return (long long)accum; }