1 //! ncurses-compatible database discovery.
3 //! Does not support hashed database, only filesystem!
7 use std::path::PathBuf;
12 /// Return path to database entry for `term`
14 pub(crate) fn get_dbpath_for_term(term: &str) -> Option<PathBuf> {
15 let mut dirs_to_search = Vec::new();
16 let first_char = term.chars().next()?;
18 // Find search directory
19 if let Some(dir) = env::var_os("TERMINFO") {
20 dirs_to_search.push(PathBuf::from(dir));
23 if let Ok(dirs) = env::var("TERMINFO_DIRS") {
24 for i in dirs.split(':') {
26 dirs_to_search.push(PathBuf::from("/usr/share/terminfo"));
28 dirs_to_search.push(PathBuf::from(i));
32 // Found nothing in TERMINFO_DIRS, use the default paths:
33 // According to /etc/terminfo/README, after looking at
34 // ~/.terminfo, ncurses will search /etc/terminfo, then
35 // /lib/terminfo, and eventually /usr/share/terminfo.
36 // On Haiku the database can be found at /boot/system/data/terminfo
37 if let Some(mut homedir) = env::home_dir() {
38 homedir.push(".terminfo");
39 dirs_to_search.push(homedir)
42 dirs_to_search.push(PathBuf::from("/etc/terminfo"));
43 dirs_to_search.push(PathBuf::from("/lib/terminfo"));
44 dirs_to_search.push(PathBuf::from("/usr/share/terminfo"));
45 dirs_to_search.push(PathBuf::from("/boot/system/data/terminfo"));
48 // Look for the terminal in all of the search directories
49 for mut p in dirs_to_search {
50 if fs::metadata(&p).is_ok() {
51 p.push(&first_char.to_string());
53 if fs::metadata(&p).is_ok() {
59 // on some installations the dir is named after the hex of the char
61 p.push(&format!("{:x}", first_char as usize));
63 if fs::metadata(&p).is_ok() {