port-work; won't compile or even work
[ppcskel.git] / string.c
1 /*  string.c -- standard C string-manipulation functions.
2
3 Copyright (C) 2008              Segher Boessenkool <segher@kernel.crashing.org>
4 Copyright (C) 2009              Haxx Enterprises <bushing@gmail.com>
5
6 Portions taken from the Public Domain C Library (PDCLib).
7 https://negix.net/trac/pdclib
8
9 # This code is licensed to you under the terms of the GNU GPL, version 2;
10 # see file COPYING or http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
11 */
12
13 #include "string.h"
14
15 size_t strlen(const char *s)
16 {
17         size_t len;
18
19         for (len = 0; s[len]; len++)
20                 ;
21
22         return len;
23 }
24
25 size_t strnlen(const char *s, size_t count)
26 {
27         size_t len;
28
29         for (len = 0; s[len] && len < count; len++)
30                 ;
31
32         return len;
33 }
34
35 void *memset(void *b, int c, size_t len)
36 {
37         size_t i;
38
39         for (i = 0; i < len; i++)
40                 ((unsigned char *)b)[i] = c;
41
42         return b;
43 }
44
45 void *memcpy(void *dst, const void *src, size_t len)
46 {
47         size_t i;
48
49         for (i = 0; i < len; i++)
50                 ((unsigned char *)dst)[i] = ((unsigned char *)src)[i];
51
52         return dst;
53 }
54
55 int memcmp(const void *s1, const void *s2, size_t len)
56 {
57         size_t i;
58         const unsigned char * p1 = (const unsigned char *) s1;
59         const unsigned char * p2 = (const unsigned char *) s2;
60
61         for (i = 0; i < len; i++)
62                 if (p1[i] != p2[i]) return p1[i] - p2[i];
63         
64         return 0;
65 }
66
67 int strcmp(const char *s1, const char *s2)
68 {
69         size_t i;
70
71         for (i = 0; s1[i] && s1[i] == s2[i]; i++)
72                 ;
73         
74         return s1[i] - s2[i];
75 }
76
77 int strncmp(const char *s1, const char *s2, size_t n)
78 {
79         size_t i;
80
81         for (i = 0; i < n && s1[i] && s1[i] == s2[i]; i++)
82                 ;
83         if (i == n) return 0;
84         return s1[i] - s2[i];
85 }
86
87 size_t strlcpy(char *dest, const char *src, size_t maxlen)
88 {
89         size_t len,needed;
90
91         len = needed = strnlen(src, maxlen-1) + 1;
92         if (len >= maxlen)
93                 len = maxlen-1;
94
95         memcpy(dest, src, len);
96         dest[len]='\0';
97
98         return needed-1;
99 }
100
101 size_t strlcat(char *dest, const char *src, size_t maxlen)
102 {
103         size_t used;
104
105     used = strnlen(dest, maxlen-1);
106         return used + strlcpy(dest + used, src, maxlen - used);
107 }
108
109 char * strchr(const char *s, int c)
110 {
111         size_t i;
112         
113         for (i = 0; s[i]; i++)
114                 if (s[i] == (char)c) return (char *)s + i;
115
116         return NULL;
117 }
118
119 size_t strspn(const char *s1, const char *s2)
120 {
121         size_t len = 0;
122         const char *p;
123
124         while (s1[len]) {
125                 p = s2;
126                 while (*p) {
127                         if (s1[len] == *p)
128                                 break;
129
130                         ++p;
131                 }
132                 if (!*p)
133                         return len;
134
135                 ++len;
136         }
137
138         return len;
139 }
140
141 size_t strcspn(const char *s1, const char *s2)
142 {
143         size_t len = 0;
144         const char *p;
145
146         while (s1[len]) {
147                 p = s2;
148                 while (*p)
149                         if (s1[len] == *p++)
150                                 return len;
151
152                 ++len;
153         }
154
155         return len;
156 }
157