From 2c129f6533e319774be67ea4828190ee8213180a Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 1 Apr 2013 02:42:48 -0500 Subject: refactor --- src/term.rs | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) (limited to 'src') 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 { 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 -- cgit v1.2.3-54-g00ecf