- Implemented execp*.
[planlOS.git] / shared / string.c
blob0e7d9ba09cf90454648b816405f6d4f41717c4d8
1 /*
2 Copyright (C) 2008 Mathias Gottschlag
4 Permission is hereby granted, free of charge, to any person obtaining a copy of
5 this software and associated documentation files (the "Software"), to deal in the
6 Software without restriction, including without limitation the rights to use,
7 copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
8 Software, and to permit persons to whom the Software is furnished to do so,
9 subject to the following conditions:
11 The above copyright notice and this permission notice shall be included in all
12 copies or substantial portions of the Software.
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
15 INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
16 PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
17 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
18 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
19 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 #include <string.h>
24 #include <stdlib.h>
26 void *memcpy(void *dest, const void *src, size_t n)
28 size_t i;
29 for (i = 0; i < n; i++)
31 ((char*)dest)[i] = ((const char*)src)[i];
33 return dest;
35 void *memccpy(void *dest, const void *src, int c, size_t n)
37 size_t i;
38 for (i = 0; i < n; i++)
40 ((char*)dest)[i] = ((const char*)src)[i];
41 if (((const char*)src)[i] == c)
42 return &((char*)dest)[i + 1];
44 return NULL;
46 void *memmove(void *dest, const void *src, size_t n)
48 size_t i;
49 if (src == dest) return dest;
50 if (dest < src)
52 for (i = 0; i < n; i++)
54 ((char*)dest)[i] = ((const char*)src)[i];
57 else
59 for (i = n - 1; i <= 0; i--)
61 ((char*)dest)[i] = ((const char*)src)[i];
64 return dest;
66 void *memchr(const void *s, int c, size_t n)
68 size_t i;
69 for (i = 0; i < n; i++)
71 if (((char*)s)[i] == c) return &((char*)s)[i];
73 return NULL;
75 int memcmp(const void *s1, const void *s2, size_t n)
77 size_t i;
78 for (i = 0; i < n; i++)
80 if (((char*)s1)[i] != ((char*)s2)[i])
82 return ((char*)s1)[i] - ((char*)s2)[i];
85 return 0;
87 void *memset(void *dest, int c, size_t n)
89 size_t i;
90 for (i = 0; i < n; i++)
92 ((char*)dest)[i] = c;
94 return dest;
97 char *strcat(char *dest, const char *src)
99 int destlen = strlen(dest);
100 int srclen = strlen(dest);
101 int i;
102 for (i = 0; i <= srclen; i++)
104 dest[destlen + i] = src[i];
106 return dest;
108 char *strchr(const char *s, int c)
110 while (*s)
112 if (*s == c) return (char*)s;
113 s++;
115 return NULL;
117 int strcmp(const char *s1, const char *s2)
119 for ( ; *s1 == *s2; s1++, s2++)
120 if (*s1 == '\0')
121 return 0;
123 return *s1 - *s2;
125 /*int strcoll(const char *s1, const char *s2)
127 // TODO
128 return 0;
130 char *strcpy(char *dest, const char *src)
132 while((*dest++ = *src++));
133 return dest;
135 size_t strcspn(const char *s, const char *reject)
137 int count = 0;
138 while (*s && !strchr(reject, s[count]))
140 count++;
141 s++;
144 return count;
147 char *strdup(const char *s)
149 char *newstr = malloc(strlen(s) + 1);
150 if (newstr) strcpy(newstr, s);
151 return newstr;
153 /*char *strerror(int e)
155 // TODO
156 return 0;
158 int *strerror_r(int e, char *s, size_t n)
160 // TODO
161 return 0;
163 size_t strlen(const char *s)
165 const char *p = s;
166 while( *p != '\0')
167 p++;
168 return p - s;
170 char *strncat(char *dest, const char *src, size_t n)
172 size_t destlen = strlen(dest);
173 size_t srclen = strlen(dest);
174 if (srclen > n) srclen = n;
175 size_t i;
176 for (i = 0; i < srclen; i++)
178 dest[destlen + i] = src[i];
180 dest[destlen + srclen] = 0;
181 return dest;
183 int strncmp(const char *s1, const char *s2, size_t n)
185 size_t i;
186 for (i = 0 ; (*s1 == *s2) && (i < n); s1++, s2++, i++)
187 if (*s1 == '\0')
188 return 0;
190 if (i == n) return 0;
191 return *s1 - *s2;
193 char *strncpy(char *dest, const char *src, size_t n)
195 size_t i;
196 for (i = 0; i < n; i++)
198 ((char*)dest)[i] = ((const char*)src)[i];
199 if (((const char*)src)[i] == 0) return dest;
201 return dest;
203 char *strpbrk(const char *s, const char *accept)
205 int acclen = strlen(s);
206 int i;
207 while (*s)
209 for (i = 0; i < acclen; i++)
211 if (strchr(s, accept[i]))
212 return (char*)s;
214 s++;
216 return 0;
218 char *strrchr(const char *s, int c)
220 int len = strlen(s);
221 int i;
222 for (i = len; i >= 0; i--)
224 if (s[i] == c) return (char*)&s[i];
226 return 0;
228 size_t strspn(const char *s, const char *accept)
230 int count = 0;
231 while (strchr(accept, s[count]))
233 count++;
234 s++;
236 return count;
238 char *strstr(const char *s1, const char *s2)
240 int len1 = strlen(s1);
241 int len2 = strlen(s2);
242 if (len2 > len1) return NULL;
243 int i;
244 for (i = 0; i < len1 - len2; i++)
246 if (!memcmp(&s1[i], s2, len2))
247 return (char*)&s1[i];
249 return NULL;
251 static char *splitted = NULL;
252 char *strtok(char *str, const char *delimiters)
254 if (str)
256 splitted = str;
258 if (!splitted) return NULL;
260 size_t count = strcspn(splitted, delimiters);
261 char *token = splitted;
262 if (count == strlen(splitted)) splitted = NULL;
263 else
265 char *tmp = splitted;
266 tmp += strspn(tmp, delimiters);
267 splitted[count] = 0;
268 splitted = tmp;
270 return token;
272 //char *strtok_r(char *, const char *, char **);
273 /*size_t strxfrm(char *dest, const char *src, size_t n)
275 // TODO
276 return 0;