unsigned long simple_strtoul(const char *cp, char **endp,
unsigned int base)
{
unsigned long result = 0;
unsigned long value;
cp = _parse_integer_fixup_radix(cp, &base);
while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
? toupper(*cp) : *cp)-'A'+10) < base) { // 通过与base比较,非base指定进制将退出while
result = result*base + value;
cp++;
}
if (endp) /* 巧妙的地方,用户自行选择要不要通过指针返回需要的参数 */
*endp = (char *)cp;
return result;
}
/* from lib/kstrtox.c */
static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
{
if (*base == 0) {
if (s[0] == '0') {
if (tolower(s[1]) == 'x' && isxdigit(s[2]))
*base = 16;
else
*base = 8;
} else
*base = 10;
}
if (*base == 16 && s[0] == '0' && tolower(s[1]) == 'x')
s += 2;
return s;
}
u-boot/lib/vsprintf.c中学习的编程技巧总结
最新推荐文章于 2023-05-15 15:22:12 发布