forked from PoliEcho-holding-org/kern
Moved all header files into include/ and removed their C counterparts -> code inside .h files Also added a kernel.ld linker file since we don't have many code files in src/ now, i removed src/kernel/ only real code change is that i moved memcopy() and memset() into string.h from system.h
95 lines
1.9 KiB
C
95 lines
1.9 KiB
C
#ifndef STRING_H
|
|
#define STRING_H
|
|
|
|
#include "stdint.h"
|
|
|
|
// Source: http://www.strudel.org.uk/itoa/
|
|
char* itoa(uint32_t val, uint8_t base) {
|
|
static char buf[32] = { 0 };
|
|
|
|
if (base == 0 || base > 16) {
|
|
// TODO: Add errors!!
|
|
return buf;
|
|
}
|
|
|
|
int i = 30;
|
|
for (; val && i; i--, val /= base) {
|
|
buf[i] = "0123456789abcdef"[val % base];
|
|
}
|
|
|
|
return &buf[i + 1];
|
|
}
|
|
|
|
uint32_t atoi(const char* str) {
|
|
uint32_t res = 0;
|
|
|
|
// TODO: Add error checking
|
|
|
|
while (*str >= '0' && *str <= '9') {
|
|
res = res * 10 + (*str++ - '0');
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
int isSpace(char c) {
|
|
if (c == ' ' || c == '\t' || c == '\n') return 1;
|
|
else return 0;
|
|
}
|
|
|
|
// Some implementations taken from https://en.wikibooks.org/wiki/C_Programming/String_manipulation
|
|
char* strcpy(char* str1, const char* str2) {
|
|
char* dst = str1;
|
|
const char* src = str2;
|
|
while ((*dst++ = *src++) != '\0');
|
|
return str1;
|
|
}
|
|
|
|
char* strcat(char* str1, const char* str2) {
|
|
char* s = str1;
|
|
while (*s != '\0') { s++; }
|
|
strcpy(s, str2);
|
|
return str1;
|
|
}
|
|
|
|
char* strchr(const char* str, char c) {
|
|
const char* s = str;
|
|
while (*s != '\0' && *s != c) { s++; }
|
|
return (*s == c) ? (char*)s : 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));
|
|
}
|
|
|
|
uint32_t strlen(const char* str) {
|
|
const char* p = str;
|
|
while (*++p != '\0');
|
|
return (uint32_t)(p - str);
|
|
}
|
|
|
|
// Memory functions
|
|
char* memcopy(char* src, char* dst, uint16_t length) {
|
|
for (int i = 0; i < length; i++) {
|
|
*(dst + i) = *(src + i);
|
|
}
|
|
return dst;
|
|
}
|
|
|
|
char* memset(char* dst, char value, uint16_t length) {
|
|
for (int i = 0; i < length; i++) {
|
|
*(dst + i) = value;
|
|
}
|
|
return dst;
|
|
}
|
|
|
|
#endif
|