diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/stdlib.C | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/src/lib/stdlib.C b/src/lib/stdlib.C index a7c694f9d..2688959bd 100644 --- a/src/lib/stdlib.C +++ b/src/lib/stdlib.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2010,2018 */ +/* Contributors Listed Below - COPYRIGHT 2010,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -161,3 +161,41 @@ void* calloc(size_t num, size_t size) return mem; } +uint64_t strtoul(const char *nptr, char **endptr, int base) +{ + uint64_t l_data = 0; + size_t i = 0; + while( nptr[i] != '\0' ) + { + uint64_t l_nib = 0; + switch(nptr[i]) + { + // handle leading '0x' or 'x' + case('x'): case('X'): + l_data = 0; + break; + case('0'): l_nib = 0; break; + case('1'): l_nib = 1; break; + case('2'): l_nib = 2; break; + case('3'): l_nib = 3; break; + case('4'): l_nib = 4; break; + case('5'): l_nib = 5; break; + case('6'): l_nib = 6; break; + case('7'): l_nib = 7; break; + case('8'): l_nib = 8; break; + case('9'): l_nib = 9; break; + case('A'): case('a'): l_nib = 0xA; break; + case('B'): case('b'): l_nib = 0xB; break; + case('C'): case('c'): l_nib = 0xC; break; + case('D'): case('d'): l_nib = 0xD; break; + case('E'): case('e'): l_nib = 0xE; break; + case('F'): case('f'): l_nib = 0xF; break; + default: + return 0ULL; + } + l_data <<= 4; + l_data |= l_nib; + i++; + } + return l_data; +} |