use std::io::{Decorator, Writer};
-#[cfg(not(target_os = "win32"))] use std::os;
-#[cfg(not(target_os = "win32"))] use terminfo::*;
-#[cfg(not(target_os = "win32"))] use terminfo::searcher::open;
-#[cfg(not(target_os = "win32"))] use terminfo::parser::compiled::parse;
-#[cfg(not(target_os = "win32"))] use terminfo::parm::{expand, Number, Variables};
+use std::os;
+use terminfo::*;
+use terminfo::searcher::open;
+use terminfo::parser::compiled::{parse, msys_terminfo};
+use terminfo::parm::{expand, Number, Variables};
// FIXME (#2807): Windows support.
}
}
-#[cfg(not(target_os = "win32"))]
fn cap_for_attr(attr: attr::Attr) -> &'static str {
match attr {
attr::Bold => "bold",
}
}
-#[cfg(not(target_os = "win32"))]
pub struct Terminal<T> {
priv num_colors: u16,
priv out: T,
priv ti: ~TermInfo
}
-#[cfg(target_os = "win32")]
-pub struct Terminal<T> {
- priv num_colors: u16,
- priv out: T,
-}
-
-#[cfg(not(target_os = "win32"))]
impl<T: Writer> Terminal<T> {
pub fn new(out: T) -> Result<Terminal<T>, ~str> {
- let term = os::getenv("TERM");
- if term.is_none() {
- return Err(~"TERM environment variable undefined");
- }
+ let term = match os::getenv("TERM") {
+ Some(t) => t,
+ None => return Err(~"TERM environment variable undefined")
+ };
- let entry = open(term.unwrap());
+ let entry = open(term);
if entry.is_err() {
+ if "cygwin" == term { // msys terminal
+ return Ok(Terminal {out: out, ti: msys_terminfo(), num_colors: 8});
+ }
return Err(entry.unwrap_err());
}
}
}
-#[cfg(target_os = "win32")]
-impl<T: Writer> Terminal<T> {
- pub fn new(out: T) -> Result<Terminal<T>, ~str> {
- return Ok(Terminal {out: out, num_colors: 0});
- }
-
- pub fn fg(&mut self, _color: color::Color) -> bool {
- false
- }
-
- pub fn bg(&mut self, _color: color::Color) -> bool {
- false
- }
-
- pub fn attr(&mut self, _attr: attr::Attr) -> bool {
- false
- }
-
- pub fn supports_attr(&self, _attr: attr::Attr) -> bool {
- false
- }
-
- pub fn reset(&self) {
- }
-}
-
impl<T: Writer> Decorator<T> for Terminal<T> {
fn inner(self) -> T {
self.out
Ok(~TermInfo {names: term_names, bools: bools_map, numbers: numbers_map, strings: string_map })
}
+/// Create a dummy TermInfo struct for msys terminals
+pub fn msys_terminfo() -> ~TermInfo {
+ let mut strings = HashMap::new();
+ strings.insert(~"sgr0", bytes!("\x1b[0m").to_owned());
+ strings.insert(~"bold", bytes!("\x1b[1m;").to_owned());
+ strings.insert(~"setaf", bytes!("\x1b[3%p1%dm").to_owned());
+ strings.insert(~"setab", bytes!("\x1b[4%p1%dm").to_owned());
+ ~TermInfo {
+ names: ~[~"cygwin"], // msys is a fork of an older cygwin version
+ bools: HashMap::new(),
+ numbers: HashMap::new(),
+ strings: strings
+ }
+}
+
#[cfg(test)]
mod test {
use super::*;