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