test/term/terminfo/
searcher.rs1use std::path::PathBuf;
6use std::{env, fs};
7
8#[cfg(test)]
9mod tests;
10
11#[allow(deprecated)]
13pub(crate) fn get_dbpath_for_term(term: &str) -> Option<PathBuf> {
14 let mut dirs_to_search = Vec::new();
15 let first_char = term.chars().next()?;
16
17 if let Some(dir) = env::var_os("TERMINFO") {
19 dirs_to_search.push(PathBuf::from(dir));
20 }
21
22 if let Ok(dirs) = env::var("TERMINFO_DIRS") {
23 for i in dirs.split(':') {
24 if i.is_empty() {
25 dirs_to_search.push(PathBuf::from("/usr/share/terminfo"));
26 } else {
27 dirs_to_search.push(PathBuf::from(i));
28 }
29 }
30 } else {
31 if let Some(mut homedir) = env::home_dir() {
37 homedir.push(".terminfo");
38 dirs_to_search.push(homedir)
39 }
40
41 dirs_to_search.push(PathBuf::from("/etc/terminfo"));
42 dirs_to_search.push(PathBuf::from("/lib/terminfo"));
43 dirs_to_search.push(PathBuf::from("/usr/share/terminfo"));
44 dirs_to_search.push(PathBuf::from("/boot/system/data/terminfo"));
45 }
46
47 for mut p in dirs_to_search {
49 if fs::metadata(&p).is_ok() {
50 p.push(&first_char.to_string());
51 p.push(term);
52 if fs::metadata(&p).is_ok() {
53 return Some(p);
54 }
55 p.pop();
56 p.pop();
57
58 p.push(&format!("{:x}", first_char as usize));
61 p.push(term);
62 if fs::metadata(&p).is_ok() {
63 return Some(p);
64 }
65 }
66 }
67 None
68}