From e37c8462a69d6e442d531886b50c8a33b6b5707c Mon Sep 17 00:00:00 2001 From: Ruslan Isaev Date: Fri, 14 Mar 2025 19:38:41 +0300 Subject: [PATCH] implement basic string functions (memset, memcpy, etc) --- Makefile | 5 ++++- include/string.h | 12 ++++++++++++ src/screen.c | 9 +-------- src/string.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 include/string.h create mode 100644 src/string.c diff --git a/Makefile b/Makefile index 6f800d6..23cdfee 100644 --- a/Makefile +++ b/Makefile @@ -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) diff --git a/include/string.h b/include/string.h new file mode 100644 index 0000000..45904c8 --- /dev/null +++ b/include/string.h @@ -0,0 +1,12 @@ +#ifndef STRING_H +#define STRING_H + +#include + +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 diff --git a/src/screen.c b/src/screen.c index ec648e8..9184df4 100644 --- a/src/screen.c +++ b/src/screen.c @@ -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; diff --git a/src/string.c b/src/string.c new file mode 100644 index 0000000..618fa07 --- /dev/null +++ b/src/string.c @@ -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; +}