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 *
strtok_r(char * str,const char * delim,char ** last)24 strtok_r(char *str, const char *delim, char **last)
25 {
26     char *rval;
27 
28     if (str == NULL)
29 	str = *last;
30 
31     // Skip deliminaters in the front
32     while ((str[0] != '\0') && strchr(delim, str[0])) {
33 	str++;
34     }
35 
36     // We've reached the end of the string
37     if (str[0] == '\0')
38 	return NULL;
39 
40     // Return first non-delim until the next
41     rval = str;
42 
43     // Skip deliminaters in the front
44     while ((str[0] != '\0') && !strchr(delim, str[0])) {
45 	str++;
46     }
47 
48     if (str[0] != '\0') {
49 	str[0] = '\0';
50 	str++;
51     }
52     *last = str;
53 
54     return rval;
55 }
56 
57 char *
strcpy(char * to,const char * from)58 strcpy(char *to, const char *from)
59 {
60     char *save = to;
61 
62     for (; (*to = *from); ++from, ++to);
63 
64     return save;
65 }
66 
67 char *
strncpy(char * to,const char * from,size_t length)68 strncpy(char *to, const char *from, size_t length)
69 {
70     char *save = to;
71 
72     for (; (*to = *from) != '\0' && length > 0; ++from, ++to, length--);
73 
74     *to = '\0';
75 
76     return save;
77 }
78 
79 int
strcmp(const char * s1,const char * s2)80 strcmp(const char *s1, const char *s2)
81 {
82     while (*s1 == *s2++)
83         if (*s1++ == 0)
84             return 0;
85 
86     return (*(const uint8_t *)s1 - *(const uint8_t *)(s2 - 1));
87 }
88 
89 int
strncmp(const char * s1,const char * s2,size_t len)90 strncmp(const char *s1, const char *s2, size_t len)
91 {
92     if (len == 0)
93 	return 0;
94 
95     while (*s1 == *s2) {
96 	if (*s1 == 0)
97 	    return 0;
98 
99 	s1++;
100 	s2++;
101 
102 	len--;
103 	if (len == 0)
104 	    return 0;
105     }
106 
107     return (*(const uint8_t *)s1 - *(const uint8_t *)s2);
108 }
109 
110 size_t
strlen(const char * str)111 strlen(const char *str)
112 {
113     const char *s;
114 
115     for (s = str; *s; ++s);
116 
117     return (s - str);
118 }
119 
120 void *
memset(void * dst,int c,size_t length)121 memset(void *dst, int c, size_t length)
122 {
123     uint8_t *p = (uint8_t *)dst;
124 
125     while (length-- != 0) {
126         *p = c;
127         p += 1;
128     };
129 
130     return dst;
131 }
132 
133 void *
memcpy(void * dst,const void * src,size_t length)134 memcpy(void *dst, const void *src, size_t length)
135 {
136     uint8_t *d = (uint8_t *)dst;
137     const uint8_t *s = (const uint8_t *)src;
138 
139     while (length-- != 0) {
140 	*d = *s;
141 	d += 1;
142 	s += 1;
143     };
144 
145     return dst;
146 }
147 
148 int
memcmp(const void * b1,const void * b2,size_t length)149 memcmp(const void *b1, const void *b2, size_t length)
150 {
151     int i;
152     const char *c1 = (const char *)b1;
153     const char *c2 = (const char *)b2;
154 
155     for (i = 0; i < length; i++)
156     {
157 	if (*c1 != *c2)
158 	    return *c2 - *c1;
159 	c1++;
160 	c2++;
161     }
162 
163     return 0;
164 }
165 
166