xref: /openbmc/qemu/pc-bios/s390-ccw/libc.c (revision a4f667b6)
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