1fc0e2087SCollin L. Walling /*
2fc0e2087SCollin L. Walling * libc-style definitions and functions
3fc0e2087SCollin L. Walling *
4fc0e2087SCollin L. Walling * Copyright 2018 IBM Corp.
5fc0e2087SCollin L. Walling * Author(s): Collin L. Walling <walling@linux.vnet.ibm.com>
6fc0e2087SCollin L. Walling *
7fc0e2087SCollin L. Walling * This code is free software; you can redistribute it and/or modify it
8fc0e2087SCollin L. Walling * under the terms of the GNU General Public License as published by the
9fc0e2087SCollin L. Walling * Free Software Foundation; either version 2 of the License, or (at your
10fc0e2087SCollin L. Walling * option) any later version.
11fc0e2087SCollin L. Walling */
12fc0e2087SCollin L. Walling
13fc0e2087SCollin L. Walling #include "libc.h"
14fc0e2087SCollin L. Walling #include "s390-ccw.h"
15fc0e2087SCollin L. Walling
16fc0e2087SCollin L. Walling /**
17fc0e2087SCollin L. Walling * atoui:
18fc0e2087SCollin L. Walling * @str: the string to be converted.
19fc0e2087SCollin L. Walling *
20fc0e2087SCollin L. Walling * Given a string @str, convert it to an integer. Leading spaces are
21fc0e2087SCollin L. Walling * ignored. Any other non-numerical value will terminate the conversion
22fc0e2087SCollin L. Walling * and return 0. This function only handles numbers between 0 and
23fc0e2087SCollin L. Walling * UINT64_MAX inclusive.
24fc0e2087SCollin L. Walling *
25fc0e2087SCollin L. Walling * Returns: an integer converted from the string @str, or the number 0
26fc0e2087SCollin L. Walling * if an error occurred.
27fc0e2087SCollin L. Walling */
atoui(const char * str)28fc0e2087SCollin L. Walling uint64_t atoui(const char *str)
29fc0e2087SCollin L. Walling {
30fc0e2087SCollin L. Walling int val = 0;
31fc0e2087SCollin L. Walling
32fc0e2087SCollin L. Walling if (!str || !str[0]) {
33fc0e2087SCollin L. Walling return 0;
34fc0e2087SCollin L. Walling }
35fc0e2087SCollin L. Walling
36fc0e2087SCollin L. Walling while (*str == ' ') {
37fc0e2087SCollin L. Walling str++;
38fc0e2087SCollin L. Walling }
39fc0e2087SCollin L. Walling
40fc0e2087SCollin L. Walling while (*str) {
41*d796588bSMarkus Armbruster if (!isdigit(*(unsigned char *)str)) {
42fc0e2087SCollin L. Walling break;
43fc0e2087SCollin L. Walling }
44fc0e2087SCollin L. Walling val = val * 10 + *str - '0';
45fc0e2087SCollin L. Walling str++;
46fc0e2087SCollin L. Walling }
47fc0e2087SCollin L. Walling
48fc0e2087SCollin L. Walling return val;
49fc0e2087SCollin L. Walling }
50fc0e2087SCollin L. Walling
51fc0e2087SCollin L. Walling /**
52fc0e2087SCollin L. Walling * uitoa:
53fc0e2087SCollin L. Walling * @num: an integer (base 10) to be converted.
54fc0e2087SCollin L. Walling * @str: a pointer to a string to store the conversion.
55fc0e2087SCollin L. Walling * @len: the length of the passed string.
56fc0e2087SCollin L. Walling *
57fc0e2087SCollin L. Walling * Given an integer @num, convert it to a string. The string @str must be
58fc0e2087SCollin L. Walling * allocated beforehand. The resulting string will be null terminated and
59fc0e2087SCollin L. Walling * returned. This function only handles numbers between 0 and UINT64_MAX
60fc0e2087SCollin L. Walling * inclusive.
61fc0e2087SCollin L. Walling *
62fc0e2087SCollin L. Walling * Returns: the string @str of the converted integer @num
63fc0e2087SCollin L. Walling */
uitoa(uint64_t num,char * str,size_t len)64fc0e2087SCollin L. Walling char *uitoa(uint64_t num, char *str, size_t len)
65fc0e2087SCollin L. Walling {
66e4f86962SThomas Huth long num_idx = 1; /* account for NUL */
67fc0e2087SCollin L. Walling uint64_t tmp = num;
68fc0e2087SCollin L. Walling
69fc0e2087SCollin L. Walling IPL_assert(str != NULL, "uitoa: no space allocated to store string");
70fc0e2087SCollin L. Walling
71fc0e2087SCollin L. Walling /* Count indices of num */
72fc0e2087SCollin L. Walling while ((tmp /= 10) != 0) {
73fc0e2087SCollin L. Walling num_idx++;
74fc0e2087SCollin L. Walling }
75fc0e2087SCollin L. Walling
76fc0e2087SCollin L. Walling /* Check if we have enough space for num and NUL */
77fc0e2087SCollin L. Walling IPL_assert(len > num_idx, "uitoa: array too small for conversion");
78fc0e2087SCollin L. Walling
79fc0e2087SCollin L. Walling str[num_idx--] = '\0';
80fc0e2087SCollin L. Walling
81fc0e2087SCollin L. Walling /* Convert int to string */
82fc0e2087SCollin L. Walling while (num_idx >= 0) {
83fc0e2087SCollin L. Walling str[num_idx--] = num % 10 + '0';
84fc0e2087SCollin L. Walling num /= 10;
85fc0e2087SCollin L. Walling }
86fc0e2087SCollin L. Walling
87fc0e2087SCollin L. Walling return str;
88fc0e2087SCollin L. Walling }
89