string.c (1449B)
1 #include "types.h" 2 #include "x86.h" 3 4 void* 5 memset(void *dst, int c, uint n) 6 { 7 if ((uintp)dst%4 == 0 && n%4 == 0){ 8 c &= 0xFF; 9 stosl(dst, (c<<24)|(c<<16)|(c<<8)|c, n/4); 10 } else 11 stosb(dst, c, n); 12 return dst; 13 } 14 15 int 16 memcmp(const void *v1, const void *v2, uint n) 17 { 18 const uchar *s1, *s2; 19 20 s1 = v1; 21 s2 = v2; 22 while(n-- > 0){ 23 if(*s1 != *s2) 24 return *s1 - *s2; 25 s1++, s2++; 26 } 27 28 return 0; 29 } 30 31 void* 32 memmove(void *dst, const void *src, uint n) 33 { 34 const char *s; 35 char *d; 36 37 s = src; 38 d = dst; 39 if(s < d && s + n > d){ 40 s += n; 41 d += n; 42 while(n-- > 0) 43 *--d = *--s; 44 } else 45 while(n-- > 0) 46 *d++ = *s++; 47 48 return dst; 49 } 50 51 // memcpy exists to placate GCC. Use memmove. 52 void* 53 memcpy(void *dst, const void *src, uint n) 54 { 55 return memmove(dst, src, n); 56 } 57 58 int 59 strncmp(const char *p, const char *q, uint n) 60 { 61 while(n > 0 && *p && *p == *q) 62 n--, p++, q++; 63 if(n == 0) 64 return 0; 65 return (uchar)*p - (uchar)*q; 66 } 67 68 char* 69 strncpy(char *s, const char *t, int n) 70 { 71 char *os; 72 73 os = s; 74 while(n-- > 0 && (*s++ = *t++) != 0) 75 ; 76 while(n-- > 0) 77 *s++ = 0; 78 return os; 79 } 80 81 // Like strncpy but guaranteed to NUL-terminate. 82 char* 83 safestrcpy(char *s, const char *t, int n) 84 { 85 char *os; 86 87 os = s; 88 if(n <= 0) 89 return os; 90 while(--n > 0 && (*s++ = *t++) != 0) 91 ; 92 *s = 0; 93 return os; 94 } 95 96 int 97 strlen(const char *s) 98 { 99 int n; 100 101 for(n = 0; s[n]; n++) 102 ; 103 return n; 104 } 105