TSL256x I2C luminosity and IR sensor driver
[lpc82x] / lib / string.c
1 /*
2  *  linux/lib/string.c
3  *
4  *  Copyright (C) 1991, 1992  Linus Torvalds
5  */
7 /*
8  * stupid library routines.. The optimized versions should generally be found
9  * as inline code in <asm-xx/string.h>
10  *
11  * These are buggy as well..
12  *
13  * * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de>
14  * -  Added strsep() which will replace strtok() soon (because strsep() is
15  *    reentrant and should be faster). Use only strsep() in new code, please.
16  */
18 #include <lib/stddef.h>
19 #include "lib/stdint.h"
21 /**
22  * memcpy - Copy one area of memory to another
23  * @dest: Where to copy to
24  * @src: Where to copy from
25  * @count: The size of the area.
26  */
27 void* memcpy(void* dest, const void* src, size_t count)
28 {
29         unsigned long* dl = (unsigned long*)dest, *sl = (unsigned long*)src;
30         char *d8, *s8;
32         if (src == dest)
33                 return dest;
35         /* while all data is aligned (common case), copy a word at a time */
36         if ( (((uint32_t)dest | (uint32_t)src) & (sizeof(*dl) - 1)) == 0) {
37                 while (count >= sizeof(*dl)) {
38                         *dl++ = *sl++;
39                         count -= sizeof(*dl);
40                 }
41         }
42         /* copy the rest one byte at a time */
43         d8 = (char *)dl;
44         s8 = (char *)sl;
45         while (count--) {
46                 *d8++ = *s8++;
47         }
48         return dest;
49 }
51 /**
52  * memset - Fill a region of memory with the given value
53  * @s: Pointer to the start of the area.
54  * @c: The byte to fill the area with
55  * @count: The size of the area.
56  */
57 void* memset(void* s, int c, size_t count)
58 {
59         unsigned long* sl = (unsigned long*) s;
60         unsigned long cl = 0;
61         char* s8;
62         int i;
64         /* do it one word at a time (32 bits or 64 bits) while possible */
65         if ( ((uint32_t)s & (sizeof(*sl) - 1)) == 0) {
66                 for (i = 0; i < sizeof(*sl); i++) {
67                         cl <<= 8;
68                         cl |= c & 0xff;
69                 }
70                 while (count >= sizeof(*sl)) {
71                         *sl++ = cl;
72                         count -= sizeof(*sl);
73                 }
74         }
75         /* fill 8 bits at a time */
76         s8 = (char*)sl;
77         while (count--) {
78                 *s8++ = c;
79         }
80         return s;
81 }
83 /**
84  * strcpy - Copy a %NUL terminated string
85  * @dest: Where to copy the string to
86  * @src: Where to copy the string from
87  */
88 char* strcpy(char* dest, const char* src)
89 {
90         char* tmp = dest;
92         while ((*dest++ = *src++) != '\0') {
93                 /* nothing */;
94         }
95         return tmp;
96 }
98 /**
99  * strncpy - Copy a length-limited, %NUL-terminated string
100  * @dest: Where to copy the string to
101  * @src: Where to copy the string from
102  * @count: The maximum number of bytes to copy
103  *
104  * Note that unlike userspace strncpy, this does not %NUL-pad the buffer.
105  * However, the result is not %NUL-terminated if the source exceeds
106  * @count bytes.
107  */
108 char* strncpy(char* dest, const char* src, size_t count)
110         char* tmp = dest;
112         while (count-- && (*dest++ = *src++) != '\0') {
113                 /* nothing */;
114         }
115         return tmp;
118 /**
119  * strcmp - Compare two strings
120  * @cs: One string
121  * @ct: Another string
122  */
123 int strcmp(const char* cs, const char* ct)
125         register signed char __res;
127         while (1) {
128                 if ((__res = *cs - *ct++) != 0 || !*cs++) {
129                         break;
130                 }
131         }
132         return __res;
135 /**
136  * strncmp - Compare two length-limited strings
137  * @cs: One string
138  * @ct: Another string
139  * @count: The maximum number of bytes to compare
140  */
141 int strncmp(const char* cs, const char* ct, size_t count)
143         register signed char __res = 0;
145         while (count) {
146                 if ((__res = *cs - *ct++) != 0 || !*cs++) {
147                         break;
148                 }
149                 count--;
150         }
152         return __res;
155 /**
156  * strchr - Find the first occurrence of a character in a string
157  * @s: The string to be searched
158  * @c: The character to search for
159  */
160 char* strchr(const char* s, int c)
162         for(; *s != (char) c; ++s) {
163                 if (*s == '\0') {
164                         return NULL;
165                 }
166         }
167         return (char *) s;
170 /**
171  * strlen - Find the length of a string
172  * @s: The string to be sized
173  */
174 size_t strlen(const char* s)
176         const char* sc;
178         for (sc = s; *sc != '\0'; ++sc) {
179                 /* nothing */;
180         }
181         return sc - s;
184 /**
185  * strrchr - Find the last occurrence of a character in a string
186  * @s: The string to be searched
187  * @c: The character to search for
188  */
189 char* strrchr(const char* s, int c)
191         const char* p = s + strlen(s);
192         do {
193                 if (*p == (char)c) {
194                         return (char *)p;
195                 }
196         } while (--p >= s);
197         return NULL;
200 /**
201  * strnlen - Find the length of a length-limited string
202  * @s: The string to be sized
203  * @count: The maximum number of bytes to search
204  */
205 size_t strnlen(const char* s, size_t count)
207         const char* sc;
209         for (sc = s; count-- && *sc != '\0'; ++sc) {
210                 /* nothing */;
211         }
212         return sc - s;