/* core/commandbuffer.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "core/commandbuffer.h" #include "sys/sys.h" // C++ headers #include #include #include namespace core { std::stringstream cmd(std::stringstream::in | std::stringstream::out); namespace commandbuffer { void exec(const char *text) { std::stringstream cmdstream(text); std::string cmdname; if (!(cmdstream >> cmdname)) return; // is it a function Func f = func::find(cmdname); if (f) { // function exists, execute it f(cmdstream); return; } // is it a cvar Cvar cv = cvar::find(cmdname); if (cv) { // cvar exists std::string args; if (cmdstream >> args) { // we're setting a new value char c; while(cmdstream >> c) args += c; (*cv) = args; } con_print << cmdname << " " << cv->text() << std::endl; return; } con_print << "Unknown command '" << cmdname << "'" << std::endl; } void execute() { if (core::cmd.eof()) return; char line[MAXCMDSIZE]; while (core::cmd.getline(line, MAXCMDSIZE-1)) { exec(line); } cmd.clear(); } void clear() { char line[MAXCMDSIZE]; while (core::cmd.getline(line, MAXCMDSIZE-1)); } void complete(std::string &input, size_t &pos) { std::list match; std::string partial = input.substr(0, pos); if (!partial.size()) return; // search function registry for matches std::map::iterator f; for (f = func::registry.begin(); f != func::registry.end(); f++) { if (partial == (*f).first.substr(0, partial.size())) { match.push_back((*f).first); //con_print << " " << (*f).first << std::endl; } } // search cvar registry for matches std::map::iterator c; for (c = cvar::registry.begin(); c != cvar::registry.end(); c++) { if (partial == (*c).first.substr(0, partial.size())) { match.push_back((*c).first); //con_print << " " << (*c).first << std::endl; } } if (!match.size()) return; if (match.size() == 1) { std::list::iterator l; l = match.begin(); input.replace(0, pos, (*l)); pos = (*l).size(); } else { std::list::iterator l; for (l = match.begin(); l !=match.end(); l++) con_print << " " << (*l) << std::endl; } } } // namespace commandbuffer } // namespace core