xref: /xv6-public/string.c (revision 7894fcd2)
1a4c03deaSrtm #include "types.h"
282201353Srsc #include "x86.h"
3a4c03deaSrtm 
455e95b16Srtm void*
memset(void * dst,int c,uint n)5b5ee5165Srsc memset(void *dst, int c, uint n)
655e95b16Srtm {
7*d0f3efcaSAustin Clements   if ((int)dst%4 == 0 && n%4 == 0){
8*d0f3efcaSAustin Clements     c &= 0xFF;
9*d0f3efcaSAustin Clements     stosl(dst, (c<<24)|(c<<16)|(c<<8)|c, n/4);
10*d0f3efcaSAustin Clements   } else
1182201353Srsc     stosb(dst, c, n);
1255e95b16Srtm   return dst;
1355e95b16Srtm }
147baa34a4Skaashoek 
157baa34a4Skaashoek int
memcmp(const void * v1,const void * v2,uint n)16b5ee5165Srsc memcmp(const void *v1, const void *v2, uint n)
177baa34a4Skaashoek {
18dca5b5caSrsc   const uchar *s1, *s2;
197baa34a4Skaashoek 
20dca5b5caSrsc   s1 = v1;
21dca5b5caSrsc   s2 = v2;
227baa34a4Skaashoek   while(n-- > 0){
237baa34a4Skaashoek     if(*s1 != *s2)
24dca5b5caSrsc       return *s1 - *s2;
257baa34a4Skaashoek     s1++, s2++;
267baa34a4Skaashoek   }
277baa34a4Skaashoek 
287baa34a4Skaashoek   return 0;
297baa34a4Skaashoek }
3021a88fd4Skaashoek 
3121a88fd4Skaashoek void*
memmove(void * dst,const void * src,uint n)32b5ee5165Srsc memmove(void *dst, const void *src, uint n)
3321a88fd4Skaashoek {
3421a88fd4Skaashoek   const char *s;
3521a88fd4Skaashoek   char *d;
3621a88fd4Skaashoek 
3721a88fd4Skaashoek   s = src;
3821a88fd4Skaashoek   d = dst;
3921a88fd4Skaashoek   if(s < d && s + n > d){
4021a88fd4Skaashoek     s += n;
4121a88fd4Skaashoek     d += n;
4221a88fd4Skaashoek     while(n-- > 0)
4321a88fd4Skaashoek       *--d = *--s;
4421a88fd4Skaashoek   } else
4521a88fd4Skaashoek     while(n-- > 0)
4621a88fd4Skaashoek       *d++ = *s++;
4721a88fd4Skaashoek 
4821a88fd4Skaashoek   return dst;
4921a88fd4Skaashoek }
50b22d8982Skaashoek 
512c536bffSAustin Clements // memcpy exists to placate GCC.  Use memmove.
526639ce56SAustin Clements void*
memcpy(void * dst,const void * src,uint n)536639ce56SAustin Clements memcpy(void *dst, const void *src, uint n)
546639ce56SAustin Clements {
556639ce56SAustin Clements   return memmove(dst, src, n);
566639ce56SAustin Clements }
576639ce56SAustin Clements 
58b22d8982Skaashoek int
strncmp(const char * p,const char * q,uint n)59b5ee5165Srsc strncmp(const char *p, const char *q, uint n)
60b22d8982Skaashoek {
61b22d8982Skaashoek   while(n > 0 && *p && *p == *q)
62b22d8982Skaashoek     n--, p++, q++;
63b22d8982Skaashoek   if(n == 0)
64b22d8982Skaashoek     return 0;
65766ba5ccSrsc   return (uchar)*p - (uchar)*q;
66766ba5ccSrsc }
67766ba5ccSrsc 
68766ba5ccSrsc char*
strncpy(char * s,const char * t,int n)69766ba5ccSrsc strncpy(char *s, const char *t, int n)
70766ba5ccSrsc {
71766ba5ccSrsc   char *os;
72766ba5ccSrsc 
73766ba5ccSrsc   os = s;
74766ba5ccSrsc   while(n-- > 0 && (*s++ = *t++) != 0)
75766ba5ccSrsc     ;
76766ba5ccSrsc   while(n-- > 0)
77766ba5ccSrsc     *s++ = 0;
78766ba5ccSrsc   return os;
79b22d8982Skaashoek }
807e89fb90Srsc 
817e89fb90Srsc // Like strncpy but guaranteed to NUL-terminate.
827e89fb90Srsc char*
safestrcpy(char * s,const char * t,int n)837e89fb90Srsc safestrcpy(char *s, const char *t, int n)
847e89fb90Srsc {
857e89fb90Srsc   char *os;
867e89fb90Srsc 
877e89fb90Srsc   os = s;
887e89fb90Srsc   if(n <= 0)
897e89fb90Srsc     return os;
907e89fb90Srsc   while(--n > 0 && (*s++ = *t++) != 0)
917e89fb90Srsc     ;
927e89fb90Srsc   *s = 0;
937e89fb90Srsc   return os;
947e89fb90Srsc }
957e89fb90Srsc 
96f32f3638Srsc int
strlen(const char * s)97f32f3638Srsc strlen(const char *s)
98f32f3638Srsc {
99f32f3638Srsc   int n;
100f32f3638Srsc 
101f32f3638Srsc   for(n = 0; s[n]; n++)
102f32f3638Srsc     ;
103f32f3638Srsc   return n;
104f32f3638Srsc }
105f32f3638Srsc 
106