Files
kern/boot/stage2/string.c
T

75 lines
1.4 KiB
C

#include "stdint.h"
#include "string.h"
char* itoa(size_t val, int base) {
static char buf[32] = { 0 };
if (base == 0 || base > 16) return NULL;
if (val == 0) {
buf[0] = '0';
buf[1] = '\0';
return buf;
}
int i;
buf[31] = '\0';
for (i = 30; val && i; i--, val /= base) {
buf[i] = "0123456789abcdef"[val % base];
}
return &buf[i + 1];
}
void* memcpy(void* src, void* dst, size_t length) {
uint8_t* p = dst;
size_t i = 0;
while (i < length) p[i] = *(uint8_t*)(src + i);
return dst;
}
void* memset(void* dst, uint8_t val, size_t length) {
uint8_t* p = dst;
size_t i = 0;
while (i < length) p[i++] = val;
return dst;
}
char* strcpy(char* str1, const char* str2) {
char* p = str1;
while (*str2 != '\0') *p++ = *str2++;
return str1;
}
char* strcat(char* str1, const char* str2) {
char* p = str1;
while (*str2++ != '\0');
while (*str2 != '\0') *p++ = *str2++;
return str1;
}
char* strchr(const char* str, char c) {
char* p = (char*)str;
while (*p != '\0' && *p != c) p++;
return (*p == c) ? p : NULL;
}
int strcmp(const char* str1, const char* str2) {
while (*str1 != '\0' && *str1 == *str2) {
str1++;
str2++;
}
uint8_t c1 = (*(uint8_t*)str1);
uint8_t c2 = (*(uint8_t*)str2);
return ((c1 < c2) ? -1 : (c1 > c2));
}
size_t strlen(const char* str) {
size_t len = 0;
while (str[len++] != '\0');
return len;
}