Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
string.c
Go to the documentation of this file.
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 
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 
119 size_t strlen(const char *s)
120 {
121  const char *sc;
122 
123  for (sc = s; *sc != '\0'; ++sc)
124  /* nothing */;
125  return sc - s;
126 }
127 
133 char *strstr(const char *s1, const char *s2)
134 {
135  size_t l1, l2;
136 
137  l2 = strlen(s2);
138  if (!l2)
139  return (char *)s1;
140  l1 = strlen(s1);
141  while (l1 >= l2) {
142  l1--;
143  if (!memcmp(s1, s2, l2))
144  return (char *)s1;
145  s1++;
146  }
147  return NULL;
148 }