implement basic string functions (memset, memcpy, etc)
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
# Define the object files
|
# 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
|
# Define the compiler and assembler
|
||||||
CC = gcc
|
CC = gcc
|
||||||
@@ -39,6 +39,9 @@ bin/idt.o: src/idt.c
|
|||||||
bin/utils.o: src/utils.c
|
bin/utils.o: src/utils.c
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
bin/string.o: src/string.c
|
||||||
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf bin/
|
rm -rf bin/
|
||||||
rm -f $(OUTPUT)
|
rm -f $(OUTPUT)
|
||||||
|
|||||||
@@ -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
@@ -1,5 +1,6 @@
|
|||||||
// screen.c
|
// screen.c
|
||||||
#include "../include/screen.h"
|
#include "../include/screen.h"
|
||||||
|
#include "../include/string.h"
|
||||||
|
|
||||||
static size_t terminal_row;
|
static size_t terminal_row;
|
||||||
static size_t terminal_column;
|
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;
|
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)
|
void terminal_initialize(void)
|
||||||
{
|
{
|
||||||
terminal_row = 0;
|
terminal_row = 0;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user