diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2013-04-23 01:43:45 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2013-04-23 01:43:45 -0700 |
commit | 789abb77fb313b688f83bc292453b1f127188ff0 (patch) | |
tree | 80fc97f1babd985f17daaacefab5df288c10a24e /riscv/interactive.cc | |
parent | 60a69f08bffb55e044a698e065242bdfd5b585ab (diff) | |
download | spike-789abb77fb313b688f83bc292453b1f127188ff0.zip spike-789abb77fb313b688f83bc292453b1f127188ff0.tar.gz spike-789abb77fb313b688f83bc292453b1f127188ff0.tar.bz2 |
make interactive mode cope with canonical terminal
Diffstat (limited to 'riscv/interactive.cc')
-rw-r--r-- | riscv/interactive.cc | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/riscv/interactive.cc b/riscv/interactive.cc index af4c0bd..98e4bb9 100644 --- a/riscv/interactive.cc +++ b/riscv/interactive.cc @@ -8,25 +8,49 @@ #include <climits> #include <assert.h> #include <stdlib.h> +#include <unistd.h> +#include <sstream> +#include <string> +#include <vector> + +static std::string readline() +{ + std::string s; + while (1) + { + char ch; + assert(read(1, &ch, 1) == 1); + + if (ch == '\x7f') + { + if (s.empty()) + continue; + s.erase(s.end()-1); + } + + assert(write(1, &ch, 1) == 1); + if (ch == '\n') + return s; + if (ch != '\x7f') + s += ch; + } +} void sim_t::interactive() { - putchar(':'); - char s[128]; - std::cin.getline(s,sizeof(s)-1); + std::cout << ": " << std::flush; + std::string s = readline(); - char* p = strtok(s," "); - if(!p) + std::stringstream ss(s); + std::string cmd, tmp; + std::vector<std::string> args; + if (!(ss >> cmd)) { interactive_run_noisy(std::string("r"), std::vector<std::string>(1,"1")); return; } - std::string cmd = p; - - std::vector<std::string> args; - while((p = strtok(NULL," "))) - args.push_back(p); - + while (ss >> tmp) + args.push_back(tmp); typedef void (sim_t::*interactive_func)(const std::string&, const std::vector<std::string>&); std::map<std::string,interactive_func> funcs; |