diff --git a/docs/USERS.md b/docs/USERS.md index 44a2e2c..dfbd61e 100644 --- a/docs/USERS.md +++ b/docs/USERS.md @@ -69,9 +69,9 @@ Clears the screen by scrolling (screen height) times. A math lexer & parser that can calculate simple arithmetic operations. Adding, subtracting, multiplying, dividing, and factoring are supported. (I plan to get support for trigonometric functions maybe) -#### `bf` +#### `bf ` -A brainfuck interpreter with every instruction and default tape size (30k cells). +A brainfuck interpreter with every instruction and default tape size (30k cells). Takes an optional argument, the filename for a Brainfuck source file. #### `uptime` diff --git a/src/initrd/hello.bf b/src/initrd/hello.bf new file mode 100644 index 0000000..5a39f53 --- /dev/null +++ b/src/initrd/hello.bf @@ -0,0 +1 @@ +-[------->+<]>-.-[->+++++<]>++.+++++++..+++.[--->+<]>-----.---[->+++<]>.-[--->+<]>---.+++.------.--------. diff --git a/src/kernel/initrd.c b/src/kernel/initrd.c index 384549c..45f2e08 100644 --- a/src/kernel/initrd.c +++ b/src/kernel/initrd.c @@ -102,3 +102,33 @@ void cat_initrd(uint8_t* initrd, const char* filename) printf("File '%s' not found\n", filename); } + +int tar_file_to_buffer(uint8_t* initrd, const char* filename, char* buffer) +{ + uint8_t* current_block = initrd; + + while (1) + { + if (current_block[0] == '\0') + { + //puts("[tar] EOF\n"); + return -1; + } + + const char* file_name = (const char*)current_block; + uint32_t file_size = tar_parse_size((const char*)(current_block+124)); + + if (strcmp(file_name, filename) == 0) + { + uint8_t* file_data = current_block + TAR_BLOCK_SIZE; + memcpy(buffer, file_data, file_size); + buffer[file_size] = '\0'; + return 0; + } + + uint32_t total_size = ((file_size + TAR_BLOCK_SIZE - 1) / TAR_BLOCK_SIZE) * TAR_BLOCK_SIZE; + current_block += TAR_BLOCK_SIZE + total_size; + } + printf("[tar] file '%s' not found\n", filename); + return -1; +} diff --git a/src/kernel/initrd.h b/src/kernel/initrd.h index 2bc28ee..4568607 100644 --- a/src/kernel/initrd.h +++ b/src/kernel/initrd.h @@ -33,5 +33,6 @@ typedef struct void tar_find_file(uint8_t *tar_start, const char* filename); void ls_initrd(uint8_t* initrd); void cat_initrd(uint8_t* initrd, const char* filename); +int tar_file_to_buffer(uint8_t* initrd, const char* filename, char* buffer); #endif diff --git a/src/kernel/system.c b/src/kernel/system.c index c2766f5..5af9b8e 100644 --- a/src/kernel/system.c +++ b/src/kernel/system.c @@ -34,6 +34,18 @@ void *memmove(void* dest, const void* src, size_t n) return dest; } +void *memcpy(void* dest, const void* src, uint32_t n) +{ + uint8_t* d = (uint8_t*)dest; + const uint8_t* s = (const uint8_t*)src; + + for (uint32_t i=0; i