implement basic string functions (memset, memcpy, etc)

This commit is contained in:
2025-03-14 19:38:41 +03:00
parent ab775bd958
commit e37c8462a6
4 changed files with 67 additions and 9 deletions
+4 -1
View File
@@ -1,5 +1,5 @@
# Define the object files
OBJS = bin/boot.o bin/kernel.o bin/idt.o bin/isr.o bin/screen.o bin/utils.o
OBJS = bin/boot.o bin/kernel.o bin/idt.o bin/isr.o bin/screen.o bin/utils.o bin/string.o
# Define the compiler and assembler
CC = gcc
@@ -39,6 +39,9 @@ bin/idt.o: src/idt.c
bin/utils.o: src/utils.c
$(CC) $(CFLAGS) -c $< -o $@
bin/string.o: src/string.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -rf bin/
rm -f $(OUTPUT)
+12
View File
@@ -0,0 +1,12 @@
#ifndef STRING_H
#define STRING_H
#include <stddef.h>
int memcmp(const void*, const void*, size_t);
void* memcpy(void* __restrict, const void* __restrict, size_t);
void* memmove(void*, const void*, size_t);
void* memset(void*, int, size_t);
size_t strlen(const char*);
#endif
+1 -8
View File
@@ -1,5 +1,6 @@
// screen.c
#include "../include/screen.h"
#include "../include/string.h"
static size_t terminal_row;
static size_t terminal_column;
@@ -16,14 +17,6 @@ inline uint16_t vga_entry(unsigned char uc, uint8_t color)
return (uint16_t) uc | (uint16_t) color << 8;
}
size_t strlen(const char* str)
{
size_t len = 0;
while (str[len])
len++;
return len;
}
void terminal_initialize(void)
{
terminal_row = 0;
+50
View File
@@ -0,0 +1,50 @@
#include "../include/string.h"
int memcmp(const void* aptr, const void* bptr, size_t size)
{
const unsigned char* a = (const unsigned char*) aptr;
const unsigned char* b = (const unsigned char*) bptr;
for (size_t i = 0; i < size; i++) {
if (a[i] < b[i])
return -1;
else if (b[i] < a[i])
return 1;
}
return 0;
}
void* memcpy(void* restrict dstptr, const void* restrict srcptr, size_t size) {
unsigned char* dst = (unsigned char*) dstptr;
const unsigned char* src = (const unsigned char*) srcptr;
for (size_t i = 0; i < size; i++)
dst[i] = src[i];
return dstptr;
}
void* memmove(void* dstptr, const void* srcptr, size_t size) {
unsigned char* dst = (unsigned char*) dstptr;
const unsigned char* src = (const unsigned char*) srcptr;
if (dst < src) {
for (size_t i = 0; i < size; i++)
dst[i] = src[i];
} else {
for (size_t i = size; i != 0; i--)
dst[i-1] = src[i-1];
}
return dstptr;
}
void* memset(void* bufptr, int value, size_t size) {
unsigned char* buf = (unsigned char*) bufptr;
for (size_t i = 0; i < size; i++)
buf[i] = (unsigned char) value;
return bufptr;
}
size_t strlen(const char* str)
{
size_t len = 0;
while(str[len])
len++;
return len;
}