162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * stdlib functions 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Author: Scott Wood <scottwood@freescale.com> 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (c) 2007 Freescale Semiconductor, Inc. 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "stdlib.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* Not currently supported: leading whitespace, sign, 0x prefix, zero base */ 1362306a36Sopenharmony_ciunsigned long long int strtoull(const char *ptr, char **end, int base) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci unsigned long long ret = 0; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci if (base > 36) 1862306a36Sopenharmony_ci goto out; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci while (*ptr) { 2162306a36Sopenharmony_ci int digit; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci if (*ptr >= '0' && *ptr <= '9' && *ptr < '0' + base) 2462306a36Sopenharmony_ci digit = *ptr - '0'; 2562306a36Sopenharmony_ci else if (*ptr >= 'A' && *ptr < 'A' + base - 10) 2662306a36Sopenharmony_ci digit = *ptr - 'A' + 10; 2762306a36Sopenharmony_ci else if (*ptr >= 'a' && *ptr < 'a' + base - 10) 2862306a36Sopenharmony_ci digit = *ptr - 'a' + 10; 2962306a36Sopenharmony_ci else 3062306a36Sopenharmony_ci break; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci ret *= base; 3362306a36Sopenharmony_ci ret += digit; 3462306a36Sopenharmony_ci ptr++; 3562306a36Sopenharmony_ci } 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ciout: 3862306a36Sopenharmony_ci if (end) 3962306a36Sopenharmony_ci *end = (char *)ptr; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci return ret; 4262306a36Sopenharmony_ci} 43