diff --git a/kernel/Makefile b/kernel/Makefile index 75de815d..3b63c7ab 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -18,11 +18,13 @@ CPP_FLAGS_64=$(COMMON_CPP_FLAGS) -mno-sse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 LINK_FLAGS=-lgcc -T linker.ld KERNEL_CPP_FILES=$(wildcard src/*.cpp) +KERNEL_CPP_STL_FILES=$(wildcard src/stl/*.cpp) + +KERNEL_D_FILES=$(KERNEL_CPP_FILES:%.cpp=%.cpp.d) +KERNEL_D_STL_FILES=$(KERNEL_CPP_STL_FILES:%.cpp=%.cpp.d) #TODO Generate also the o files coming from s files automatically, ignoring crti and crtn -KERNEL_O_FILES=boot_16_64.o boot_32_64.o $(KERNEL_CPP_FILES:src/%.cpp=%.cpp.o) isrs.s.o irqs.s.o arch.s.o - -KERNEL_D_FILES=$(KERNEL_CPP_FILES:src/%.cpp=%.cpp.d) +KERNEL_O_FILES=boot_16_64.o boot_32_64.o $(KERNEL_CPP_FILES:%.cpp=%.cpp.o) $(KERNEL_CPP_STL_FILES:%.cpp=%.cpp.o) isrs.s.o irqs.s.o arch.s.o CRTBEGIN_OBJ:=$(shell $(CC) $(CFLAGS) -print-file-name=crtbegin.o) CRTEND_OBJ:=$(shell $(CC) $(CFLAGS) -print-file-name=crtend.o) @@ -44,19 +46,33 @@ boot_32_64.o: boot_32.o %.s.o: src/%.s $(AS) -c $< -o $@ -%.cpp.d: $(KERNEL_CPP_FILES) - @ $(CC) $(CPP_FLAGS_64) $(THOR_FLAGS) $(WARNING_FLAGS) -MM -MT $*.cpp.o src/$*.cpp | sed -e 's@^\(.*\)\.o:@\1.d \1.o:@' > $@ +src/%.cpp.d: $(KERNEL_CPP_FILES) + @ $(CC) $(CPP_FLAGS_64) $(THOR_FLAGS) $(WARNING_FLAGS) -MM -MT src/$*.cpp.o src/$*.cpp | sed -e 's@^\(.*\)\.o:@\1.d \1.o:@' > $@ -%.cpp.o: +src/stl/%.cpp.d: $(KERNEL_CPP_STL_FILES) + @ $(CC) $(CPP_FLAGS_64) $(THOR_FLAGS) $(WARNING_FLAGS) -MM -MT src/stl/$*.cpp.o src/stl/$*.cpp | sed -e 's@^\(.*\)\.o:@\1.d \1.o:@' > $@ + +src/%.cpp.o: + $(CC) $(CPP_FLAGS_64) $(THOR_FLAGS) $(WARNING_FLAGS) -c $< -o $@ + +src/stl/%.cpp.o: $(CC) $(CPP_FLAGS_64) $(THOR_FLAGS) $(WARNING_FLAGS) -c $< -o $@ -include $(KERNEL_D_FILES) +-include $(KERNEL_D_STL_FILES) kernel.bin: $(LINK_O_FILES) $(CC) $(LINK_FLAGS) $(CPP_FLAGS_64) -o kernel.bin.o $(LINK_O_FILES) $(OC) -R .note -R .comment -S -O binary kernel.bin.o kernel.bin +debug: + echo $(KERNEL_CPP_STL_FILES) + echo $(KERNEL_D_STL_FILES) + clean: - rm -f *.o + rm -f $(KERNEL_D_FILES) + rm -f $(KERNEL_D_STL_FILES) + rm -f $(KERNEL_O_FILES) + rm -f crti.o + rm -f crts.o rm -f *.bin - rm -f *.d diff --git a/kernel/include/ata.hpp b/kernel/include/ata.hpp index 89732bd6..173c990b 100644 --- a/kernel/include/ata.hpp +++ b/kernel/include/ata.hpp @@ -8,7 +8,7 @@ #ifndef ATA_H #define ATA_H -#include "types.hpp" +#include "stl/types.hpp" namespace ata { diff --git a/kernel/include/console.hpp b/kernel/include/console.hpp index f0cdd76f..ebb6ba79 100644 --- a/kernel/include/console.hpp +++ b/kernel/include/console.hpp @@ -8,9 +8,9 @@ #ifndef CONSOLE_H #define CONSOLE_H -#include "types.hpp" -#include "enable_if.hpp" -#include "string.hpp" +#include "stl/types.hpp" +#include "stl/enable_if.hpp" +#include "stl/string.hpp" void set_column(long column); long get_column(); @@ -23,7 +23,7 @@ void k_print(char key); void k_print(const char* string); void k_print(const char* string, uint64_t end); -void k_print(const string& s); +void k_print(const std::string& s); void k_print(uint8_t number); void k_print(uint16_t number); diff --git a/kernel/include/disks.hpp b/kernel/include/disks.hpp index e29c072f..0d403fb1 100644 --- a/kernel/include/disks.hpp +++ b/kernel/include/disks.hpp @@ -8,10 +8,10 @@ #ifndef DISKS_H #define DISKS_H -#include "types.hpp" -#include "array.hpp" -#include "vector.hpp" -#include "string.hpp" +#include "stl/types.hpp" +#include "stl/array.hpp" +#include "stl/vector.hpp" +#include "stl/string.hpp" namespace disks { @@ -38,7 +38,7 @@ struct partition_descriptor { }; struct file { - string file_name; + std::string file_name; bool directory; bool hidden; bool system; @@ -66,13 +66,13 @@ void unmount(); vector ls(); uint64_t free_size(); -string read_file(const string& file); +std::string read_file(const std::string& file); const disk_descriptor* mounted_disk(); const partition_descriptor* mounted_partition(); //TODO It is not a really good practice to directly expose the vector -vector& current_directory(); +vector& current_directory(); } diff --git a/kernel/include/e820.hpp b/kernel/include/e820.hpp index a875bdf7..61694fdb 100644 --- a/kernel/include/e820.hpp +++ b/kernel/include/e820.hpp @@ -12,7 +12,7 @@ */ #ifndef CODE_16 -#include "types.hpp" +#include "stl/types.hpp" #endif #ifndef E820_HPP diff --git a/kernel/include/fat32.hpp b/kernel/include/fat32.hpp index bd21ecec..e7188090 100644 --- a/kernel/include/fat32.hpp +++ b/kernel/include/fat32.hpp @@ -9,16 +9,17 @@ #define FAT32_H #include "disks.hpp" -#include "vector.hpp" -#include "string.hpp" + +#include "stl/vector.hpp" +#include "stl/string.hpp" namespace fat32 { typedef const disks::disk_descriptor& dd; uint64_t free_size(dd disk, const disks::partition_descriptor& partition); -vector ls(dd disk, const disks::partition_descriptor& partition, const vector& path); -string read_file(dd disk, const disks::partition_descriptor& partition, const vector& path, const string& file); +vector ls(dd disk, const disks::partition_descriptor& partition, const vector& path); +std::string read_file(dd disk, const disks::partition_descriptor& partition, const vector& path, const std::string& file); } diff --git a/kernel/include/interrupts.hpp b/kernel/include/interrupts.hpp index b80f9eb6..adca804a 100644 --- a/kernel/include/interrupts.hpp +++ b/kernel/include/interrupts.hpp @@ -8,7 +8,7 @@ #ifndef INTERRUPTS_H #define INTERRUPTS_H -#include "types.hpp" +#include "stl/types.hpp" namespace interrupt { diff --git a/kernel/include/kernel_utils.hpp b/kernel/include/kernel_utils.hpp index 5f16e4fd..e5b5d388 100644 --- a/kernel/include/kernel_utils.hpp +++ b/kernel/include/kernel_utils.hpp @@ -8,7 +8,7 @@ #ifndef KERNEL_UTILS_H #define KERNEL_UTILS_H -#include "types.hpp" +#include "stl/types.hpp" uint8_t in_byte(uint16_t _port); void out_byte(uint16_t _port, uint8_t _data); diff --git a/kernel/include/keyboard.hpp b/kernel/include/keyboard.hpp index e6701d05..5672ab5e 100644 --- a/kernel/include/keyboard.hpp +++ b/kernel/include/keyboard.hpp @@ -8,7 +8,7 @@ #ifndef KEYBOARD_H #define KEYBOARD_H -#include "types.hpp" +#include "stl/types.hpp" namespace keyboard { diff --git a/kernel/include/memory.hpp b/kernel/include/memory.hpp index 3bfeca1e..a01acd66 100644 --- a/kernel/include/memory.hpp +++ b/kernel/include/memory.hpp @@ -8,7 +8,7 @@ #ifndef MEMORY_H #define MEMORY_H -#include "types.hpp" +#include "stl/types.hpp" void init_memory_manager(); diff --git a/kernel/include/paging.hpp b/kernel/include/paging.hpp index 5cbee304..04f65f9b 100644 --- a/kernel/include/paging.hpp +++ b/kernel/include/paging.hpp @@ -8,7 +8,7 @@ #ifndef PAGING_H #define PAGING_H -#include "types.hpp" +#include "stl/types.hpp" namespace paging { diff --git a/kernel/include/utils.hpp b/kernel/include/stl/algorithms.hpp similarity index 88% rename from kernel/include/utils.hpp rename to kernel/include/stl/algorithms.hpp index aac29e21..17ece33d 100644 --- a/kernel/include/utils.hpp +++ b/kernel/include/stl/algorithms.hpp @@ -5,10 +5,8 @@ // http://www.boost.org/LICENSE_1_0.txt) //======================================================================= -#ifndef UTILS_H -#define UTILS_H - -#include "types.hpp" +#ifndef ALGORITHMS_H +#define ALGORITHMS_H namespace std { @@ -90,14 +88,4 @@ bool equal_n(Iterator1 it1, Iterator2 it2, size_t n){ } //end of namespace std -template -struct basic_string; -typedef basic_string string; - -uint64_t parse(const char* str); -uint64_t parse(const char* str, const char* end); -uint64_t parse(const string& str); - -uint64_t str_len(const char* a); - #endif diff --git a/kernel/include/array.hpp b/kernel/include/stl/array.hpp similarity index 100% rename from kernel/include/array.hpp rename to kernel/include/stl/array.hpp diff --git a/kernel/include/enable_if.hpp b/kernel/include/stl/enable_if.hpp similarity index 100% rename from kernel/include/enable_if.hpp rename to kernel/include/stl/enable_if.hpp diff --git a/kernel/include/optional.hpp b/kernel/include/stl/optional.hpp similarity index 98% rename from kernel/include/optional.hpp rename to kernel/include/stl/optional.hpp index 1874ddcb..5619669d 100644 --- a/kernel/include/optional.hpp +++ b/kernel/include/stl/optional.hpp @@ -8,7 +8,7 @@ #ifndef OPTIONAL_H #define OPTIONAL_H -#include "utils.hpp" +#include "algorithms.hpp" struct dummy_t {}; diff --git a/kernel/include/pair.hpp b/kernel/include/stl/pair.hpp similarity index 100% rename from kernel/include/pair.hpp rename to kernel/include/stl/pair.hpp diff --git a/kernel/include/string.hpp b/kernel/include/stl/string.hpp similarity index 93% rename from kernel/include/string.hpp rename to kernel/include/stl/string.hpp index ad1aee64..2705bbb7 100644 --- a/kernel/include/string.hpp +++ b/kernel/include/stl/string.hpp @@ -8,8 +8,13 @@ #ifndef STRING_H #define STRING_H -#include "types.hpp" -#include "utils.hpp" +#include "stl/types.hpp" +#include "stl/algorithms.hpp" +#include "stl/vector.hpp" + +namespace std { + +uint64_t str_len(const char* a); template struct basic_string { @@ -208,4 +213,12 @@ public: typedef basic_string string; +uint64_t parse(const char* str); +uint64_t parse(const char* str, const char* end); +uint64_t parse(const string& str); + +vector split(const string& s); + +} //end of namespace std + #endif diff --git a/kernel/include/types.hpp b/kernel/include/stl/types.hpp similarity index 100% rename from kernel/include/types.hpp rename to kernel/include/stl/types.hpp diff --git a/kernel/include/unique_ptr.hpp b/kernel/include/stl/unique_ptr.hpp similarity index 100% rename from kernel/include/unique_ptr.hpp rename to kernel/include/stl/unique_ptr.hpp diff --git a/kernel/include/vector.hpp b/kernel/include/stl/vector.hpp similarity index 96% rename from kernel/include/vector.hpp rename to kernel/include/stl/vector.hpp index f4e3d181..31944d3b 100644 --- a/kernel/include/vector.hpp +++ b/kernel/include/stl/vector.hpp @@ -8,15 +8,15 @@ #ifndef VECTOR_H #define VECTOR_H -#include "types.hpp" -#include "utils.hpp" +#include "stl/types.hpp" +#include "stl/algorithms.hpp" template class vector { public: typedef T value_type; typedef value_type* pointer_type; - typedef uint64_t size_type; + typedef size_t size_type; typedef value_type* iterator; typedef const value_type* const_iterator; diff --git a/kernel/include/sysinfo.hpp b/kernel/include/sysinfo.hpp index bf1eaba9..bc16afa5 100644 --- a/kernel/include/sysinfo.hpp +++ b/kernel/include/sysinfo.hpp @@ -8,9 +8,9 @@ #ifndef SYSINFO_H #define SYSINFO_H -#include "string.hpp" -#include "vector.hpp" +#include "stl/string.hpp" +#include "stl/vector.hpp" -void sysinfo_command(const vector& params); +void sysinfo_command(const vector& params); #endif diff --git a/kernel/include/thor.hpp b/kernel/include/thor.hpp index 1e4566bc..dedda1de 100644 --- a/kernel/include/thor.hpp +++ b/kernel/include/thor.hpp @@ -8,7 +8,7 @@ #ifndef THOR_H #define THOR_H -#include "types.hpp" +#include "stl/types.hpp" void* operator new(uint64_t size); void operator delete(void* p); diff --git a/kernel/include/timer.hpp b/kernel/include/timer.hpp index f8cd0118..3ded4760 100644 --- a/kernel/include/timer.hpp +++ b/kernel/include/timer.hpp @@ -8,7 +8,7 @@ #ifndef TIMER_H #define TIMER_H -#include "types.hpp" +#include "stl/types.hpp" void install_timer(); void sleep_ms(uint64_t delay); diff --git a/kernel/src/acpi.cpp b/kernel/src/acpi.cpp index 4e6034af..30262425 100644 --- a/kernel/src/acpi.cpp +++ b/kernel/src/acpi.cpp @@ -6,13 +6,13 @@ //======================================================================= #include "acpi.hpp" -#include "types.hpp" #include "kernel_utils.hpp" #include "timer.hpp" #include "paging.hpp" - #include "console.hpp" +#include "stl/types.hpp" + namespace { uint32_t SMI_CMD; //ptr diff --git a/kernel/src/algorithms.cpp b/kernel/src/algorithms.cpp deleted file mode 100644 index 010c1575..00000000 --- a/kernel/src/algorithms.cpp +++ /dev/null @@ -1,30 +0,0 @@ -//======================================================================= -// Copyright Baptiste Wicht 2013. -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -//======================================================================= - -#include "algorithms.hpp" -#include "utils.hpp" - -vector split(const string& s){ - vector parts; - - string current(s.size()); - - for(char c : s){ - if(c == ' ' && !current.empty()){ - parts.push_back(current); - current.clear(); - } else { - current += c; - } - } - - if(!current.empty()){ - parts.push_back(current); - } - - return std::move(parts); -} diff --git a/kernel/src/console.cpp b/kernel/src/console.cpp index a2ceb9ff..bd731c07 100644 --- a/kernel/src/console.cpp +++ b/kernel/src/console.cpp @@ -8,8 +8,9 @@ #include #include "console.hpp" -#include "types.hpp" -#include "utils.hpp" + +#include "stl/types.hpp" +#include "stl/string.hpp" namespace { @@ -166,7 +167,7 @@ void k_print(const char* str){ } } -void k_print(const string& s){ +void k_print(const std::string& s){ for(auto c : s){ k_print(c); } diff --git a/kernel/src/disks.cpp b/kernel/src/disks.cpp index c68eca07..b2f4511e 100644 --- a/kernel/src/disks.cpp +++ b/kernel/src/disks.cpp @@ -5,15 +5,15 @@ // http://www.boost.org/LICENSE_1_0.txt) //======================================================================= -#include "unique_ptr.hpp" -#include "array.hpp" - #include "disks.hpp" #include "ata.hpp" #include "thor.hpp" #include "console.hpp" #include "fat32.hpp" -#include "utils.hpp" + +#include "stl/unique_ptr.hpp" +#include "stl/array.hpp" +#include "stl/string.hpp" namespace { @@ -44,7 +44,7 @@ static_assert(sizeof(boot_record_t) == 512, "The boot record is 512 bytes long") const disks::disk_descriptor* _mounted_disk; const disks::partition_descriptor* _mounted_partition; -vector pwd; +vector pwd; } //end of anonymous namespace @@ -226,11 +226,11 @@ uint64_t disks::free_size(){ return fat32::free_size(*_mounted_disk, *_mounted_partition); } -vector& disks::current_directory(){ +vector& disks::current_directory(){ return pwd; } -string disks::read_file(const string& file){ +std::string disks::read_file(const std::string& file){ if(!_mounted_disk || !_mounted_partition){ return ""; } diff --git a/kernel/src/fat32.cpp b/kernel/src/fat32.cpp index e9dba897..4d4fb269 100644 --- a/kernel/src/fat32.cpp +++ b/kernel/src/fat32.cpp @@ -5,13 +5,13 @@ // http://www.boost.org/LICENSE_1_0.txt) //======================================================================= -#include "unique_ptr.hpp" - #include "fat32.hpp" -#include "types.hpp" #include "console.hpp" -#include "utils.hpp" -#include "pair.hpp" + +#include "stl/types.hpp" +#include "stl/unique_ptr.hpp" +#include "stl/algorithms.hpp" +#include "stl/pair.hpp" namespace { @@ -197,7 +197,7 @@ size_t filename_length(char* filename){ return 11; } -bool filename_equals(char* name, const string& path){ +bool filename_equals(char* name, const std::string& path){ auto length = filename_length(name); if(path.size() != length){ @@ -228,7 +228,7 @@ bool cache_disk_partition(fat32::dd disk, const disks::partition_descriptor& par return fat_bs && fat_is; } -pair> find_cluster(fat32::dd disk, const vector& path){ +pair> find_cluster(fat32::dd disk, const vector& path){ auto cluster_addr = cluster_lba(fat_bs->root_directory_cluster_start); unique_heap_array current_cluster(16 * fat_bs->sectors_per_cluster); @@ -286,7 +286,7 @@ uint64_t fat32::free_size(dd disk, const disks::partition_descriptor& partition) return fat_is->free_clusters * fat_bs->sectors_per_cluster * 512; } -vector fat32::ls(dd disk, const disks::partition_descriptor& partition, const vector& path){ +vector fat32::ls(dd disk, const disks::partition_descriptor& partition, const vector& path){ if(!cache_disk_partition(disk, partition)){ return {}; } @@ -300,7 +300,7 @@ vector fat32::ls(dd disk, const disks::partition_descriptor& partit } } -string fat32::read_file(dd disk, const disks::partition_descriptor& partition, const vector& path, const string& file){ +std::string fat32::read_file(dd disk, const disks::partition_descriptor& partition, const vector& path, const std::string& file){ if(!cache_disk_partition(disk, partition)){ return {}; } @@ -327,7 +327,7 @@ string fat32::read_file(dd disk, const disks::partition_descriptor& partition, c fat_bs->sectors_per_cluster, sector.get())){ found = true; - string content(entry.file_size + 1); + std::string content(entry.file_size + 1); for(size_t i = 0; i < entry.file_size; ++i){ content += sector[i]; diff --git a/kernel/src/interrupts.cpp b/kernel/src/interrupts.cpp index 6b4f9b51..2c3b0e92 100644 --- a/kernel/src/interrupts.cpp +++ b/kernel/src/interrupts.cpp @@ -6,8 +6,6 @@ //======================================================================= #include "interrupts.hpp" -#include "types.hpp" -#include "utils.hpp" #include "console.hpp" #include "kernel_utils.hpp" #include "gdt.hpp" @@ -15,6 +13,8 @@ #include "isrs.hpp" #include "irqs.hpp" +#include "stl/types.hpp" + namespace { struct idt_entry { diff --git a/kernel/src/paging.cpp b/kernel/src/paging.cpp index 68b6fd39..fedcd167 100644 --- a/kernel/src/paging.cpp +++ b/kernel/src/paging.cpp @@ -6,11 +6,11 @@ //======================================================================= #include "paging.hpp" -#include "types.hpp" -#include "utils.hpp" - #include "console.hpp" +#include "stl/types.hpp" +#include "stl/algorithms.hpp" + namespace { typedef uint64_t* page_entry; diff --git a/kernel/src/shell.cpp b/kernel/src/shell.cpp index 2da89980..a2ba07f7 100644 --- a/kernel/src/shell.cpp +++ b/kernel/src/shell.cpp @@ -5,25 +5,25 @@ // http://www.boost.org/LICENSE_1_0.txt) //======================================================================= -#include "types.hpp" #include "keyboard.hpp" #include "kernel_utils.hpp" #include "console.hpp" #include "shell.hpp" #include "timer.hpp" -#include "utils.hpp" #include "memory.hpp" #include "disks.hpp" -#include "string.hpp" -#include "vector.hpp" -#include "algorithms.hpp" #include "acpi.hpp" #include "e820.hpp" -#include "optional.hpp" //Commands #include "sysinfo.hpp" +#include "stl/types.hpp" +#include "stl/algorithms.hpp" +#include "stl/vector.hpp" +#include "stl/string.hpp" +#include "stl/optional.hpp" + namespace { #ifdef CONFIG_HISTORY @@ -32,37 +32,37 @@ static constexpr const bool History = true; static constexpr const bool History = false; #endif -vector history; +vector history; uint64_t history_index = 0; bool shift = false; //Declarations of the different functions -void reboot_command(const vector& params); -void help_command(const vector& params); -void uptime_command(const vector& params); -void clear_command(const vector& params); -void date_command(const vector& params); -void sleep_command(const vector& params); -void echo_command(const vector& params); -void mmap_command(const vector& params); -void memory_command(const vector& params); -void memorydebug_command(const vector& params); -void disks_command(const vector& params); -void partitions_command(const vector& params); -void mount_command(const vector& params); -void unmount_command(const vector& params); -void ls_command(const vector& params); -void cd_command(const vector& params); -void pwd_command(const vector& params); -void free_command(const vector& params); -void cat_command(const vector& params); -void shutdown_command(const vector& params); +void reboot_command(const vector& params); +void help_command(const vector& params); +void uptime_command(const vector& params); +void clear_command(const vector& params); +void date_command(const vector& params); +void sleep_command(const vector& params); +void echo_command(const vector& params); +void mmap_command(const vector& params); +void memory_command(const vector& params); +void memorydebug_command(const vector& params); +void disks_command(const vector& params); +void partitions_command(const vector& params); +void mount_command(const vector& params); +void unmount_command(const vector& params); +void ls_command(const vector& params); +void cd_command(const vector& params); +void pwd_command(const vector& params); +void free_command(const vector& params); +void cat_command(const vector& params); +void shutdown_command(const vector& params); struct command_definition { const char* name; - void (*function)(const vector&); + void (*function)(const vector&); }; command_definition commands[21] = { @@ -89,7 +89,7 @@ command_definition commands[21] = { {"shutdown", shutdown_command}, }; -string current_input(16); +std::string current_input(16); void exec_command(); @@ -193,7 +193,7 @@ void start_shell(){ void exec_command(){ history_save(); - auto params = split(current_input);; + auto params = std::split(current_input);; for(auto& command : commands){ if(params[0] == command.name){ @@ -206,17 +206,17 @@ void exec_command(){ k_printf("The command \"%s\" does not exist\n", current_input.c_str()); } -void clear_command(const vector&){ +void clear_command(const vector&){ wipeout(); } -void __attribute__((noreturn)) reboot_command(const vector&){ +void __attribute__((noreturn)) reboot_command(const vector&){ __asm__ __volatile__("mov al, 0x64; or al, 0xFE; out 0x64, al; mov al, 0xFE; out 0x64, al; " : : ); __builtin_unreachable(); } -void help_command(const vector&){ +void help_command(const vector&){ k_print("Available commands:\n"); for(auto& command : commands){ @@ -225,7 +225,7 @@ void help_command(const vector&){ } } -void uptime_command(const vector&){ +void uptime_command(const vector&){ k_printf("Uptime: %ds\n", timer_seconds()); } @@ -243,7 +243,7 @@ uint8_t get_RTC_register(int reg) { return in_byte(cmos_data); } -void date_command(const vector&){ +void date_command(const vector&){ uint64_t second; uint64_t minute; uint64_t hour; @@ -321,11 +321,11 @@ void date_command(const vector&){ k_printf("%d.%d.%d %d:%.2d:%.2d\n", day, month, year, hour, minute, second); } -void sleep_command(const vector& params){ +void sleep_command(const vector& params){ sleep_ms(parse(params[1]) * 1000); } -void echo_command(const vector& params){ +void echo_command(const vector& params){ for(uint64_t i = 1; i < params.size(); ++i){ k_print(params[i]); k_print(' '); @@ -333,7 +333,7 @@ void echo_command(const vector& params){ k_print_line(); } -void mmap_command(const vector&){ +void mmap_command(const vector&){ if(e820::mmap_failed()){ k_print_line("The mmap was not correctly loaded from e820"); } else { @@ -349,7 +349,7 @@ void mmap_command(const vector&){ } } -void memory_command(const vector&){ +void memory_command(const vector&){ if(e820::mmap_failed()){ k_print_line("The mmap was not correctly loaded from e820"); } else { @@ -360,11 +360,11 @@ void memory_command(const vector&){ } } -void memorydebug_command(const vector&){ +void memorydebug_command(const vector&){ memory_debug(); } -void disks_command(const vector&){ +void disks_command(const vector&){ k_print_line("UUID Type"); for(uint64_t i = 0; i < disks::detected_disks(); ++i){ @@ -374,7 +374,7 @@ void disks_command(const vector&){ } } -void partitions_command(const vector& params){ +void partitions_command(const vector& params){ auto uuid = parse(params[1]); if(disks::disk_exists(uuid)){ @@ -394,7 +394,7 @@ void partitions_command(const vector& params){ } } -void mount_command(const vector& params){ +void mount_command(const vector& params){ if(params.size() == 1){ auto md = disks::mounted_disk(); auto mp = disks::mounted_partition(); @@ -421,7 +421,7 @@ void mount_command(const vector& params){ } } -void unmount_command(const vector& ){ +void unmount_command(const vector& ){ if(!disks::mounted_partition() || !disks::mounted_disk()){ k_print_line("Nothing is mounted"); @@ -431,7 +431,7 @@ void unmount_command(const vector& ){ disks::unmount(); } -void ls_command(const vector& params){ +void ls_command(const vector& params){ if(!disks::mounted_partition() || !disks::mounted_disk()){ k_print_line("Nothing is mounted"); @@ -477,7 +477,7 @@ void ls_command(const vector& params){ } } -void free_command(const vector&){ +void free_command(const vector&){ if(!disks::mounted_partition() || !disks::mounted_disk()){ k_print_line("Nothing is mounted"); @@ -487,7 +487,7 @@ void free_command(const vector&){ k_printf("Free size: %m\n", disks::free_size()); } -void pwd_command(const vector&){ +void pwd_command(const vector&){ if(!disks::mounted_partition() || !disks::mounted_disk()){ k_print_line("Nothing is mounted"); @@ -506,7 +506,7 @@ void pwd_command(const vector&){ k_print_line(); } -optional find_file(const string& name){ +optional find_file(const std::string& name){ auto files = disks::ls(); for(auto& file : files){ @@ -518,7 +518,7 @@ optional find_file(const string& name){ return {}; } -void cd_command(const vector& params){ +void cd_command(const vector& params){ if(!disks::mounted_partition() || !disks::mounted_disk()){ k_print_line("Nothing is mounted"); @@ -551,7 +551,7 @@ void cd_command(const vector& params){ } } -void cat_command(const vector& params){ +void cat_command(const vector& params){ if(!disks::mounted_partition() || !disks::mounted_disk()){ k_print_line("Nothing is mounted"); @@ -578,7 +578,7 @@ void cat_command(const vector& params){ } } -void shutdown_command(const vector&){ +void shutdown_command(const vector&){ if(!acpi::init()){ k_print_line("Unable to init ACPI"); } diff --git a/kernel/include/algorithms.hpp b/kernel/src/stl/algorithms.cpp similarity index 71% rename from kernel/include/algorithms.hpp rename to kernel/src/stl/algorithms.cpp index 8d88a286..42c50b7c 100644 --- a/kernel/include/algorithms.hpp +++ b/kernel/src/stl/algorithms.cpp @@ -4,13 +4,3 @@ // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) //======================================================================= - -#ifndef ALGORITHMS_H -#define ALGORITHMS_H - -#include "string.hpp" -#include "vector.hpp" - -vector split(const string& s); - -#endif diff --git a/kernel/src/utils.cpp b/kernel/src/stl/string.cpp similarity index 60% rename from kernel/src/utils.cpp rename to kernel/src/stl/string.cpp index 1fbb4f50..1807e950 100644 --- a/kernel/src/utils.cpp +++ b/kernel/src/stl/string.cpp @@ -5,10 +5,9 @@ // http://www.boost.org/LICENSE_1_0.txt) //======================================================================= -#include "utils.hpp" -#include "string.hpp" +#include "stl/string.hpp" -uint64_t parse(const char* it, const char* end){ +uint64_t std::parse(const char* it, const char* end){ int i = end - it - 1; uint64_t factor = 1; @@ -22,7 +21,7 @@ uint64_t parse(const char* it, const char* end){ return acc; } -uint64_t parse(const char* str){ +uint64_t std::parse(const char* str){ int i = 0; const char* it = str; @@ -41,14 +40,35 @@ uint64_t parse(const char* str){ return acc; } -uint64_t parse(const string& str){ +uint64_t std::parse(const string& str){ return parse(str.begin(), str.end()); } -uint64_t str_len(const char* a){ +uint64_t std::str_len(const char* a){ uint64_t length = 0; while(*a++){ ++length; } return length; } + +vector std::split(const string& s){ + vector parts; + + string current(s.size()); + + for(char c : s){ + if(c == ' ' && !current.empty()){ + parts.push_back(current); + current.clear(); + } else { + current += c; + } + } + + if(!current.empty()){ + parts.push_back(current); + } + + return std::move(parts); +} diff --git a/kernel/src/sysinfo.cpp b/kernel/src/sysinfo.cpp index 3803d37c..2cff2fd7 100644 --- a/kernel/src/sysinfo.cpp +++ b/kernel/src/sysinfo.cpp @@ -341,7 +341,7 @@ void get_base_info(){ } //end of anonymous namespace -void sysinfo_command(const vector&){ +void sysinfo_command(const vector&){ get_base_info(); get_vendor_id(); get_brand_string();