aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2013-04-01 02:42:48 -0500
committerJesse Luehrs <doy@tozt.net>2013-04-01 02:42:48 -0500
commit2c129f6533e319774be67ea4828190ee8213180a (patch)
tree05d0c31412b2704288bcc08750e0fe535a8ee59c /src
parentb7646b2d791cf10bd604aaee830fe22598b7d10d (diff)
downloadrust-term-2c129f6533e319774be67ea4828190ee8213180a.tar.gz
rust-term-2c129f6533e319774be67ea4828190ee8213180a.zip
refactor
Diffstat (limited to 'src')
-rw-r--r--src/term.rs38
1 files changed, 28 insertions, 10 deletions
diff --git a/src/term.rs b/src/term.rs
index bb29025..02a1306 100644
--- a/src/term.rs
+++ b/src/term.rs
@@ -90,7 +90,7 @@ pub fn Reader () -> Reader {
impl Reader {
pub fn read (&mut self) -> Option<Keypress> {
if str::len(self.buf) > 0 {
- return Some(KeyCharacter(str::shift_char(&mut self.buf)));
+ return Some(self.next_key());
}
let first = util::timed_read(-1);
@@ -101,26 +101,44 @@ impl Reader {
let mut buf = str::from_char(*first.get_ref());
loop {
if !self.escapes.has_prefix(buf) {
- return match self.escapes.find(buf) {
- &Some(k) => { Some(k) }
- &None => {
- str::push_str(&mut self.buf, buf);
- let next = str::shift_char(&mut self.buf);
- Some(KeyCharacter(next))
+ /* XXX i think this is a borrow check bug, should look into
+ * it at some point */
+ //return match self.escapes.find(buf) {
+ // &Some(k) => { Some(k) }
+ // &None => {
+ // self.unget(buf);
+ // self.read()
+ // }
+ //}
+ {
+ let k = self.escapes.find(buf);
+ if k.is_some() {
+ return *k;
}
}
+ self.unget(buf);
+ return self.read();
}
match util::timed_read(1000000) {
Some(next) => { str::push_char(&mut buf, next) }
None => {
- str::push_str(&mut self.buf, buf);
- let next = str::shift_char(&mut self.buf);
- return Some(KeyCharacter(next));
+ self.unget(buf);
+ return self.read();
}
}
}
}
+
+ fn unget (&mut self, buf: &str) {
+ str::push_str(&mut self.buf, buf);
+ }
+
+ fn next_key (&mut self) -> Keypress {
+ fail_unless!(str::len(self.buf) > 0);
+ let next = str::shift_char(&mut self.buf);
+ return KeyCharacter(next);
+ }
}
// XXX this whole thing needs to be able to deal with caps that don't exist