diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2017-10-14 22:56:23 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2017-10-14 22:56:23 +0200 |
| commit | fea44640fa8e2077fdf1f3477c35423bd1053cab (patch) | |
| tree | 15734adea0b1c00a7315c4c71ce26d93bb5e5664 | |
| parent | b5c408fa53d2a83983614f688bb01e38e3d295f9 (diff) | |
| download | extfs-fea44640fa8e2077fdf1f3477c35423bd1053cab.tar.xz extfs-fea44640fa8e2077fdf1f3477c35423bd1053cab.zip | |
extsh: refactor shell
| -rw-r--r-- | CMakeLists.txt | 1 | ||||
| -rw-r--r-- | conanfile.txt | 2 | ||||
| -rw-r--r-- | src/extsh.cpp | 59 |
3 files changed, 54 insertions, 8 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 78d4fa2..be4bea8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") + set(CXX_VERSION "c++1z") include("CompilerSetup") diff --git a/conanfile.txt b/conanfile.txt index bb150b6..dfe488d 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -1,5 +1,5 @@ [requires] -CUTE/2.1.0@fmorgner/stable +CUTE/[>=2.2]@fmorgner/stable [generators] cmake diff --git a/src/extsh.cpp b/src/extsh.cpp index 07a7d47..9dfeea8 100644 --- a/src/extsh.cpp +++ b/src/extsh.cpp @@ -1,23 +1,68 @@ #include "fs/extfs.hpp" +#include <cstdint> #include <iostream> +#include <stdexcept> #include <string> +enum struct result : std::uint8_t + { + keep_going, + fatal_error, + exit, + unknown, + }; + +result process(std::string const & command) + { + if(command == "exit") + { + return result::exit; + } + + return result::unknown; + } + +std::string prompt(fs::extfs const & disk) + { + std::cout << '[' << (disk.has_label() ? disk.label() : "No Label") << "] >>> "; + std::string command{}; + std::cin >> command; + return command; + } + +void repl(fs::extfs & disk) + { + result commandResult = result::unknown; + while((commandResult = process(prompt(disk))) != result::exit) + { + switch(commandResult) + { + case result::unknown: + std::cout << "unknown command\n"; + break; + case result::fatal_error: + std::cout << "fatal error\n"; + return; + default: + break; + } + } + + std::cout << "Bye!\n"; + } + int main(int argc, char const * argv[]) { auto const & path = [&]{ return std::string{argc > 1 ? argv[1] : "vdisk.img"}; }(); - auto const & disk = fs::extfs{path}; + fs::extfs disk{path}; if(disk.open()) { - std::clog << "[EXTSH] Successfully opened ext*fs at: '" << path << "'\n"; - if(disk.has_label()) - { - std::clog << "[EXTSH] The filesystem is labeled '" << disk.label() << "'\n"; - } + repl(disk); } else { - std::clog << "[EXTSH] Failed to open ext*fs at: '" << path << "'\n"; + std::clog << "Failed to open ext*fs at: '" << path << "'\n"; } } |
