riscv-pke/util/string.c

110 lines
2.0 KiB
C

// See LICENSE for license details.
#include <stdint.h>
#include <ctype.h>
#include "string.h"
void* memcpy(void* dest, const void* src, size_t len) {
const char* s = src;
char* d = dest;
if ((((uintptr_t)dest | (uintptr_t)src) & (sizeof(uintptr_t) - 1)) == 0) {
while ((void*)d < (dest + len - (sizeof(uintptr_t) - 1))) {
*(uintptr_t*)d = *(const uintptr_t*)s;
d += sizeof(uintptr_t);
s += sizeof(uintptr_t);
}
}
while (d < (char*)(dest + len)) *d++ = *s++;
return dest;
}
void* memset(void* dest, int byte, size_t len) {
if ((((uintptr_t)dest | len) & (sizeof(uintptr_t) - 1)) == 0) {
uintptr_t word = byte & 0xFF;
word |= word << 8;
word |= word << 16;
word |= word << 16 << 16;
uintptr_t* d = dest;
while (d < (uintptr_t*)(dest + len)) *d++ = word;
} else {
char* d = dest;
while (d < (char*)(dest + len)) *d++ = byte;
}
return dest;
}
size_t strlen(const char* s) {
const char* p = s;
while (*p) p++;
return p - s;
}
int strcmp(const char* s1, const char* s2) {
unsigned char c1, c2;
do {
c1 = *s1++;
c2 = *s2++;
} while (c1 != 0 && c1 == c2);
return c1 - c2;
}
char* strcpy(char* dest, const char* src) {
char* d = dest;
while ((*d++ = *src++))
;
return dest;
}
long atol(const char* str) {
long res = 0;
int sign = 0;
while (*str == ' ') str++;
if (*str == '-' || *str == '+') {
sign = *str == '-';
str++;
}
while (*str) {
res *= 10;
res += *str++ - '0';
}
return sign ? -res : res;
}
void* memmove(void* dst, const void* src, size_t n) {
const char* s;
char* d;
s = src;
d = dst;
if (s < d && s + n > d) {
s += n;
d += n;
while (n-- > 0) *--d = *--s;
} else
while (n-- > 0) *d++ = *s++;
return dst;
}
// Like strncpy but guaranteed to NUL-terminate.
char* safestrcpy(char* s, const char* t, int n) {
char* os;
os = s;
if (n <= 0) return os;
while (--n > 0 && (*s++ = *t++) != 0)
;
*s = 0;
return os;
}