From 92c7918df5799b558c3abfafc5a6b4546b2002cf Mon Sep 17 00:00:00 2001 From: Kuoi Date: Mon, 17 Jul 2023 05:35:19 +0800 Subject: [PATCH] polish: interactive function added --- CMakeLists.txt | 15 ++++ tnt2winclada.cpp | 191 +++++++++++++++++++++++++++++++++++++---------- 2 files changed, 167 insertions(+), 39 deletions(-) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..faa07fe --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.0) + +project(tnt2winclada) +SET( CMAKE_EXPORT_COMPILE_COMMANDS ON ) + +set(CMAKE_CXX_STANDARD 11) + +add_executable(tnt2winclada tnt2winclada.cpp) + +target_compile_options(tnt2winclada PRIVATE -Wall -Wextra -pedantic) + +install(TARGETS tnt2winclada DESTINATION /usr/bin) +install(FILES guoyi.run DESTINATION /usr/share/tnt/tnt_scripts) +install(FILES LICENSE DESTINATION /usr/share/licenses/tnt2winclada) +install(FILES README.md DESTINATION /usr/share/doc/tnt2winclada) diff --git a/tnt2winclada.cpp b/tnt2winclada.cpp index e56644d..00721e9 100644 --- a/tnt2winclada.cpp +++ b/tnt2winclada.cpp @@ -1,6 +1,6 @@ -#include #include -#include +#include +#include #include using namespace std; @@ -10,30 +10,124 @@ string inputFileName, outputFileName, tnt_format, winclada_format; void argument(int argc, char** argv); int read_tnt(); void showhelp(int help_num); -void parse_line(int trelen); -void add_space (string winclada, char x); +void parse_line(); +void add_space(string winclada, char x); bool isNum(string strnum); +void write_winclada(); +void interactive_commands(); -void show_help (int help_num){ -if (help_num == 0) { +void interactive_commands() +{ + string command, filename1, filename2; cout << "~|~|\\ |~|~ ~) | |o._ |~| _ _| _ " << endl; cout << " | | \\| | /_ \\/\\/ || ||_|(_|(_|(_|" << endl; - cout << "TNT2WinClada\nMIT, Guoyi Zhang, 2023\nplease use -h to see more options" << endl; - } else { - cout << "~|~|\\ |~|~ ~) | |o._ |~| _ _| _ " << endl; - cout << " | | \\| | /_ \\/\\/ || ||_|(_|(_|(_|" << endl; - cout << "Usage: tnt2winclada -i ${input_file} -o ${output_file}\n-h help;\n-i input: -i ${input_file};\n-o output: -o ${output_file}" << endl; + cout << "TNT2WinClada\nMIT, Guoyi Zhang, 2023\nplease type help " + "to see more commands" + << endl; + while (true) { + cout << "tnt2winclada> "; + getline(cin, command); + if (command == "help") { + cout << "help\t\t\tshow interactive commands " + "help\ninput " + "\tinput a TNT output tree from the " + "specified file\noutput \toutput a " + "winclada accessable tree file\nquit\t\t\texit " + "the program" + << endl; + } + else if (command.find("input ") == 0) { + std::stringstream ss(command.substr(6)); + ss >> filename1; + if (filename1.empty()) { + cout << "tnt2winclada> please specify a " + "filename." + << endl; + } + else { + ifstream infile(filename1.c_str()); + if (infile.good()) { + inputFileName = filename1; + cout << "tnt2winclada> Input file set " + "to " + << filename1 << endl; + int trelen; + trelen = read_tnt(); + if (trelen == 0) { + cout << "tnt2winclada> Input " + "format occurs error" + << endl; + } + else { + parse_line(); + } + } + else { + cout << "tnt2winclada> file not found. " + "Please " + "try again." + << endl; + } + } + } + else if (command.find("output ") == 0) { + std::stringstream ss(command.substr(7)); + ss >> filename2; + if (filename2.empty()) { + cout << "tnt2winclada> please specify a " + "filename." + << endl; + } + else { + ofstream outfile(filename2.c_str()); + outputFileName = filename2; + cout << "tnt2winclada> Output file set to " + << filename2 << endl; + write_winclada(); + cout << "tnt2winclada> Finished." << endl; + } + } + else if (command == "quit") { + break; + } + else { + cout << "tnt2wincalda> unrecognized command. Type " + "'help' for " + "a list of commands." + << endl; + } } } -void argument(int argc, char **argv) { +void show_help(int help_num) +{ + if (help_num == 0) { + cout << "~|~|\\ |~|~ ~) | |o._ |~| _ _| _ " << endl; + cout << " | | \\| | /_ \\/\\/ || ||_|(_|(_|(_|" << endl; + cout << "TNT2WinClada\nMIT, Guoyi Zhang, 2023\nplease use -h " + "to see more options" + << endl; + } + else { + cout << "~|~|\\ |~|~ ~) | |o._ |~| _ _| _ " << endl; + cout << " | | \\| | /_ \\/\\/ || ||_|(_|(_|(_|" << endl; + cout << "Usage: tnt2winclada -i ${input_file} -o " + "${output_file}\n-h help;\n-i input: -i " + "${input_file};\n-o output: -o ${output_file}" + << endl; + } +} + +void argument(int argc, char** argv) +{ // -i -h -o option for (int i = 0; i < argc; i++) { if (argc == 2 && string(argv[1]) == "-h") { show_help(1); exit(0); } - if (argc != 5 || string(argv[1]) != "-i" || string(argv[3]) != "-o") { + if (argc != 5 || string(argv[1]) != "-i" || + string(argv[3]) != "-o") { cout << "input or output can't be empty." << endl; show_help(0); exit(0); @@ -49,42 +143,48 @@ void argument(int argc, char **argv) { } } -int read_tnt() { - int trelen; +int read_tnt() +{ + int trelen = 0; ifstream inputFile(inputFileName); if (inputFile.is_open()) { getline(inputFile, tnt_format); inputFile.close(); trelen = tnt_format.length(); - } else { + } + else { cout << "File can't be opened" << endl; } inputFile.close(); return trelen; } -void add_space (char x) { +void add_space(char x) +{ int i = 0; string winclada; - for (i=0; i<(int)tnt_format.length(); i++) { + for (i = 0; i < (int)tnt_format.length(); i++) { if (tnt_format[i] != x) { - winclada=winclada+tnt_format[i]; - } else { - winclada=winclada+" "+tnt_format[i]+" "; - } + winclada = winclada + tnt_format[i]; + } + else { + winclada = winclada + " " + tnt_format[i] + " "; + } } - tnt_format=winclada; + tnt_format = winclada; } -bool isNum(string strnum) { +bool isNum(string strnum) +{ char* p; strtol(strnum.c_str(), &p, 10); return *p == 0; } -void parse_line (int trelen) { +void parse_line() +{ // add space - char x1 = '(', x2 = ')', x3= ','; + char x1 = '(', x2 = ')', x3 = ','; add_space(x1); add_space(x2); add_space(x3); @@ -94,31 +194,44 @@ void parse_line (int trelen) { int tem; while (getline(istr, buffer, ' ')) { istr >> buffer; - if(isNum(buffer)){ - tem = stoi(buffer)-1; + if (isNum(buffer)) { + tem = stoi(buffer) - 1; buffer = to_string(tem); } - winclada_format=winclada_format+buffer; + winclada_format = winclada_format + buffer; } } -void write_winclada() { +void write_winclada() +{ ofstream outputFile(outputFileName); if (outputFile.is_open()) { outputFile << "tread" << endl; outputFile << winclada_format << endl; - outputFile << "proc-;" ; - } else { + outputFile << "proc-;"; + } + else { cout << "File can't be written" << endl; } outputFile.close(); } -int main (int argc, char **argv){ - argument(argc, argv); - int trelen; - trelen = read_tnt(); - parse_line(trelen); - write_winclada(); - return 0; +int main(int argc, char** argv) +{ + if (argc == 1) { + interactive_commands(); + } + else { + argument(argc, argv); + int trelen; + trelen = read_tnt(); + if (trelen != 0) { + parse_line(); + write_winclada(); + return 0; + } + else { + cout << "Input file format occurs error." << endl; + } + } }