Import of openhackware-0.4.1
[openhackware.git] / src / libc / src / str.c
blob24548fa00d84b830c32fcd127a892be6bea5b45d
1 /*
2 * <str.c>
4 * Open Hack'Ware BIOS: str<xxx> functions
5 *
6 * Copyright (c) 2004-2005 Jocelyn Mayer
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License V2
10 * as published by the Free Software Foundation
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 /* functions prototypes are here */
23 #include <string.h>
24 /* NULL is defined here */
25 /* malloc is defined here */
26 #include <stdlib.h>
27 /* toupper is defined here */
28 #include <ctype.h>
30 /* str___ functions */
31 #if defined (__USE_strcpy__)
32 void *strcpy (char *dest, const char *src)
34 char *q;
36 q = dest;
37 for (; ; q++) {
38 *q = *src++;
39 if (*q == '\0')
40 break;
43 return dest;
45 #endif
47 #if defined (__USE_strncpy__)
48 void *strncpy (char *dest, const char *src, size_t n)
50 char *q;
52 q = dest;
53 for (; n != 0; n--, q++) {
54 *q = *src++;
55 if (*q == '\0')
56 break;
59 return dest;
61 #endif
63 #if defined (__USE_strdup__)
64 char *strdup (const char *s)
66 char *dest;
67 size_t len;
69 len = strlen(s) + 1;
70 dest = malloc(len);
71 if (dest != NULL)
72 memcpy(dest, s, len);
74 return dest;
76 #endif
78 #if defined (__USE_strndup__)
79 /* GNU extension */
80 char *strndup (const char *s, size_t n)
82 char *dest;
83 size_t len;
85 len = strlen(s) + 1;
86 if (len > n)
87 len = n;
88 dest = malloc(len);
89 if (dest != NULL) {
90 memcpy(dest, s, len - 1);
91 dest[len - 1] = '\0';
94 return dest;
96 #endif
98 #if defined (__USE_stpcpy__)
99 void *stpcpy (char *dest, const char *src)
101 char *q;
103 q = dest;
104 for (; ; q++) {
105 *q = *src++;
106 if (*q == '\0')
107 break;
110 return q;
112 #endif
114 #if defined (__USE_stpncpy__)
115 void *stpncpy (char *dest, const char *src, size_t n)
117 char *q;
119 q = dest;
120 for (; n != 0; n--, q++) {
121 *q = *src++;
122 if (*q == '\0')
123 break;
126 return q;
128 #endif
130 #if defined (__USE_strcat__)
131 char *strcat (char *dest, const char *src)
133 char *q;
135 for (q = dest + strlen(dest); ; q++) {
136 *q = *src++;
137 if (*q == '\0')
138 break;
141 return dest;
143 #endif
145 #if defined (__USE_strncat__)
146 char *strncat (char *dest, const char *src, size_t n)
148 char *q;
150 for (q = dest + strlen(dest); n != 0; n--, q++) {
151 *q = *src++;
152 if (*q == '\0')
153 break;
156 return dest;
158 #endif
160 #if defined (__USE_strcmp__)
161 int strcmp (const char *s1, const char *s2)
163 int ret;
165 for (ret = 0; ret == 0; s1++) {
166 ret = *s1 - *s2++;
167 if (*s1 == '\0')
168 break;
171 return ret;
173 #endif
175 #if defined (__USE_strcasecmp__)
176 int strcasecmp (const char *s1, const char *s2)
178 int ret;
180 for (ret = 0; ret == 0; s1++) {
181 ret = toupper(*s1) - toupper(*s2++);
182 if (*s1 == '\0')
183 break;
186 return ret;
188 #endif
190 #if defined (__USE_strncmp__)
191 int strncmp (const char *s1, const char *s2, size_t n)
193 int ret;
195 for (ret = 0; ret == 0 && n != 0; n--, s1++) {
196 ret = *s1 - *s2++;
197 if (*s1 == '\0')
198 break;
201 return ret;
203 #endif
205 #if defined (__USE_strncasecmp__)
206 int strncasecmp (const char *s1, const char *s2, size_t n)
208 int ret;
210 for (ret = 0; ret == 0 && n != 0; n--, s1++) {
211 ret = toupper(*s1) - toupper(*s2++);
212 if (*s1 == '\0')
213 break;
216 return ret;
218 #endif
220 #if defined (__USE_strchr__)
221 char *strchr (const char *s, int c)
223 const char *r;
225 for (r = NULL; *s != '\0'; s++) {
226 if (*s == c) {
227 r = s;
228 break;
232 return (char *)r;
234 #endif
236 #if defined (__USE_strchrnul__)
237 /* GNU extension */
238 char *strchrnul (const char *s, int c)
240 for (; *s != '\0' && *s != c; s++)
241 continue;
243 return (char *)s;
245 #endif
247 #if defined (__USE_strrchr__)
248 char *strrchr (const char *s, int c)
250 const char *p, *r;
252 r = NULL;
253 for (p = s + strlen(s); p != s; p--) {
254 if (*p == c) {
255 r = p;
256 break;
260 return (char *)r;
262 #endif
264 #if defined (__USE_strstr__)
265 char *strstr (const char *haystack, const char *needle)
267 const char *r;
268 size_t hlen, nlen;
270 if (*needle == '\0')
271 return (char *)haystack;
272 r = NULL;
273 hlen = strlen(haystack);
274 nlen = strlen(needle);
275 for (; hlen > nlen; hlen--, haystack++) {
276 if (memcmp(haystack, needle, nlen) == 0) {
277 r = haystack;
278 break;
282 return (char *)r;
284 #endif
286 #if defined (__USE_strcasestr__)
287 char *strcasestr (const char *haystack, const char *needle)
289 const char *p, *q, *r;
290 size_t hlen, nlen, n;
292 if (*needle == '\0')
293 return (char *)haystack;
294 r = NULL;
295 hlen = strlen(haystack);
296 nlen = strlen(needle);
297 for (; hlen > nlen; hlen--, haystack++) {
298 p = haystack;
299 q = needle;
300 for (n = nlen; n != 0; n--) {
301 if (toupper(*p++) != toupper(*q++))
302 break;
304 if (n == 0) {
305 r = haystack;
306 break;
310 return (char *)r;
312 #endif
314 #if defined (__USE_strspn__)
315 #error "TODO"
316 size_t strspn (const char *s, const char *accept)
319 #endif
321 #if defined (__USE_strcspn__)
322 #error "TODO"
323 size_t strcspn (const char *s, const char *reject)
326 #endif
328 #if defined (__USE_strpbrk__)
329 #error "TODO"
330 char *strpbrk (const char *s, const char *accept)
333 #endif
335 #if defined (__USE_strtok__)
336 #error "TODO"
337 char *strtok (char *s, const char *delim)
340 #endif
342 #if defined (__USE_strtok_r__)
343 #error "TODO"
344 char *strtok_r (char *s, const char *delim, char **ptrptr)
347 #endif
349 #if defined (__USE_strsep__)
350 #error "TODO"
351 char *strsep (char **stringp, const char *delim)
354 #endif
356 #if defined (__USE_basename__)
357 char *basename (char *path)
359 char *sl;
360 size_t len;
362 if (path == NULL || (len = strlen(path)) == 0)
363 return strdup(".");
364 sl = path + len - 1;
365 if (*sl == '/')
366 sl--;
367 for (; sl != path; sl--) {
368 if (*sl == '/')
369 break;
372 return strdup(sl + 1);
374 #endif
376 #if defined (__USE_dirname__)
377 char *dirname (char *path)
379 char *sl, *ret;
380 size_t len;
382 if (path == NULL || (len = strlen(path)) == 0) {
383 ret = strdup(".");
384 } else {
385 sl = path + len - 1;
386 if (*sl == '/')
387 sl--;
388 for (; sl != path; sl--) {
389 if (*sl == '/')
390 break;
392 len = sl - path;
393 if (len == 0) {
394 ret = strdup(".");
395 } else {
396 ret = malloc(len + 1);
397 if (ret != NULL) {
398 memcpy(path, ret, len);
399 path[len] = '\0';
404 return ret;
406 #endif
408 #if defined (__USE_strlen__)
409 size_t strlen (const char *s)
411 size_t len;
413 for (len = 0; *s != '\0'; len++)
414 s++;
416 return len;
418 #endif
420 #if defined (__USE_strnlen__)
421 size_t strnlen (const char *s, size_t maxlen)
423 size_t len;
425 for (len = 0; maxlen != 0 && *s != '\0'; maxlen--, len++)
426 s++;
428 return len;
430 #endif