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