001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020 #include "string.h"
021
022
023 void *memcpy(void *dst0, const void *src0, register unsigned int size)
024 {
025 char *dst;
026 const char *src;
027 for (dst = (char*)dst0, src = (const char*)src0 ;
028 size > 0 ;
029 dst++, src++, size--)
030 *dst = *src;
031 return dst0;
032 }
033
034
035 void *memset(void *dst0, register int c, register unsigned int length)
036 {
037 char *dst;
038 for (dst = (char*) dst0 ;
039 length > 0 ;
040 dst++, length --)
041 *dst = (char)c;
042 return dst0;
043 }
044
045 int memcmp(const void *s1, const void *s2, size_t len)
046 {
047 const unsigned char *c1, *c2;
048 unsigned int i;
049
050 for (i = 0, c1 = s1, c2 = s2; i < len; i++, c1++, c2++)
051 {
052 if(*c1 != *c2)
053 return *c1 - *c2;
054 }
055
056 return 0;
057 }
058
059
060 unsigned int strlen(register const char *str)
061 {
062 unsigned int retval = 0;
063
064 while (*str++)
065 retval++;
066
067 return retval;
068 }
069
070
071 unsigned int strnlen(const char * s, size_t count)
072 {
073 const char *sc;
074
075 for (sc = s; count-- && *sc != '\0'; ++sc)
076 continue;
077
078 return sc - s;
079 }
080
081
082 char *strzcpy(register char *dst, register const char *src, register int len)
083 {
084 int i;
085
086 if (len <= 0)
087 return dst;
088
089 for (i = 0; i < len; i++)
090 {
091 dst[i] = src[i];
092 if(src[i] == '\0')
093 return dst;
094 }
095
096 dst[len-1] = '\0';
097 return dst;
098 }
099
100
101 char *strzcat (char *dest, const char *src, size_t n)
102 {
103 char *res = dest;
104
105 for ( ; *dest ; dest++);
106
107 for ( ; *src ; src++, dest++) {
108 *dest = *src;
109 n--;
110 if (n <= 0)
111 break;
112 }
113
114 *dest = '\0';
115 return res;
116 }
117
118 int strcmp(register const char *s1, register const char *s2)
119 {
120 while (*s1 == *s2++)
121 if (*s1++ == 0)
122 return (0);
123
124 return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 - 1));
125 }
126
127
128 int strncmp(register const char *s1, register const char *s2, register int len)
129 {
130 char c1 = '\0', c2 = '\0';
131
132 while (len > 0)
133 {
134 c1 = (unsigned char) *s1++;
135 c2 = (unsigned char) *s2++;
136 if (c1 == '\0' || c1 != c2)
137 return c1 - c2;
138 len--;
139 }
140
141 return c1 - c2;
142 }
143
144
145 long long int strtoll(const char *nptr, char **endptr, int base)
146 {
147 long long int result;
148
149 #define RETURN(res) ({ if (endptr) *endptr = (char*)nptr; return res; })
150
151 if (base > 36)
152 {
153 RETURN(0);
154 }
155
156
157 for ( ; *nptr != '\0' && isspace(*nptr) ; nptr++)
158 continue;
159
160 if (nptr[0] == '0')
161 {
162 if (nptr[1] == 'x')
163 {
164 base = 16;
165 nptr += 2;
166 }
167 else
168 {
169 base = 8;
170 nptr ++;
171 }
172 }
173
174 result = 0;
175 for ( ; *nptr != '\0' ; nptr ++)
176 {
177 int digit;
178 if (*nptr >= '0' && *nptr <= '9')
179 digit = *nptr - '0';
180 else if (*nptr >= 'a' && *nptr <= 'z')
181 digit = 10 + *nptr - 'a';
182 else if (*nptr >= 'A' && *nptr <= 'Z')
183 digit = 10 + *nptr - 'A';
184 else
185 RETURN(result);
186 if (digit >= base)
187 {
188 RETURN(result);
189 }
190 result *= base;
191 result += digit;
192 }
193
194 RETURN(result);
195 }
196
197 long int strtol(const char *nptr, char **endptr, int base)
198 {
199 return strtoll(nptr, endptr, base);
200 }
201
202 long long atoll(const char *nptr)
203 {
204 return strtoll(nptr, NULL, 10);
205 }
206
207 long atol(const char *nptr)
208 {
209 return strtol(nptr, NULL, 10);
210 }
211
212