/* * libc-style definitions and functions * * Copyright 2018 IBM Corp. * Author(s): Collin L. Walling * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. */ #include "libc.h" #include "s390-ccw.h" /** * atoui: * @str: the string to be converted. * * Given a string @str, convert it to an integer. Leading spaces are * ignored. Any other non-numerical value will terminate the conversion * and return 0. This function only handles numbers between 0 and * UINT64_MAX inclusive. * * Returns: an integer converted from the string @str, or the number 0 * if an error occurred. */ uint64_t atoui(const char *str) { int val = 0; if (!str || !str[0]) { return 0; } while (*str == ' ') { str++; } while (*str) { if (!isdigit(*str)) { break; } val = val * 10 + *str - '0'; str++; } return val; } /** * uitoa: * @num: an integer (base 10) to be converted. * @str: a pointer to a string to store the conversion. * @len: the length of the passed string. * * Given an integer @num, convert it to a string. The string @str must be * allocated beforehand. The resulting string will be null terminated and * returned. This function only handles numbers between 0 and UINT64_MAX * inclusive. * * Returns: the string @str of the converted integer @num */ char *uitoa(uint64_t num, char *str, size_t len) { long num_idx = 1; /* account for NUL */ uint64_t tmp = num; IPL_assert(str != NULL, "uitoa: no space allocated to store string"); /* Count indices of num */ while ((tmp /= 10) != 0) { num_idx++; } /* Check if we have enough space for num and NUL */ IPL_assert(len > num_idx, "uitoa: array too small for conversion"); str[num_idx--] = '\0'; /* Convert int to string */ while (num_idx >= 0) { str[num_idx--] = num % 10 + '0'; num /= 10; } return str; }