linux/arch/x86/boot/string.c
<<
>>
Prefs
   1/* -*- linux-c -*- ------------------------------------------------------- *
   2 *
   3 *   Copyright (C) 1991, 1992 Linus Torvalds
   4 *   Copyright 2007 rPath, Inc. - All Rights Reserved
   5 *
   6 *   This file is part of the Linux kernel, and is made available under
   7 *   the terms of the GNU General Public License version 2.
   8 *
   9 * ----------------------------------------------------------------------- */
  10
  11/*
  12 * Very basic string functions
  13 */
  14
  15#include "boot.h"
  16
  17int strcmp(const char *str1, const char *str2)
  18{
  19        const unsigned char *s1 = (const unsigned char *)str1;
  20        const unsigned char *s2 = (const unsigned char *)str2;
  21        int delta = 0;
  22
  23        while (*s1 || *s2) {
  24                delta = *s2 - *s1;
  25                if (delta)
  26                        return delta;
  27                s1++;
  28                s2++;
  29        }
  30        return 0;
  31}
  32
  33int strncmp(const char *cs, const char *ct, size_t count)
  34{
  35        unsigned char c1, c2;
  36
  37        while (count) {
  38                c1 = *cs++;
  39                c2 = *ct++;
  40                if (c1 != c2)
  41                        return c1 < c2 ? -1 : 1;
  42                if (!c1)
  43                        break;
  44                count--;
  45        }
  46        return 0;
  47}
  48
  49size_t strnlen(const char *s, size_t maxlen)
  50{
  51        const char *es = s;
  52        while (*es && maxlen) {
  53                es++;
  54                maxlen--;
  55        }
  56
  57        return (es - s);
  58}
  59
  60unsigned int atou(const char *s)
  61{
  62        unsigned int i = 0;
  63        while (isdigit(*s))
  64                i = i * 10 + (*s++ - '0');
  65        return i;
  66}
  67
  68/* Works only for digits and letters, but small and fast */
  69#define TOLOWER(x) ((x) | 0x20)
  70
  71static unsigned int simple_guess_base(const char *cp)
  72{
  73        if (cp[0] == '0') {
  74                if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))
  75                        return 16;
  76                else
  77                        return 8;
  78        } else {
  79                return 10;
  80        }
  81}
  82
  83/**
  84 * simple_strtoull - convert a string to an unsigned long long
  85 * @cp: The start of the string
  86 * @endp: A pointer to the end of the parsed string will be placed here
  87 * @base: The number base to use
  88 */
  89
  90unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
  91{
  92        unsigned long long result = 0;
  93
  94        if (!base)
  95                base = simple_guess_base(cp);
  96
  97        if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')
  98                cp += 2;
  99
 100        while (isxdigit(*cp)) {
 101                unsigned int value;
 102
 103                value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;
 104                if (value >= base)
 105                        break;
 106                result = result * base + value;
 107                cp++;
 108        }
 109        if (endp)
 110                *endp = (char *)cp;
 111
 112        return result;
 113}
 114