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 */ 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) { 41fc0e2087SCollin L. Walling if (!isdigit(*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 */ 64fc0e2087SCollin L. Walling char *uitoa(uint64_t num, char *str, size_t len) 65fc0e2087SCollin L. Walling { 66*e4f86962SThomas 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