Files

235 lines
4.8 KiB
C

/*
* AsterOS Kernel
* Autor: Pavel Kalaš
* Rok: 2026
*
*/
/*
* Tento soubor obsahuje vlastni implementace zakladnich utility funkci.
* Kernel je pouziva misto standardni knihovny pro strlen, strcmp,
* memcpy a memset, aby zustal freestanding a plne pod kontrolou jadra.
*/
#include "string.h"
#ifndef NULL
#define NULL ((void *)0)
#endif
static inline int aster_isspace(char c) {
return (c == ' ' || c == '\t' || c == '\n' ||
c == '\r' || c == '\v' || c == '\f');
}
usize aster_strlen(const char *s) {
usize n = 0;
while (s && s[n]) {
++n;
}
return n;
}
int aster_strcmp(const char *a, const char *b) {
while (*a && (*a == *b)) {
++a;
++b;
}
return (unsigned char)*a - (unsigned char)*b;
}
int aster_strncmp(const char *a, const char *b, usize n) {
usize i;
for (i = 0; i < n; ++i) {
if (a[i] != b[i] || a[i] == '\0' || b[i] == '\0') {
return (unsigned char)a[i] - (unsigned char)b[i];
}
}
return 0;
}
void *aster_memcpy(void *dst, const void *src, usize n) {
usize i;
u8 *d = (u8 *)dst;
const u8 *s = (const u8 *)src;
for (i = 0; i < n; ++i) {
d[i] = s[i];
}
return dst;
}
void *aster_memset(void *dst, int v, usize n) {
usize i;
u8 *d = (u8 *)dst;
for (i = 0; i < n; ++i) {
d[i] = (u8)v;
}
return dst;
}
char *aster_strcpy(char *dst, const char *src) {
char *d = dst;
while ((*d++ = *src++) != '\0')
;
return dst;
}
char *aster_strstr(const char *haystack, const char *needle) {
if (!*needle)
return (char *)haystack;
while (*haystack) {
const char *h = haystack;
const char *n = needle;
while (*h && *n && (*h == *n)) {
++h;
++n;
}
if (!*n)
return (char *)haystack;
++haystack;
}
return NULL;
}
char *aster_trim(char *str) {
if (!str)
return NULL;
while (*str && aster_isspace(*str))
++str;
char *end = str;
while (*end)
++end;
while (end > str && aster_isspace(*(end - 1)))
--end;
*end = '\0';
return str;
}
int aster_substring(char *dst, usize dstsize, const char *src,
usize start, usize length) {
if (!dst || dstsize == 0 || !src)
return -1;
usize srclen = aster_strlen(src);
if (start >= srclen) {
dst[0] = '\0';
return 0;
}
usize max_copy = srclen - start;
if (length > max_copy)
length = max_copy;
if (length >= dstsize)
length = dstsize - 1;
for (usize i = 0; i < length; ++i)
dst[i] = src[start + i];
dst[length] = '\0';
return (int)length;
}
char *aster_remove(char *str, const char *substr) {
if (!str || !substr || !*substr)
return str;
usize sublen = aster_strlen(substr);
char *src = str;
char *dst = str;
while (*src) {
const char *s = src;
const char *sub = substr;
while (*s && *sub && (*s == *sub)) {
++s;
++sub;
}
if (!*sub) {
src += sublen;
} else {
*dst++ = *src++;
}
}
*dst = '\0';
return str;
}
int aster_split(char *str, const char *delim, char **tokens, usize max_tokens) {
if (!str || !delim || !*delim)
return -1;
usize delim_len = aster_strlen(delim);
int count = 0;
char *scan = str;
if (!tokens) {
if (*scan == '\0')
return 0;
while (*scan) {
if (count == 0) {
++count;
}
char *found = aster_strstr(scan, delim);
if (found) {
++count;
scan = found + delim_len;
} else {
break;
}
}
return count;
}
while (*scan && (usize)count < max_tokens) {
tokens[count++] = scan;
char *found = aster_strstr(scan, delim);
if (found) {
*found = '\0';
scan = found + delim_len;
} else {
break;
}
}
if (*scan && (usize)count < max_tokens) {
tokens[count++] = scan;
}
return count;
}
int aster_contains(const char *str, const char *substr) {
return aster_strstr(str, substr) != NULL;
}
int aster_starts_with(const char *str, const char *prefix) {
if (!str || !prefix)
return 0;
while (*prefix) {
if (*str != *prefix)
return 0;
++str;
++prefix;
}
return 1;
}
int aster_ends_with(const char *str, const char *suffix) {
if (!str || !suffix)
return 0;
usize str_len = aster_strlen(str);
usize suffix_len = aster_strlen(suffix);
if (suffix_len > str_len)
return 0;
return aster_strcmp(str + str_len - suffix_len, suffix) == 0;
}