2018-02-23 16:43:10 +01:00
|
|
|
/*
|
|
|
|
* libc-style definitions and functions
|
|
|
|
*
|
|
|
|
* Copyright 2018 IBM Corp.
|
|
|
|
* Author(s): Collin L. Walling <walling@linux.vnet.ibm.com>
|
|
|
|
*
|
|
|
|
* 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) {
|
2019-04-18 16:53:54 +02:00
|
|
|
if (!isdigit(*(unsigned char *)str)) {
|
2018-02-23 16:43:10 +01:00
|
|
|
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)
|
|
|
|
{
|
2018-04-13 16:22:13 +02:00
|
|
|
long num_idx = 1; /* account for NUL */
|
2018-02-23 16:43:10 +01:00
|
|
|
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;
|
|
|
|
}
|