diff options
| -rw-r--r-- | src/vtcol.rs | 184 | 
1 files changed, 90 insertions, 94 deletions
diff --git a/src/vtcol.rs b/src/vtcol.rs index c3344ce..4b38a8c 100644 --- a/src/vtcol.rs +++ b/src/vtcol.rs @@ -1,23 +1,24 @@ -use std::sync::Mutex; -use std::path::{Path, PathBuf};  use lazy_static::lazy_static; +use std::{fmt, +          path::{Path, PathBuf}, +          sync::Mutex};  type Fd = libc::c_int;  lazy_static! { -    static ref VERBOSITY: Mutex<bool> = false; +    static ref VERBOSITY: Mutex<bool> = Mutex::new(false);  }  macro_rules! vrb {      ( $( $e:expr ),* ) => {( -            if VERBOSITY.lock().unwrap() { println!( $( $e ),* ) } +            if *VERBOSITY.lock().unwrap() { println!( $( $e ),* ) }      )}  } -const PALETTE_SIZE: usize = 16_usize; -const PALETTE_BYTES: usize = PALETTE_SIZE * 3_usize; // 16 * sizeof(int) +const PALETTE_SIZE: usize = 16; +const PALETTE_BYTES: usize = PALETTE_SIZE * 3; // 16 * sizeof(int) -const RAW_COLEXPR_SIZE: usize = 6_usize; // e. g. 0xBADF00 +const RAW_COLEXPR_SIZE: usize = 6; // e. g. 0xBADF00  type RawPalette<'a> = [&'a str; PALETTE_SIZE]; @@ -74,10 +75,13 @@ impl Color              s.to_string()          }      } +} /* [impl Color] */ -    fn to_string(&self) -> String +impl fmt::Display for Color +{ +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result      { -        match *self { +        let c = match *self {              Color::Black(b) => Color::format_brightness(b, "black"),              Color::Red(b) => Color::format_brightness(b, "red"),              Color::Green(b) => Color::format_brightness(b, "green"), @@ -86,9 +90,11 @@ impl Color              Color::Magenta(b) => Color::format_brightness(b, "magenta"),              Color::Cyan(b) => Color::format_brightness(b, "cyan"),              Color::White(b) => Color::format_brightness(b, "white"), -        } +        }; + +        write!(f, "{}", c)      } -} /* [impl Color] */ +} /* [impl fmt::Display for Color] */  #[derive(Debug)]  enum Scheme @@ -99,24 +105,19 @@ enum Scheme      Custom(Option<PathBuf>),  } -impl<'a> std::fmt::Display for Scheme +impl<'a> fmt::Display for Scheme  { -    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result      { -        let id: &str = match *self { -            Scheme::Default => "default", -            Scheme::SolarizedDark => "solarized_dark", -            Scheme::SolarizedLight => "solarized_light", -            Scheme::Custom(None) => "<read stdin>", -            Scheme::Custom(Some(fname)) => fname.display(), -        }; -        write!(f, "{}", id) +        match self { +            Scheme::Default => write!(f, "default"), +            Scheme::SolarizedDark => write!(f, "solarized_dark"), +            Scheme::SolarizedLight => write!(f, "solarized_light"), +            Scheme::Custom(None) => write!(f, "<read stdin>"), +            Scheme::Custom(Some(fname)) => write!(f, "{}", fname.display()), +        }      } -} /* [impl std::fmt::String for Scheme] */ - -extern "C" { -    fn exit(code: libc::c_int) -> !; -} +} /* [impl fmt::String for Scheme] */  /* struct Job -- Runtime parameters.   */ @@ -184,7 +185,7 @@ impl<'a> Job              .get_matches();          if matches.is_present("v") { -            VERBOSITY.lock().unwrap() = true; +            *VERBOSITY.lock().unwrap() = true;          }          if matches.is_present("l") { @@ -240,7 +241,7 @@ impl<'a> Job              Scheme::SolarizedLight => Job::dump_scheme(&SOLARIZED_COLORS_LIGHT),              Scheme::Custom(None) => Job::dump_palette(Palette::from_stdin()),              Scheme::Custom(Some(fname)) => -                        Job::dump_palette(Palette::from_file(&fname)), +                Job::dump_palette(Palette::from_file(&fname)),          }      } @@ -266,7 +267,7 @@ extern "C" {      ) -> libc::c_int;  } -static CONSOLE_PATHS: [&'static str; 6] = [ +static CONSOLE_PATHS: [&str; 6] = [      "/proc/self/fd/0",      "/dev/tty",      "/dev/tty0", @@ -275,25 +276,25 @@ static CONSOLE_PATHS: [&'static str; 6] = [      "/dev/console",  ]; -static DEFAULT_COLORS: RawPalette<'static> = [ +static DEFAULT_COLORS: RawPalette = [      "000000", "aa0000", "00aa00", "aa5500", "0000aa", "aa00aa", "00aaaa",      "aaaaaa", "555555", "ff5555", "55ff55", "ffff55", "5555ff", "ff55ff",      "55ffff", "ffffff",  ]; -static SOLARIZED_COLORS_DARK: RawPalette<'static> = [ +static SOLARIZED_COLORS_DARK: RawPalette = [      "002b36", "dc322f", "859900", "b58900", "268bd2", "d33682", "2aa198",      "eee8d5", "002b36", "cb4b16", "586e75", "657b83", "839496", "6c71c4",      "93a1a1", "fdf6e3",  ]; -static SOLARIZED_COLORS_LIGHT: RawPalette<'static> = [ +static SOLARIZED_COLORS_LIGHT: RawPalette = [      "eee8d5", "dc322f", "859900", "b58900", "268bd2", "d33682", "2aa198",      "073642", "fdf6e3", "cb4b16", "93a1a1", "839496", "657b83", "6c71c4",      "586e75", "002b36",  ]; -static DUMMY_COLORS: RawPalette<'static> = [ +static DUMMY_COLORS: RawPalette = [      "000000", "ffffff", "000000", "ffffff", "000000", "ffffff", "000000",      "ffffff", "000000", "ffffff", "000000", "ffffff", "000000", "ffffff",      "000000", "ffffff", @@ -308,21 +309,19 @@ impl Palette  {      fn dump(&self)      { -        let mut i: usize = 0_usize;          let mut buf: [u8; 3] = [0u8, 0u8, 0u8]; -        for col in self.colors.iter() { +        for (i, col) in self.colors.iter().enumerate() {              let idx: usize = i % 3;              buf[idx] = *col; -            if idx == 2_usize { +            if idx == 2 {                  println!(                      "{:>15} => 0x{:02.X}{:02.X}{:02.X}",                      Color::of_value((i / 3) as u8).to_string(), -                    buf[0_usize], -                    buf[1_usize], -                    buf[2_usize] +                    buf[0], +                    buf[1], +                    buf[2]                  );              } -            i = i + 1;          }      }  } /* [impl Palette] */ @@ -330,17 +329,16 @@ impl Palette  fn nibble_of_char(chr: u8) -> u8  {      match chr as char { -        '0'...'9' => chr - '0' as u8, -        'a'...'f' => chr - 'a' as u8 + 10, -        'A'...'F' => chr - 'A' as u8 + 10, +        '0'..='9' => chr - '0' as u8, +        'a'..='f' => chr - 'a' as u8 + 10, +        'A'..='F' => chr - 'A' as u8 + 10,          _ => 0,      }  }  macro_rules! byte_of_hex {      ($ar:ident, $off:expr) => { -        (nibble_of_char($ar[$off])) << 4 -            | nibble_of_char($ar[$off + 1_usize]) as u8 +        (nibble_of_char($ar[$off])) << 4 | nibble_of_char($ar[$off + 1]) as u8      };  } @@ -357,16 +355,16 @@ impl Palette  {      pub fn new(colors: &[&str; PALETTE_SIZE]) -> Palette      { -        let mut idx: usize = 0_usize; +        let mut idx: usize = 0;          let mut pal: [u8; PALETTE_BYTES] = [0; PALETTE_BYTES];          for def in colors.iter() {              let (r, g, b) = rgb_of_hex_triplet(*def); -            pal[idx + 0_usize] = r; -            pal[idx + 1_usize] = g; -            pal[idx + 2_usize] = b; +            pal[idx + 0] = r; +            pal[idx + 1] = g; +            pal[idx + 2] = b;              //println!(">> {} -> {:X} {:X} {:X}", def, r, g, b); -            idx = idx + 3_usize; +            idx = idx + 3;          }          Palette { colors: pal } @@ -378,44 +376,42 @@ impl Palette      /* [Palette::dummy] */ -    pub fn from_buffered_reader(reader: &mut std::io::BufRead) -> Palette +    pub fn from_buffered_reader(reader: &mut dyn std::io::BufRead) -> Palette      { -        let mut pal_idx: usize = 0_usize; +        let mut pal_idx: usize = 0;          let mut pal: [u8; PALETTE_BYTES] = [0; PALETTE_BYTES];          let mut line: String = String::new();          while reader.read_line(&mut line).is_ok() {              let len = line.len(); -            if len == 0_usize { +            if len == 0 {                  break; -            } else if len >= 8_usize { +            } else if len >= 8 {                  if let Some(off) = line.find('#') { -                    if off != 0_usize { +                    if off != 0 {                          /* Palette index specified, number prepended */ -                        let str_idx = -                            unsafe { line.slice_unchecked(0_usize, off) };                          let parse_res: Result<usize, _> = -                            std::str::FromStr::from_str(str_idx); +                            std::str::FromStr::from_str(&line[0..off]);                          match parse_res {                              Ok(new_idx) =>                                  if new_idx < PALETTE_SIZE { -                                    pal_idx = new_idx * 3_usize; +                                    pal_idx = new_idx * 3;                                  },                              _ => (),                          }                      } -                    let off = off + 1_usize; -                    if off > len - 6_usize { +                    let off = off + 1; +                    if off > len - 6 {                          /* no room left for color definition after '#' char */                          panic!("invalid color definition: {}", line);                      }                      let col = &line[off..(off + RAW_COLEXPR_SIZE)];                      let (r, g, b) = rgb_of_hex_triplet(col); -                    pal[pal_idx + 0_usize] = r; -                    pal[pal_idx + 1_usize] = g; -                    pal[pal_idx + 2_usize] = b; -                    pal_idx = (pal_idx + 3_usize) % PALETTE_BYTES; +                    pal[pal_idx + 0] = r; +                    pal[pal_idx + 1] = g; +                    pal[pal_idx + 2] = b; +                    pal_idx = (pal_idx + 3) % PALETTE_BYTES;                  }              }              line.truncate(0); @@ -431,7 +427,8 @@ impl Palette          /* Check if file exists           */          let file = match std::fs::File::open(&fname) { -            Err(e) => panic!("failed to open {} as file ({})", fname, e), +            Err(e) => +                panic!("failed to open {} as file ({})", fname.display(), e),              Ok(f) => f,          };          let mut reader = std::io::BufReader::new(file); @@ -455,39 +452,39 @@ impl Palette      } /* [Palette::from_stdin] */  } /* [impl Palette] */ -impl std::fmt::Display for Palette +impl fmt::Display for Palette  { -    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result      { -        let mut i: usize = 0_usize; +        let mut i: usize = 0;          while i < PALETTE_BYTES {              let _ = write!(f, "{}", if i == 0 { "(" } else { "\n " }); -            let r = self.colors[i + 0_usize]; -            let g = self.colors[i + 1_usize]; -            let b = self.colors[i + 2_usize]; +            let r = self.colors[i + 0]; +            let g = self.colors[i + 1]; +            let b = self.colors[i + 2];              let _ = write!(                  f,                  "((r 0x{:02.X}) (g 0x{:02.X}) (b 0x{:02.x}))",                  r, g, b              ); -            i = i + 3_usize; +            i = i + 3;          } -        write!(f, ")\n") +        writeln!(f, ")")      } -} /* [impl std::fmt::Display for Palette] */ +} /* [impl fmt::Display for Palette] */ -impl std::fmt::Debug for Palette +impl fmt::Debug for Palette  { -    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result      {          let mut i: u8 = 0_u8;          while (i as usize) < PALETTE_BYTES { -            let r = self.colors[i as usize + 0_usize]; -            let g = self.colors[i as usize + 1_usize]; -            let b = self.colors[i as usize + 2_usize]; -            let _ = write!( +            let r = self.colors[i as usize + 0]; +            let g = self.colors[i as usize + 1]; +            let b = self.colors[i as usize + 2]; +            let _ = writeln!(                  f, -                "{} => 0x{:02.X}{:02.X}{:02.X}\n", +                "{} => 0x{:02.X}{:02.X}{:02.X}",                  Color::of_value(i).to_string(),                  r,                  g, @@ -497,7 +494,7 @@ impl std::fmt::Debug for Palette          }          std::result::Result::Ok(())      } -} /* [impl std::fmt::Debug for Palette] */ +} /* [impl fmt::Debug for Palette] */  fn fd_of_path(path: &std::path::Path) -> Option<Fd>  { @@ -539,17 +536,17 @@ fn get_console_fd(path: Option<&str>) -> Option<Fd>      match path {          Some(path) => {              let path = std::path::Path::new(path); -            match fd_of_path(&path) { +            match fd_of_path(path) {                  Some(fd) => Some(fd),                  None => panic!("cannot open {:?} as a tty", path),              }          },          None => {              let mut it = CONSOLE_PATHS.iter(); -            while let Some(&path) = it.next() { +            while let Some(path) = it.next() {                  vrb!("trying path: {:?}", path);                  let path = std::path::Path::new(path); -                if let Some(fd) = fd_of_path(&path) { +                if let Some(fd) = fd_of_path(path) {                      vrb!(" * Success!");                      return Some(fd);                  } @@ -579,14 +576,13 @@ fn main()  {      let job = Job::from_argv();      vrb!("job parms: {:?}", job); -    let mut pal: Palette = -        match job.scheme { -            Scheme::Default => Palette::new(&DEFAULT_COLORS), -            Scheme::SolarizedDark => Palette::new(&SOLARIZED_COLORS_DARK), -            Scheme::SolarizedLight => Palette::new(&SOLARIZED_COLORS_LIGHT), -            Scheme::Custom(None) => Palette::from_stdin(), -            Scheme::Custom(Some(fname)) => Palette::from_file(&fname), -                }; +    let mut pal: Palette = match job.scheme { +        Scheme::Default => Palette::new(&DEFAULT_COLORS), +        Scheme::SolarizedDark => Palette::new(&SOLARIZED_COLORS_DARK), +        Scheme::SolarizedLight => Palette::new(&SOLARIZED_COLORS_LIGHT), +        Scheme::Custom(None) => Palette::from_stdin(), +        Scheme::Custom(Some(ref fname)) => Palette::from_file(fname), +    };      vrb!("Using palette:");      vrb!("{}", pal);      let fd = get_console_fd(None).unwrap();  | 
