summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2017-10-14 22:56:23 +0200
committerFelix Morgner <felix.morgner@gmail.com>2017-10-14 22:56:23 +0200
commitfea44640fa8e2077fdf1f3477c35423bd1053cab (patch)
tree15734adea0b1c00a7315c4c71ce26d93bb5e5664
parentb5c408fa53d2a83983614f688bb01e38e3d295f9 (diff)
downloadextfs-fea44640fa8e2077fdf1f3477c35423bd1053cab.tar.xz
extfs-fea44640fa8e2077fdf1f3477c35423bd1053cab.zip
extsh: refactor shell
-rw-r--r--CMakeLists.txt1
-rw-r--r--conanfile.txt2
-rw-r--r--src/extsh.cpp59
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";
}
}