aboutsummaryrefslogtreecommitdiff
path: root/riscv
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2013-04-23 01:43:45 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2013-04-23 01:43:45 -0700
commit789abb77fb313b688f83bc292453b1f127188ff0 (patch)
tree80fc97f1babd985f17daaacefab5df288c10a24e /riscv
parent60a69f08bffb55e044a698e065242bdfd5b585ab (diff)
downloadriscv-isa-sim-789abb77fb313b688f83bc292453b1f127188ff0.zip
riscv-isa-sim-789abb77fb313b688f83bc292453b1f127188ff0.tar.gz
riscv-isa-sim-789abb77fb313b688f83bc292453b1f127188ff0.tar.bz2
make interactive mode cope with canonical terminal
Diffstat (limited to 'riscv')
-rw-r--r--riscv/interactive.cc46
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;