1 /*
2 * Copyright (c) 2006-2018 Ali Mashtizadeh
3 * All rights reserved.
4 */
5
6 #include <stddef.h>
7 #include <stdint.h>
8 #include <string.h>
9
10 char *
strchr(const char * s,int c)11 strchr(const char *s, int c)
12 {
13 int i;
14 for (i = 0; ; i++)
15 {
16 if (s[i] == c)
17 return (char *)s + i;
18 if (s[i] == '\0')
19 return NULL;
20 }
21 }
22
23 char *
strcpy(char * to,const char * from)24 strcpy(char *to, const char *from)
25 {
26 char *save = to;
27
28 for (; (*to = *from); ++from, ++to);
29
30 return save;
31 }
32
33 char *
strncpy(char * to,const char * from,size_t length)34 strncpy(char *to, const char *from, size_t length)
35 {
36 char *save = to;
37
38 for (; (*to = *from) != '\0' && length > 0; ++from, ++to, length--);
39
40 *to = '\0';
41
42 return save;
43 }
44
45 char *
strcat(char * s,const char * append)46 strcat(char *s, const char *append)
47 {
48 char *save = s;
49
50 for (; *s; ++s);
51 while ((*s++ = *append++));
52
53 return save;
54 }
55
56
57 char *
strncat(char * dst,const char * src,size_t n)58 strncat(char *dst, const char *src, size_t n)
59 {
60 if (n != 0) {
61 char *d = dst;
62 const char *s = src;
63
64 while (*d != 0)
65 d++;
66
67 do {
68 if ((*d = *s++) == 0)
69 break;
70
71 d++;
72 } while (--n != 0);
73
74 *d = 0;
75 }
76
77 return dst;
78 }
79
80 int
strcmp(const char * s1,const char * s2)81 strcmp(const char *s1, const char *s2)
82 {
83 while (*s1 == *s2++)
84 if (*s1++ == 0)
85 return 0;
86
87 return (*(const uint8_t *)s1 - *(const uint8_t *)(s2 - 1));
88 }
89
90 int
strncmp(const char * s1,const char * s2,size_t len)91 strncmp(const char *s1, const char *s2, size_t len)
92 {
93 if (len == 0)
94 return 0;
95
96 while (*s1 == *s2) {
97 if (*s1 == 0)
98 return 0;
99
100 s1++;
101 s2++;
102
103 len--;
104 if (len == 0)
105 return 0;
106 }
107
108 return (*(const uint8_t *)s1 - *(const uint8_t *)s2);
109 }
110
111 size_t
strlen(const char * str)112 strlen(const char *str)
113 {
114 const char *s;
115
116 for (s = str; *s; ++s);
117
118 return (s - str);
119 }
120
121 char *
strtok_r(char * str,const char * delim,char ** last)122 strtok_r(char *str, const char *delim, char **last)
123 {
124 char *rval;
125
126 if (str == NULL)
127 str = *last;
128
129 // Skip deliminaters in the front
130 while ((str[0] != '\0') && strchr(delim, str[0])) {
131 str++;
132 }
133
134 // We've reached the end of the string
135 if (str[0] == '\0')
136 return NULL;
137
138 // Return first non-delim until the next
139 rval = str;
140
141 // Skip deliminaters in the front
142 while ((str[0] != '\0') && !strchr(delim, str[0])) {
143 str++;
144 }
145
146 if (str[0] != '\0') {
147 str[0] = '\0';
148 str++;
149 }
150 *last = str;
151
152 return rval;
153 }
154
155 char *
strtok(char * str,const char * delim)156 strtok(char *str, const char *delim)
157 {
158 static char *last;
159
160 return strtok_r(str, delim, &last);
161 }
162
163 void *
memset(void * dst,int c,size_t length)164 memset(void *dst, int c, size_t length)
165 {
166 uint8_t *p = (uint8_t *)dst;
167
168 while (length-- != 0) {
169 *p = c;
170 p += 1;
171 };
172
173 return dst;
174 }
175
176 void *
memcpy(void * dst,const void * src,size_t length)177 memcpy(void *dst, const void *src, size_t length)
178 {
179 uint8_t *d = (uint8_t *)dst;
180 const uint8_t *s = (const uint8_t *)src;
181
182 while (length-- != 0) {
183 *d = *s;
184 d += 1;
185 s += 1;
186 };
187
188 return dst;
189 }
190
191 int
memcmp(const void * b1,const void * b2,size_t length)192 memcmp(const void *b1, const void *b2, size_t length)
193 {
194 int i;
195 const char *c1 = (const char *)b1;
196 const char *c2 = (const char *)b2;
197
198 for (i = 0; i < length; i++)
199 {
200 if (*c1 != *c2)
201 return *c2 - *c1;
202 c1++;
203 c2++;
204 }
205
206 return 0;
207 }
208
209