diff --git a/klibc/include/string.h b/klibc/include/string.h index 4f01fc1..843ed88 100644 --- a/klibc/include/string.h +++ b/klibc/include/string.h @@ -3,12 +3,13 @@ #include -extern int memcmp(const void* s1, const void* s2, size_t n); -extern void* memmove(void* dst, const void* src, size_t n); -extern void* memcpy(void* dst, const void* src, size_t n); -extern void* memset(void* dst, int c, size_t n); +extern int memcmp(const void *s1, const void *s2, size_t n); +extern void *memmove(void *dst, const void *src, size_t n); +extern void *memcpy(void *dst, const void *src, size_t n); +extern void *memset(void *dst, int c, size_t n); -extern size_t strlen(const char* s); -extern int strcmp(const char* s1, const char* s2); +extern size_t strlen(const char *s); +extern int strcmp(const char *s1, const char *s2); +extern char *strncpy(char *dst, const char *src, size_t n); #endif // CLASSICOS_KLIBC_STRING_H diff --git a/klibc/src/string.c b/klibc/src/string.c index a9a8a84..21495ce 100644 --- a/klibc/src/string.c +++ b/klibc/src/string.c @@ -1,8 +1,8 @@ #include -int memcmp(const void* s1, const void* s2, size_t n) { - const unsigned char* c1 = s1; - const unsigned char* c2 = s2; +int memcmp(const void *s1, const void *s2, size_t n) { + const unsigned char *c1 = s1; + const unsigned char *c2 = s2; int d = 0; while (n--) { @@ -13,9 +13,9 @@ int memcmp(const void* s1, const void* s2, size_t n) { return d; } -void* memmove(void* dst, const void* src, size_t n) { - const char* p = src; - char* q = dst; +void *memmove(void *dst, const void *src, size_t n) { + const char *p = src; + char *q = dst; #if defined(__i386__) || defined(__x86_64__) if (q < p) { __asm__ volatile("cld; rep; movsb" : "+c"(n), "+S"(p), "+D"(q)); @@ -41,19 +41,19 @@ void* memmove(void* dst, const void* src, size_t n) { return dst; } -void* memcpy(void* dst, const void* src, size_t n) { - const char* p = src; - char* q = dst; +void *memcpy(void *dst, const void *src, size_t n) { + const char *p = src; + char *q = dst; #if defined(__i386__) size_t nl = n >> 2; __asm__ volatile("cld ; rep ; movsl ; movl %3,%0 ; rep ; movsb" - : "+c"(nl), "+S"(p), "+D"(q) - : "r"(n & 3)); + : "+c"(nl), "+S"(p), "+D"(q) + : "r"(n & 3)); #elif defined(__x86_64__) size_t nq = n >> 3; __asm__ volatile("cld ; rep ; movsq ; movl %3,%%ecx ; rep ; movsb" - : "+c"(nq), "+S"(p), "+D"(q) - : "r"((uint32_t)(n & 7))); + : "+c"(nq), "+S"(p), "+D"(q) + : "r"((uint32_t)(n & 7))); #else while (n--) { *q++ = *p++; @@ -63,20 +63,20 @@ void* memcpy(void* dst, const void* src, size_t n) { return dst; } -void* memset(void* dst, int c, size_t n) { - char* q = dst; +void *memset(void *dst, int c, size_t n) { + char *q = dst; #if defined(__i386__) size_t nl = n >> 2; __asm__ volatile("cld ; rep ; stosl ; movl %3,%0 ; rep ; stosb" - : "+c"(nl), "+D"(q) - : "a"((unsigned char)c * 0x01010101U), "r"(n & 3)); + : "+c"(nl), "+D"(q) + : "a"((unsigned char)c * 0x01010101U), "r"(n & 3)); #elif defined(__x86_64__) size_t nq = n >> 3; __asm__ volatile("cld ; rep ; stosq ; movl %3,%%ecx ; rep ; stosb" - : "+c"(nq), "+D"(q) - : "a"((unsigned char)c * 0x0101010101010101U), - "r"((uint32_t)n & 7)); + : "+c"(nq), "+D"(q) + : "a"((unsigned char)c * 0x0101010101010101U), + "r"((uint32_t)n & 7)); #else while (n--) { *q++ = c; @@ -86,15 +86,15 @@ void* memset(void* dst, int c, size_t n) { return dst; } -size_t strlen(const char* s) { - const char* ss = s; +size_t strlen(const char *s) { + const char *ss = s; while (*ss) ss++; return ss - s; } -int strcmp(const char* s1, const char* s2) { - const unsigned char* c1 = (const unsigned char*)s1; - const unsigned char* c2 = (const unsigned char*)s2; +int strcmp(const char *s1, const char *s2) { + const unsigned char *c1 = (const unsigned char *)s1; + const unsigned char *c2 = (const unsigned char *)s2; unsigned char ch; int d = 0; @@ -105,3 +105,19 @@ int strcmp(const char* s1, const char* s2) { return d; } + +char *strncpy(char *dst, const char *src, size_t n) { + char *q = dst; + const char *p = src; + char ch; + + while (n) { + n--; + *q++ = ch = *p++; + if (!ch) break; + } + + memset(q, 0, n); + + return dst; +}