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