qemu/pc-bios/s390-ccw/libc.c
<<
>>
Prefs
   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 */
  28uint64_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 */
  64char *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}
  89