]> git.lizzy.rs Git - rust.git/blob - library/test/src/term/terminfo/searcher.rs
Unify Opaque/Projection handling in region outlives code
[rust.git] / library / test / src / term / terminfo / searcher.rs
1 //! ncurses-compatible database discovery.
2 //!
3 //! Does not support hashed database, only filesystem!
4
5 use std::env;
6 use std::fs;
7 use std::path::PathBuf;
8
9 #[cfg(test)]
10 mod tests;
11
12 /// Return path to database entry for `term`
13 #[allow(deprecated)]
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()?;
17
18     // Find search directory
19     if let Some(dir) = env::var_os("TERMINFO") {
20         dirs_to_search.push(PathBuf::from(dir));
21     }
22
23     if let Ok(dirs) = env::var("TERMINFO_DIRS") {
24         for i in dirs.split(':') {
25             if i.is_empty() {
26                 dirs_to_search.push(PathBuf::from("/usr/share/terminfo"));
27             } else {
28                 dirs_to_search.push(PathBuf::from(i));
29             }
30         }
31     } else {
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)
40         }
41
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"));
46     }
47
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());
52             p.push(term);
53             if fs::metadata(&p).is_ok() {
54                 return Some(p);
55             }
56             p.pop();
57             p.pop();
58
59             // on some installations the dir is named after the hex of the char
60             // (e.g., macOS)
61             p.push(&format!("{:x}", first_char as usize));
62             p.push(term);
63             if fs::metadata(&p).is_ok() {
64                 return Some(p);
65             }
66         }
67     }
68     None
69 }