Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/x86/boot/string.c
10817 views
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
17
int 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
33
int 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
49
size_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
60
unsigned 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
71
static 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
90
unsigned 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
115