linux/arch/s390/boot/string.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <linux/ctype.h>
   3#include <linux/kernel.h>
   4#include <linux/errno.h>
   5#undef CONFIG_KASAN
   6#include "../lib/string.c"
   7
   8int strncmp(const char *cs, const char *ct, size_t count)
   9{
  10        unsigned char c1, c2;
  11
  12        while (count) {
  13                c1 = *cs++;
  14                c2 = *ct++;
  15                if (c1 != c2)
  16                        return c1 < c2 ? -1 : 1;
  17                if (!c1)
  18                        break;
  19                count--;
  20        }
  21        return 0;
  22}
  23
  24char *skip_spaces(const char *str)
  25{
  26        while (isspace(*str))
  27                ++str;
  28        return (char *)str;
  29}
  30
  31char *strim(char *s)
  32{
  33        size_t size;
  34        char *end;
  35
  36        size = strlen(s);
  37        if (!size)
  38                return s;
  39
  40        end = s + size - 1;
  41        while (end >= s && isspace(*end))
  42                end--;
  43        *(end + 1) = '\0';
  44
  45        return skip_spaces(s);
  46}
  47
  48/* Works only for digits and letters, but small and fast */
  49#define TOLOWER(x) ((x) | 0x20)
  50
  51static unsigned int simple_guess_base(const char *cp)
  52{
  53        if (cp[0] == '0') {
  54                if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))
  55                        return 16;
  56                else
  57                        return 8;
  58        } else {
  59                return 10;
  60        }
  61}
  62
  63/**
  64 * simple_strtoull - convert a string to an unsigned long long
  65 * @cp: The start of the string
  66 * @endp: A pointer to the end of the parsed string will be placed here
  67 * @base: The number base to use
  68 */
  69
  70unsigned long long simple_strtoull(const char *cp, char **endp,
  71                                   unsigned int base)
  72{
  73        unsigned long long result = 0;
  74
  75        if (!base)
  76                base = simple_guess_base(cp);
  77
  78        if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')
  79                cp += 2;
  80
  81        while (isxdigit(*cp)) {
  82                unsigned int value;
  83
  84                value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;
  85                if (value >= base)
  86                        break;
  87                result = result * base + value;
  88                cp++;
  89        }
  90        if (endp)
  91                *endp = (char *)cp;
  92
  93        return result;
  94}
  95
  96long simple_strtol(const char *cp, char **endp, unsigned int base)
  97{
  98        if (*cp == '-')
  99                return -simple_strtoull(cp + 1, endp, base);
 100
 101        return simple_strtoull(cp, endp, base);
 102}
 103
 104int kstrtobool(const char *s, bool *res)
 105{
 106        if (!s)
 107                return -EINVAL;
 108
 109        switch (s[0]) {
 110        case 'y':
 111        case 'Y':
 112        case '1':
 113                *res = true;
 114                return 0;
 115        case 'n':
 116        case 'N':
 117        case '0':
 118                *res = false;
 119                return 0;
 120        case 'o':
 121        case 'O':
 122                switch (s[1]) {
 123                case 'n':
 124                case 'N':
 125                        *res = true;
 126                        return 0;
 127                case 'f':
 128                case 'F':
 129                        *res = false;
 130                        return 0;
 131                default:
 132                        break;
 133                }
 134        default:
 135                break;
 136        }
 137
 138        return -EINVAL;
 139}
 140