qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

libc.c (2193B)


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