Tweak main menu.

This commit is contained in:
Marco Satti 2018-08-06 22:40:56 +08:00
parent dd8445a2b9
commit 1d7e8e8e07

View file

@ -1,74 +1,33 @@
#include <cstdio>
#include <csignal>
#include <iostream>
#include <string>
#include <boost/filesystem.hpp>
#include <Core.hpp>
#include <Macros.hpp>
#if defined(WIN32)
#include <windows.h>
#endif
bool quit = false;
volatile bool show_main_menu = false;
#if defined(WIN32)
BOOL WINAPI console_handler(DWORD signal)
{
show_main_menu = true;
return TRUE;
}
#else
void signal_handler(int signal)
{
show_main_menu = true;
// This is a win32 specific thing? Otherwise subsequent signals are not caught...
// https://stackoverflow.com/questions/43959514/why-the-second-sigint-cant-be-captured-on-win32
std::signal(SIGINT, signal_handler);
std::signal(SIGBREAK, signal_handler);
}
#endif
void main_menu(CoreApi& core)
{
char c = '\0';
do
{
switch (c)
{
case '1':
case 's':
{
puts("Saving state...");
core.save_state();
puts("Saved state ok");
break;
}
case '2':
case 'd':
{
puts("Dumping memory...");
core.dump_all_memory();
puts("Dumped memory ok");
break;
}
case '3':
case 'c':
{
goto exit_menu;
}
case '4':
case 'q':
{
quit = true;
goto exit_menu;
}
}
puts("Orbum main menu");
puts(" 1. (s)ave state (json)");
puts(" 2. (d)ump all memory (binary)");
puts(" 3. (c)ontinue");
puts(" 4. (q)uit");
fputs("Select an option: ", stdout);
} while ((c = getchar()));
exit_menu:
puts("");
show_main_menu = false;
}
void main_menu(CoreApi& core);
int main(int argc, char* argv[])
{
@ -79,8 +38,11 @@ int main(int argc, char* argv[])
std::cout << std::endl
<< "Working directory: " << boost::filesystem::initial_path() << std::endl;
#if defined(WIN32)
SetConsoleCtrlHandler(console_handler, TRUE);
#else
std::signal(SIGINT, signal_handler);
std::signal(SIGBREAK, signal_handler);
#endif
try
{
@ -111,4 +73,67 @@ int main(int argc, char* argv[])
std::cout << "Exiting" << std::endl;
return 0;
}
}
void main_menu(CoreApi& core)
{
while (true)
{
std::cout << "\nOrbum main menu\n"
<< " 1. (s)ave state (json)\n"
<< " 2. (d)ump all memory (binary)\n"
<< " 3. (c)ontinue\n"
<< " 4. (q)uit\n"
<< "\nSelect an option: "
<< std::flush;
char c = '\0';
try
{
std::string line;
std::getline(std::cin, line);
c = line.at(0);
}
catch (const std::out_of_range&)
{
std::cout << "Invalid option" << std::endl;
continue;
}
switch (c)
{
case '1':
case 's':
{
std::cout << "Saving state..." << std::endl;
core.save_state();
std::cout << "Saved state ok" << std::endl;
break;
}
case '2':
case 'd':
{
std::cout << "Dumping memory..." << std::endl;
core.dump_all_memory();
std::cout << "Dumped memory ok" << std::endl;
break;
}
case '3':
case 'c':
{
goto exit_menu;
}
case '4':
case 'q':
{
quit = true;
goto exit_menu;
}
}
}
exit_menu:
std::cout << std::endl;
show_main_menu = false;
}