xref: /linux-6.15/arch/powerpc/boot/stdlib.c (revision 9de78277)
1*9de78277SScott Wood /*
2*9de78277SScott Wood  * stdlib functions
3*9de78277SScott Wood  *
4*9de78277SScott Wood  * Author: Scott Wood <[email protected]>
5*9de78277SScott Wood  *
6*9de78277SScott Wood  * Copyright (c) 2007 Freescale Semiconductor, Inc.
7*9de78277SScott Wood  *
8*9de78277SScott Wood  * This program is free software; you can redistribute it and/or modify it
9*9de78277SScott Wood  * under the terms of the GNU General Public License version 2 as published
10*9de78277SScott Wood  * by the Free Software Foundation.
11*9de78277SScott Wood  */
12*9de78277SScott Wood 
13*9de78277SScott Wood #include "stdlib.h"
14*9de78277SScott Wood 
15*9de78277SScott Wood /* Not currently supported: leading whitespace, sign, 0x prefix, zero base */
16*9de78277SScott Wood unsigned long long int strtoull(const char *ptr, char **end, int base)
17*9de78277SScott Wood {
18*9de78277SScott Wood 	unsigned long long ret = 0;
19*9de78277SScott Wood 
20*9de78277SScott Wood 	if (base > 36)
21*9de78277SScott Wood 		goto out;
22*9de78277SScott Wood 
23*9de78277SScott Wood 	while (*ptr) {
24*9de78277SScott Wood 		int digit;
25*9de78277SScott Wood 
26*9de78277SScott Wood 		if (*ptr >= '0' && *ptr <= '9' && *ptr < '0' + base)
27*9de78277SScott Wood 			digit = *ptr - '0';
28*9de78277SScott Wood 		else if (*ptr >= 'A' && *ptr < 'A' + base - 10)
29*9de78277SScott Wood 			digit = *ptr - 'A' + 10;
30*9de78277SScott Wood 		else if (*ptr >= 'a' && *ptr < 'a' + base - 10)
31*9de78277SScott Wood 			digit = *ptr - 'a' + 10;
32*9de78277SScott Wood 		else
33*9de78277SScott Wood 			break;
34*9de78277SScott Wood 
35*9de78277SScott Wood 		ret *= base;
36*9de78277SScott Wood 		ret += digit;
37*9de78277SScott Wood 		ptr++;
38*9de78277SScott Wood 	}
39*9de78277SScott Wood 
40*9de78277SScott Wood out:
41*9de78277SScott Wood 	if (end)
42*9de78277SScott Wood 		*end = (char *)ptr;
43*9de78277SScott Wood 
44*9de78277SScott Wood 	return ret;
45*9de78277SScott Wood }
46