• Как создать консольный терминал на C++?

    @grigorkh Автор вопроса
    Наконец то получилось. Вот код.

    #include <iostream>
    #include <string>
    #include <map>
    #include <vector>
    using namespace std;
    
    bool shell_finish = false;
    map<string, void*> fnMap;
    
    vector<string> explode(string inputstring, string delimiter){
    	vector<string> explodes;
    	inputstring.append(delimiter);
    	while (inputstring.find(delimiter) != string::npos){
    		explodes.push_back(inputstring.substr(0, inputstring.find(delimiter)));
    		inputstring.erase(inputstring.begin(), inputstring.begin() + inputstring.find(delimiter) + delimiter.size());
    	}
    	return explodes;
    }
    string trim(const string& str, const string& whitespace = " \t")
    {
    	const auto strBegin = str.find_first_not_of(whitespace);
    	if (strBegin == string::npos)
    		return "";
    	const auto strEnd = str.find_last_not_of(whitespace);
    	const auto strRange = strEnd - strBegin + 1;
    
    	return str.substr(strBegin, strRange);
    }
    
    void my_plus(string params) {
    	double sum = 0;
    	vector<string> explodes = explode(params, " ");
    	for (int i = 0; i<(int)explodes.size(); i++){
    		sum += atof(trim(explodes[i]).c_str());
    	}
    	cout << sum << endl;
    }
    void my_exit(string params = "") {
    	shell_finish = true;
    }
    void my_help(string params) {
    	map<string, string> help;
    	help["plus"] = "Use following syntax: plus <number_1> <nubmer_2> ...";
    	help["exit"] = "Exits current shell session.";
    	if (help.find(params) != help.end()) {
    		cout << help[params] << endl;
    	}
    	else {
    		cout << "help: command not found" << endl;
    	}
    }
    
    void detect_command(string a) {
    	fnMap["plus"] = &my_plus;
    	fnMap["exit"] = &my_exit;
    	fnMap["help"] = &my_help;
    	const int arr_length = 10;
    	string commands[arr_length] = { "plus", "help", "exit" };
    	string cur_cmd;
    	for (int i = 0; i < arr_length; i++) {
    		cur_cmd = commands[i];
    		if (a.compare(0, cur_cmd.length() + 1, cur_cmd + " ") == 0 || a.compare(0, cur_cmd.length(), cur_cmd) == 0) {
    			string params = trim(a.substr(cur_cmd.length()));
    			reinterpret_cast<void(*)(string)>(fnMap[cur_cmd])(params);
    			break;
    		}
    	}
    }
    
    int main(void) {
    	string x;
    	while (!shell_finish) {
    		getline(cin, x);
    		detect_command(x);
    	}
    	return 0;
    }
    Ответ написан
  • Как создать консольный терминал на C++?

    @grigorkh Автор вопроса
    Получилось что-то такое. но пока не паботает

    #include <iostream>
    #include <string>
    #include <map>
    using namespace std;
    map<string, void*> fnMap;
    void my_plus(int a, int b) {
    	cout << a + b;
    }
    void my_minus(int a, int b) {
    	cout << a - b;
    }
    
    typedef struct fn_table_entry {
    	char *name;
    	void(*fn)(int a, int b);
    } fn_table_entry_t;
    
    void detect_command(string a) {
    	fnMap["plus"] = &my_plus;
    	fnMap["minus"] = &my_minus;
    	const int arr_length = 10;
    	string commands[arr_length] = { "plus", "minus", "help", "exit" };
    	for (int i = 0; i < arr_length; i++) {
    		if (a.compare(0, commands[i].length(), commands[i]) == 0) {
    			cout << reinterpret_cast<int(*)(int, int)>(fnMap[commands[i]])(5, 4);
    			break;
    		}
    	}
    	
    }
    
    int main(void) {
    	string x;
    	while (true) {
    		getline(cin, x);
    		detect_command(x);
    	}
    	return 0;
    }
    Ответ написан
    Комментировать
  • Как создать консольный терминал на C++?

    @grigorkh Автор вопроса
    Я тут спомашю Гугла из разных примеров собрал несколько строк, как вы думаете чего тут не достает

    #include <iostream>
    #include <string>
    #include <map>
    using namespace std;
    void detect_command(string a);
    int plus(int a, int b) {
    	return a + b;
    }
    int minus(int a, int b) {
    	return a + b;
    }
    
    typedef void *(*fp)(void **, int);
    
    struct function_object{
    	string name;
    	int params;
    	fp pointer;
    
    	function_object(const string &n) :name(n), params(0), pointer(0){}
    	function_object &operator()(int p){ this->params = p; return *this; }
    	function_object &operator=(fp p){ this->pointer = p; return *this; }
    	bool operator<(const function_object &b){ return this->name<b.name; }
    };
    void main(void) {
    	string x;
    	
    	while (true) {
    		getline(cin, x);
    		detect_command(x);
    	}
    }
    void detect_command(string a) {
    	const int arr_length = 10;
    	
    	set<function_object> functions;
    	functions.insert(function_object("add")(2) = f);
    
    
    	string commands[arr_length] = { "plus", "minus", "help", "exit" };
    	for (int i = 0; i < arr_length; i++) {
    		if (a.compare(0, commands[i].length(), commands[i]) == 0) {
    			cout << reinterpret_cast<int(*)(int)>(fnMap[commands[i]])(5, 4) << endl;
    			break;
    		}
    	}
    }
    Ответ написан