99 lines
2 KiB
C
99 lines
2 KiB
C
#include <string.h>
|
|
|
|
char *itoa(int value, char *str, int base) {
|
|
char *p = str;
|
|
char *p1, *p2;
|
|
unsigned int uvalue = value;
|
|
int negative = 0;
|
|
|
|
if (base < 2 || base > 36) {
|
|
*str = '\0';
|
|
return str;
|
|
}
|
|
|
|
if (value < 0 && base == 10) {
|
|
negative = 1;
|
|
uvalue = -value;
|
|
}
|
|
|
|
// Convert to string
|
|
do {
|
|
int digit = uvalue % base;
|
|
*p++ = (digit < 10) ? '0' + digit : 'a' + (digit - 10);
|
|
uvalue /= base;
|
|
} while (uvalue);
|
|
|
|
if (negative)
|
|
*p++ = '-';
|
|
|
|
*p = '\0';
|
|
|
|
// Reverse string
|
|
p1 = str;
|
|
p2 = p - 1;
|
|
while (p1 < p2) {
|
|
char tmp = *p1;
|
|
*p1++ = *p2;
|
|
*p2-- = tmp;
|
|
}
|
|
|
|
return str;
|
|
}
|
|
|
|
void *memset(void *dst, int c, size_t length) {
|
|
u8 *ptr = (u8 *)dst;
|
|
const u8 value = (u8)c;
|
|
|
|
while (length--) *(ptr++) = value;
|
|
|
|
return dst;
|
|
}
|
|
|
|
void *memcpy(void *dst, const void *src, size_t len) {
|
|
u8 *d = (u8 *)dst;
|
|
const u8 *s = (const u8 *)src;
|
|
for (size_t i = 0; i < len; i++) {
|
|
d[i] = s[i];
|
|
}
|
|
return dst;
|
|
}
|
|
|
|
void *memmove(void *dst, const void *src, size_t len) {
|
|
u8 *d = (u8 *)dst;
|
|
const u8 *s = (const u8 *)src;
|
|
if (d < s) {
|
|
for (size_t i = 0; i < len; i++) {
|
|
d[i] = s[i];
|
|
}
|
|
} else if (d > s) {
|
|
for (size_t i = len; i > 0; i--) {
|
|
d[i - 1] = s[i - 1];
|
|
}
|
|
}
|
|
return dst;
|
|
}
|
|
|
|
int memcmp(const void *s1, const void *s2, size_t len) {
|
|
const u8 *a = (const u8 *)s1;
|
|
const u8 *b = (const u8 *)s2;
|
|
for (size_t i = 0; i < len; i++) {
|
|
if (a[i] != b[i]) {
|
|
return (int)a[i] - (int)b[i];
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
size_t strlen(const char *s) {
|
|
const char *p = s;
|
|
while (*p) ++p;
|
|
return (size_t)(p - s);
|
|
}
|
|
|
|
size_t strnlen(const char *s, size_t maxlen) {
|
|
size_t len = 0;
|
|
while (len < maxlen && s[len] != '\0') {
|
|
len++;
|
|
}
|
|
return len;
|
|
}
|