xref: /xv6-public/string.c (revision b5ee5165)
1a4c03deaSrtm #include "types.h"
2a4c03deaSrtm #include "defs.h"
3a4c03deaSrtm 
455e95b16Srtm void *
5*b5ee5165Srsc memset(void *dst, int c, uint n)
655e95b16Srtm {
755e95b16Srtm   char *d = (char *) dst;
855e95b16Srtm 
955e95b16Srtm   while(n-- > 0)
1055e95b16Srtm     *d++ = c;
1155e95b16Srtm 
1255e95b16Srtm   return dst;
1355e95b16Srtm }
147baa34a4Skaashoek 
157baa34a4Skaashoek int
16*b5ee5165Srsc memcmp(const void *v1, const void *v2, uint n)
177baa34a4Skaashoek {
187baa34a4Skaashoek   const uint8_t *s1 = (const uint8_t *) v1;
197baa34a4Skaashoek   const uint8_t *s2 = (const uint8_t *) v2;
207baa34a4Skaashoek 
217baa34a4Skaashoek   while (n-- > 0) {
227baa34a4Skaashoek     if (*s1 != *s2)
237baa34a4Skaashoek       return (int) *s1 - (int) *s2;
247baa34a4Skaashoek     s1++, s2++;
257baa34a4Skaashoek   }
267baa34a4Skaashoek 
277baa34a4Skaashoek   return 0;
287baa34a4Skaashoek }
2921a88fd4Skaashoek 
3021a88fd4Skaashoek void *
31*b5ee5165Srsc memmove(void *dst, const void *src, uint n)
3221a88fd4Skaashoek {
3321a88fd4Skaashoek   const char *s;
3421a88fd4Skaashoek   char *d;
3521a88fd4Skaashoek 
3621a88fd4Skaashoek   s = src;
3721a88fd4Skaashoek   d = dst;
3821a88fd4Skaashoek   if (s < d && s + n > d) {
3921a88fd4Skaashoek     s += n;
4021a88fd4Skaashoek     d += n;
4121a88fd4Skaashoek     while (n-- > 0)
4221a88fd4Skaashoek       *--d = *--s;
4321a88fd4Skaashoek   } else
4421a88fd4Skaashoek     while (n-- > 0)
4521a88fd4Skaashoek       *d++ = *s++;
4621a88fd4Skaashoek 
4721a88fd4Skaashoek   return dst;
4821a88fd4Skaashoek }
49b22d8982Skaashoek 
50b22d8982Skaashoek int
51*b5ee5165Srsc strncmp(const char *p, const char *q, uint n)
52b22d8982Skaashoek {
53b22d8982Skaashoek 	while (n > 0 && *p && *p == *q)
54b22d8982Skaashoek 		n--, p++, q++;
55b22d8982Skaashoek 	if (n == 0)
56b22d8982Skaashoek 		return 0;
57b22d8982Skaashoek 	else
58*b5ee5165Srsc 		return (int) ((uint8_t) *p - (uint8_t) *q);
59b22d8982Skaashoek }
60856e1fc1Srsc 
61856e1fc1Srsc // Memcpy is deprecated and should NOT be called.
62856e1fc1Srsc // Use memmove instead, which has defined semantics
63856e1fc1Srsc // when the two memory ranges overlap.
64856e1fc1Srsc // Memcpy is here only because gcc compiles some
65856e1fc1Srsc // structure assignments into calls to memcpy.
66856e1fc1Srsc void *
67*b5ee5165Srsc memcpy(void *dst, void *src, uint n)
68856e1fc1Srsc {
69856e1fc1Srsc   char *d = (char *) dst;
70856e1fc1Srsc   char *s = (char *) src;
71856e1fc1Srsc 
72856e1fc1Srsc   while(n-- > 0)
73856e1fc1Srsc     *d++ = *s++;
74856e1fc1Srsc 
75856e1fc1Srsc   return dst;
76856e1fc1Srsc }
77856e1fc1Srsc 
78