00001 #include <string.h>
00002
00003 #include <debug.h>
00004
00005
00006
00007 void *
00008 memcpy (void *dst_, const void *src_, size_t size)
00009 {
00010 unsigned char *dst = dst_;
00011 const unsigned char *src = src_;
00012
00013 ASSERT (dst != NULL || size == 0);
00014 ASSERT (src != NULL || size == 0);
00015
00016 while (size-- > 0)
00017 *dst++ = *src++;
00018
00019 return dst_;
00020 }
00021
00022
00023
00024 void *
00025 memmove (void *dst_, const void *src_, size_t size)
00026 {
00027 unsigned char *dst = dst_;
00028 const unsigned char *src = src_;
00029
00030 ASSERT (dst != NULL || size == 0);
00031 ASSERT (src != NULL || size == 0);
00032
00033 if (dst < src)
00034 {
00035 while (size-- > 0)
00036 *dst++ = *src++;
00037 }
00038 else
00039 {
00040 dst += size;
00041 src += size;
00042 while (size-- > 0)
00043 *--dst = *--src;
00044 }
00045
00046 return dst;
00047 }
00048
00049
00050
00051
00052
00053 int
00054 memcmp (const void *a_, const void *b_, size_t size)
00055 {
00056 const unsigned char *a = a_;
00057 const unsigned char *b = b_;
00058
00059 ASSERT (a != NULL || size == 0);
00060 ASSERT (b != NULL || size == 0);
00061
00062 for (; size-- > 0; a++, b++)
00063 if (*a != *b)
00064 return *a > *b ? +1 : -1;
00065 return 0;
00066 }
00067
00068
00069
00070
00071
00072
00073 int
00074 strcmp (const char *a_, const char *b_)
00075 {
00076 const unsigned char *a = (const unsigned char *) a_;
00077 const unsigned char *b = (const unsigned char *) b_;
00078
00079 ASSERT (a != NULL);
00080 ASSERT (b != NULL);
00081
00082 while (*a != '\0' && *a == *b)
00083 {
00084 a++;
00085 b++;
00086 }
00087
00088 return *a < *b ? -1 : *a > *b;
00089 }
00090
00091
00092
00093
00094 void *
00095 memchr (const void *block_, int ch_, size_t size)
00096 {
00097 const unsigned char *block = block_;
00098 unsigned char ch = ch_;
00099
00100 ASSERT (block != NULL || size == 0);
00101
00102 for (; size-- > 0; block++)
00103 if (*block == ch)
00104 return (void *) block;
00105
00106 return NULL;
00107 }
00108
00109
00110
00111
00112
00113 char *
00114 strchr (const char *string, int c_)
00115 {
00116 char c = c_;
00117
00118 ASSERT (string != NULL);
00119
00120 for (;;)
00121 if (*string == c)
00122 return (char *) string;
00123 else if (*string == '\0')
00124 return NULL;
00125 else
00126 string++;
00127 }
00128
00129
00130
00131 size_t
00132 strcspn (const char *string, const char *stop)
00133 {
00134 size_t length;
00135
00136 for (length = 0; string[length] != '\0'; length++)
00137 if (strchr (stop, string[length]) != NULL)
00138 break;
00139 return length;
00140 }
00141
00142
00143
00144
00145 char *
00146 strpbrk (const char *string, const char *stop)
00147 {
00148 for (; *string != '\0'; string++)
00149 if (strchr (stop, *string) != NULL)
00150 return (char *) string;
00151 return NULL;
00152 }
00153
00154
00155
00156 char *
00157 strrchr (const char *string, int c_)
00158 {
00159 char c = c_;
00160 const char *p = NULL;
00161
00162 for (; *string != '\0'; string++)
00163 if (*string == c)
00164 p = string;
00165 return (char *) p;
00166 }
00167
00168
00169
00170 size_t
00171 strspn (const char *string, const char *skip)
00172 {
00173 size_t length;
00174
00175 for (length = 0; string[length] != '\0'; length++)
00176 if (strchr (skip, string[length]) == NULL)
00177 break;
00178 return length;
00179 }
00180
00181
00182
00183
00184 char *
00185 strstr (const char *haystack, const char *needle)
00186 {
00187 size_t haystack_len = strlen (haystack);
00188 size_t needle_len = strlen (needle);
00189
00190 if (haystack_len >= needle_len)
00191 {
00192 size_t i;
00193
00194 for (i = 0; i <= haystack_len - needle_len; i++)
00195 if (!memcmp (haystack + i, needle, needle_len))
00196 return (char *) haystack + i;
00197 }
00198
00199 return NULL;
00200 }
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235 char *
00236 strtok_r (char *s, const char *delimiters, char **save_ptr)
00237 {
00238 char *token;
00239
00240 ASSERT (delimiters != NULL);
00241 ASSERT (save_ptr != NULL);
00242
00243
00244
00245 if (s == NULL)
00246 s = *save_ptr;
00247 ASSERT (s != NULL);
00248
00249
00250 while (strchr (delimiters, *s) != NULL)
00251 {
00252
00253
00254
00255 if (*s == '\0')
00256 {
00257 *save_ptr = s;
00258 return NULL;
00259 }
00260
00261 s++;
00262 }
00263
00264
00265 token = s;
00266 while (strchr (delimiters, *s) == NULL)
00267 s++;
00268 if (*s != '\0')
00269 {
00270 *s = '\0';
00271 *save_ptr = s + 1;
00272 }
00273 else
00274 *save_ptr = s;
00275 return token;
00276 }
00277
00278
00279 void *
00280 memset (void *dst_, int value, size_t size)
00281 {
00282 unsigned char *dst = dst_;
00283
00284 ASSERT (dst != NULL || size == 0);
00285
00286 while (size-- > 0)
00287 *dst++ = value;
00288
00289 return dst_;
00290 }
00291
00292
00293 size_t
00294 strlen (const char *string)
00295 {
00296 const char *p;
00297
00298 ASSERT (string != NULL);
00299
00300 for (p = string; *p != '\0'; p++)
00301 continue;
00302 return p - string;
00303 }
00304
00305
00306
00307 size_t
00308 strnlen (const char *string, size_t maxlen)
00309 {
00310 size_t length;
00311
00312 for (length = 0; string[length] != '\0' && length < maxlen; length++)
00313 continue;
00314 return length;
00315 }
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326 size_t
00327 strlcpy (char *dst, const char *src, size_t size)
00328 {
00329 size_t src_len;
00330
00331 ASSERT (dst != NULL);
00332 ASSERT (src != NULL);
00333
00334 src_len = strlen (src);
00335 if (size > 0)
00336 {
00337 size_t dst_len = size - 1;
00338 if (src_len < dst_len)
00339 dst_len = src_len;
00340 memcpy (dst, src, dst_len);
00341 dst[dst_len] = '\0';
00342 }
00343 return src_len;
00344 }
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356 size_t
00357 strlcat (char *dst, const char *src, size_t size)
00358 {
00359 size_t src_len, dst_len;
00360
00361 ASSERT (dst != NULL);
00362 ASSERT (src != NULL);
00363
00364 src_len = strlen (src);
00365 dst_len = strlen (dst);
00366 if (size > 0 && dst_len < size)
00367 {
00368 size_t copy_cnt = size - dst_len - 1;
00369 if (src_len < copy_cnt)
00370 copy_cnt = src_len;
00371 memcpy (dst + dst_len, src, copy_cnt);
00372 dst[dst_len + copy_cnt] = '\0';
00373 }
00374 return src_len + dst_len;
00375 }
00376