From 8f0edcb9b9846ec123c47f41cd1fd0db9b8d129d Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 13 Apr 2013 18:50:56 -0500 Subject: sketch out a hardcoded backend "make" will now build this, "make CURSES=1" will build the version that uses ncurses --- src/info/builtin.rs | 841 +++++++++++++++++++++++++++++++++++++++++++++++++ util/gen_builtin_db.pl | 98 ++++++ 2 files changed, 939 insertions(+) create mode 100644 util/gen_builtin_db.pl diff --git a/src/info/builtin.rs b/src/info/builtin.rs index e69de29..a6c6481 100644 --- a/src/info/builtin.rs +++ b/src/info/builtin.rs @@ -0,0 +1,841 @@ +/// The default colors available on a terminal emulator. +#[deriving(Eq)] +pub enum Color { + ColorBlack = 0, + ColorRed, + ColorGreen, + ColorYellow, + ColorBlue, + ColorMagenta, + ColorCyan, + ColorWhite, +} + +enum Term { + Linux = 0, + Xterm, + Xterm256color, + Screen, + Screen256color, + Rxvt, + RxvtUnicode, + Aterm, + Eterm, + Kterm, + Gnome, +} + +enum Capability { + Clear = 0, + SetForeground, + SetBackground, + ResetColor, + ResetAttributes, + CursorHome, + CursorMove, + EnableUnderline, + DisableUnderline, + EnableStandout, + DisableStandout, + EnableReverse, + EnableBold, + EnableBlink, + CursorInvisible, + CursorVisible, + EnableAlternateScreen, + DisableAlternateScreen, + EnableKeypadMode, + DisableKeypadMode, + KeyBackspace, + KeyReturn, + KeyTab, + KeyUp, + KeyDown, + KeyLeft, + KeyRight, + KeyHome, + KeyEnd, + KeyInsert, + KeyDelete, + KeyF1, + KeyF2, + KeyF3, + KeyF4, + KeyF5, + KeyF6, + KeyF7, + KeyF8, + KeyF9, + KeyF10, + KeyF11, + KeyF12, +} + +// XXX can't declare these as part of their enums, because of rust/#5873 +static NumTerms: int = 11; +static NumCapabilities: int = 43; + +// NOTE: generated by util/gen_builtin_db.pl +static db: [[Option<&'static str>, ..NumCapabilities], ..NumTerms] = [ + [ // linux + Some("\x1b[H\x1b[J"), // clear + Some("\x1b[3%p1%dm"), // setaf + Some("\x1b[4%p1%dm"), // setab + Some("\x1b[39;49m"), // op + Some("\x1b[0;10m"), // sgr0 + Some("\x1b[H"), // home + Some("\x1b[%i%p1%d;%p2%dH"), // cup + Some("\x1b[4m"), // smul + Some("\x1b[24m"), // rmul + Some("\x1b[7m"), // smso + Some("\x1b[27m"), // rmso + Some("\x1b[7m"), // rev + Some("\x1b[1m"), // bold + Some("\x1b[5m"), // blink + Some("\x1b[?25l\x1b[?1c"), // civis + Some("\x1b[?25h\x1b[?0c"), // cnorm + None, // smcup + None, // rmcup + None, // smkx + None, // rmkx + Some("\x7f"), // kbs + Some("\x0d"), // cr + Some("\x09"), // ht + Some("\x1b[A"), // kcuu1 + Some("\x1b[B"), // kcud1 + Some("\x1b[D"), // kcub1 + Some("\x1b[C"), // kcuf1 + Some("\x1b[1~"), // khome + Some("\x1b[4~"), // kend + Some("\x1b[2~"), // kich1 + Some("\x1b[3~"), // kdch1 + Some("\x1b[[A"), // kf1 + Some("\x1b[[B"), // kf2 + Some("\x1b[[C"), // kf3 + Some("\x1b[[D"), // kf4 + Some("\x1b[[E"), // kf5 + Some("\x1b[17~"), // kf6 + Some("\x1b[18~"), // kf7 + Some("\x1b[19~"), // kf8 + Some("\x1b[20~"), // kf9 + Some("\x1b[21~"), // kf10 + Some("\x1b[23~"), // kf11 + Some("\x1b[24~"), // kf12 + ], + [ // xterm + Some("\x1b[H\x1b[2J"), // clear + Some("\x1b[3%p1%dm"), // setaf + Some("\x1b[4%p1%dm"), // setab + Some("\x1b[39;49m"), // op + Some("\x1b(B\x1b[m"), // sgr0 + Some("\x1b[H"), // home + Some("\x1b[%i%p1%d;%p2%dH"), // cup + Some("\x1b[4m"), // smul + Some("\x1b[24m"), // rmul + Some("\x1b[7m"), // smso + Some("\x1b[27m"), // rmso + Some("\x1b[7m"), // rev + Some("\x1b[1m"), // bold + Some("\x1b[5m"), // blink + Some("\x1b[?25l"), // civis + Some("\x1b[?12l\x1b[?25h"), // cnorm + Some("\x1b[?1049h"), // smcup + Some("\x1b[?1049l"), // rmcup + Some("\x1b[?1h\x1b="), // smkx + Some("\x1b[?1l\x1b>"), // rmkx + Some("\x08"), // kbs + Some("\x0d"), // cr + Some("\x09"), // ht + Some("\x1bOA"), // kcuu1 + Some("\x1bOB"), // kcud1 + Some("\x1bOD"), // kcub1 + Some("\x1bOC"), // kcuf1 + Some("\x1bOH"), // khome + Some("\x1bOF"), // kend + Some("\x1b[2~"), // kich1 + Some("\x1b[3~"), // kdch1 + Some("\x1bOP"), // kf1 + Some("\x1bOQ"), // kf2 + Some("\x1bOR"), // kf3 + Some("\x1bOS"), // kf4 + Some("\x1b[15~"), // kf5 + Some("\x1b[17~"), // kf6 + Some("\x1b[18~"), // kf7 + Some("\x1b[19~"), // kf8 + Some("\x1b[20~"), // kf9 + Some("\x1b[21~"), // kf10 + Some("\x1b[23~"), // kf11 + Some("\x1b[24~"), // kf12 + ], + [ // xterm-256color + Some("\x1b[H\x1b[2J"), // clear + Some("\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m"), // setaf + Some("\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m"), // setab + Some("\x1b[39;49m"), // op + Some("\x1b(B\x1b[m"), // sgr0 + Some("\x1b[H"), // home + Some("\x1b[%i%p1%d;%p2%dH"), // cup + Some("\x1b[4m"), // smul + Some("\x1b[24m"), // rmul + Some("\x1b[7m"), // smso + Some("\x1b[27m"), // rmso + Some("\x1b[7m"), // rev + Some("\x1b[1m"), // bold + Some("\x1b[5m"), // blink + Some("\x1b[?25l"), // civis + Some("\x1b[?12l\x1b[?25h"), // cnorm + Some("\x1b[?1049h"), // smcup + Some("\x1b[?1049l"), // rmcup + Some("\x1b[?1h\x1b="), // smkx + Some("\x1b[?1l\x1b>"), // rmkx + Some("\x08"), // kbs + Some("\x0d"), // cr + Some("\x09"), // ht + Some("\x1bOA"), // kcuu1 + Some("\x1bOB"), // kcud1 + Some("\x1bOD"), // kcub1 + Some("\x1bOC"), // kcuf1 + Some("\x1bOH"), // khome + Some("\x1bOF"), // kend + Some("\x1b[2~"), // kich1 + Some("\x1b[3~"), // kdch1 + Some("\x1bOP"), // kf1 + Some("\x1bOQ"), // kf2 + Some("\x1bOR"), // kf3 + Some("\x1bOS"), // kf4 + Some("\x1b[15~"), // kf5 + Some("\x1b[17~"), // kf6 + Some("\x1b[18~"), // kf7 + Some("\x1b[19~"), // kf8 + Some("\x1b[20~"), // kf9 + Some("\x1b[21~"), // kf10 + Some("\x1b[23~"), // kf11 + Some("\x1b[24~"), // kf12 + ], + [ // screen + Some("\x1b[H\x1b[J"), // clear + Some("\x1b[3%p1%dm"), // setaf + Some("\x1b[4%p1%dm"), // setab + Some("\x1b[39;49m"), // op + Some("\x1b[m\x0f"), // sgr0 + Some("\x1b[H"), // home + Some("\x1b[%i%p1%d;%p2%dH"), // cup + Some("\x1b[4m"), // smul + Some("\x1b[24m"), // rmul + Some("\x1b[3m"), // smso + Some("\x1b[23m"), // rmso + Some("\x1b[7m"), // rev + Some("\x1b[1m"), // bold + Some("\x1b[5m"), // blink + Some("\x1b[?25l"), // civis + Some("\x1b[34h\x1b[?25h"), // cnorm + Some("\x1b[?1049h"), // smcup + Some("\x1b[?1049l"), // rmcup + Some("\x1b[?1h\x1b="), // smkx + Some("\x1b[?1l\x1b>"), // rmkx + Some("\x08"), // kbs + Some("\x0d"), // cr + Some("\x09"), // ht + Some("\x1bOA"), // kcuu1 + Some("\x1bOB"), // kcud1 + Some("\x1bOD"), // kcub1 + Some("\x1bOC"), // kcuf1 + Some("\x1b[1~"), // khome + Some("\x1b[4~"), // kend + Some("\x1b[2~"), // kich1 + Some("\x1b[3~"), // kdch1 + Some("\x1bOP"), // kf1 + Some("\x1bOQ"), // kf2 + Some("\x1bOR"), // kf3 + Some("\x1bOS"), // kf4 + Some("\x1b[15~"), // kf5 + Some("\x1b[17~"), // kf6 + Some("\x1b[18~"), // kf7 + Some("\x1b[19~"), // kf8 + Some("\x1b[20~"), // kf9 + Some("\x1b[21~"), // kf10 + Some("\x1b[23~"), // kf11 + Some("\x1b[24~"), // kf12 + ], + [ // screen-256color + Some("\x1b[H\x1b[J"), // clear + Some("\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m"), // setaf + Some("\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m"), // setab + Some("\x1b[39;49m"), // op + Some("\x1b[m\x0f"), // sgr0 + Some("\x1b[H"), // home + Some("\x1b[%i%p1%d;%p2%dH"), // cup + Some("\x1b[4m"), // smul + Some("\x1b[24m"), // rmul + Some("\x1b[3m"), // smso + Some("\x1b[23m"), // rmso + Some("\x1b[7m"), // rev + Some("\x1b[1m"), // bold + Some("\x1b[5m"), // blink + Some("\x1b[?25l"), // civis + Some("\x1b[34h\x1b[?25h"), // cnorm + Some("\x1b[?1049h"), // smcup + Some("\x1b[?1049l"), // rmcup + Some("\x1b[?1h\x1b="), // smkx + Some("\x1b[?1l\x1b>"), // rmkx + Some("\x08"), // kbs + Some("\x0d"), // cr + Some("\x09"), // ht + Some("\x1bOA"), // kcuu1 + Some("\x1bOB"), // kcud1 + Some("\x1bOD"), // kcub1 + Some("\x1bOC"), // kcuf1 + Some("\x1b[1~"), // khome + Some("\x1b[4~"), // kend + Some("\x1b[2~"), // kich1 + Some("\x1b[3~"), // kdch1 + Some("\x1bOP"), // kf1 + Some("\x1bOQ"), // kf2 + Some("\x1bOR"), // kf3 + Some("\x1bOS"), // kf4 + Some("\x1b[15~"), // kf5 + Some("\x1b[17~"), // kf6 + Some("\x1b[18~"), // kf7 + Some("\x1b[19~"), // kf8 + Some("\x1b[20~"), // kf9 + Some("\x1b[21~"), // kf10 + Some("\x1b[23~"), // kf11 + Some("\x1b[24~"), // kf12 + ], + [ // rxvt + Some("\x1b[H\x1b[2J"), // clear + Some("\x1b[3%p1%dm"), // setaf + Some("\x1b[4%p1%dm"), // setab + Some("\x1b[39;49m"), // op + Some("\x1b[m\x0f"), // sgr0 + Some("\x1b[H"), // home + Some("\x1b[%i%p1%d;%p2%dH"), // cup + Some("\x1b[4m"), // smul + Some("\x1b[24m"), // rmul + Some("\x1b[7m"), // smso + Some("\x1b[27m"), // rmso + Some("\x1b[7m"), // rev + Some("\x1b[1m"), // bold + Some("\x1b[5m"), // blink + Some("\x1b[?25l"), // civis + Some("\x1b[?25h"), // cnorm + Some("\x1b7\x1b[?47h"), // smcup + Some("\x1b[2J\x1b[?47l\x1b8"), // rmcup + Some("\x1b="), // smkx + Some("\x1b>"), // rmkx + Some("\x08"), // kbs + Some("\x0d"), // cr + Some("\x09"), // ht + Some("\x1b[A"), // kcuu1 + Some("\x1b[B"), // kcud1 + Some("\x1b[D"), // kcub1 + Some("\x1b[C"), // kcuf1 + Some("\x1b[7~"), // khome + Some("\x1b[8~"), // kend + Some("\x1b[2~"), // kich1 + Some("\x1b[3~"), // kdch1 + Some("\x1b[11~"), // kf1 + Some("\x1b[12~"), // kf2 + Some("\x1b[13~"), // kf3 + Some("\x1b[14~"), // kf4 + Some("\x1b[15~"), // kf5 + Some("\x1b[17~"), // kf6 + Some("\x1b[18~"), // kf7 + Some("\x1b[19~"), // kf8 + Some("\x1b[20~"), // kf9 + Some("\x1b[21~"), // kf10 + Some("\x1b[23~"), // kf11 + Some("\x1b[24~"), // kf12 + ], + [ // rxvt-unicode + Some("\x1b[H\x1b[2J"), // clear + Some("\x1b[38;5;%p1%dm"), // setaf + Some("\x1b[48;5;%p1%dm"), // setab + Some("\x1b[39;49m"), // op + Some("\x1b[m\x1b(B"), // sgr0 + Some("\x1b[H"), // home + Some("\x1b[%i%p1%d;%p2%dH"), // cup + Some("\x1b[4m"), // smul + Some("\x1b[24m"), // rmul + Some("\x1b[7m"), // smso + Some("\x1b[27m"), // rmso + Some("\x1b[7m"), // rev + Some("\x1b[1m"), // bold + Some("\x1b[5m"), // blink + Some("\x1b[?25l"), // civis + Some("\x1b[?25h"), // cnorm + Some("\x1b[?1049h"), // smcup + Some("\x1b[r\x1b[?1049l"), // rmcup + Some("\x1b="), // smkx + Some("\x1b>"), // rmkx + Some("\x7f"), // kbs + Some("\x0d"), // cr + Some("\x09"), // ht + Some("\x1b[A"), // kcuu1 + Some("\x1b[B"), // kcud1 + Some("\x1b[D"), // kcub1 + Some("\x1b[C"), // kcuf1 + Some("\x1b[7~"), // khome + Some("\x1b[8~"), // kend + Some("\x1b[2~"), // kich1 + Some("\x1b[3~"), // kdch1 + Some("\x1b[11~"), // kf1 + Some("\x1b[12~"), // kf2 + Some("\x1b[13~"), // kf3 + Some("\x1b[14~"), // kf4 + Some("\x1b[15~"), // kf5 + Some("\x1b[17~"), // kf6 + Some("\x1b[18~"), // kf7 + Some("\x1b[19~"), // kf8 + Some("\x1b[20~"), // kf9 + Some("\x1b[21~"), // kf10 + Some("\x1b[23~"), // kf11 + Some("\x1b[24~"), // kf12 + ], + [ // aterm + Some("\x1b[H\x1b[2J"), // clear + Some("\x1b[3%p1%dm"), // setaf + Some("\x1b[4%p1%dm"), // setab + Some("\x1b[39;49m"), // op + Some("\x1b[m\x0f"), // sgr0 + Some("\x1b[H"), // home + Some("\x1b[%i%p1%d;%p2%dH"), // cup + Some("\x1b[4m"), // smul + Some("\x1b[24m"), // rmul + Some("\x1b[7m"), // smso + Some("\x1b[27m"), // rmso + Some("\x1b[7m"), // rev + Some("\x1b[1m"), // bold + Some("\x1b[5m"), // blink + Some("\x1b[?25l"), // civis + Some("\x1b[?25h"), // cnorm + Some("\x1b7\x1b[?47h"), // smcup + Some("\x1b[2J\x1b[?47l\x1b8"), // rmcup + Some("\x1b="), // smkx + Some("\x1b>"), // rmkx + Some("\x7f"), // kbs + Some("\x0d"), // cr + Some("\x09"), // ht + Some("\x1b[A"), // kcuu1 + Some("\x1b[B"), // kcud1 + Some("\x1b[D"), // kcub1 + Some("\x1b[C"), // kcuf1 + Some("\x1b[7~"), // khome + Some("\x1b[8~"), // kend + Some("\x1b[2~"), // kich1 + Some("\x1b[3~"), // kdch1 + Some("\x1bOP"), // kf1 + Some("\x1bOQ"), // kf2 + Some("\x1bOR"), // kf3 + Some("\x1bOS"), // kf4 + Some("\x1b[15~"), // kf5 + Some("\x1b[17~"), // kf6 + Some("\x1b[18~"), // kf7 + Some("\x1b[19~"), // kf8 + Some("\x1b[20~"), // kf9 + Some("\x1b[21~"), // kf10 + Some("\x1b[23~"), // kf11 + Some("\x1b[24~"), // kf12 + ], + [ // Eterm + Some("\x1b[H\x1b[2J"), // clear + Some("\x1b[3%p1%dm"), // setaf + Some("\x1b[4%p1%dm"), // setab + Some("\x1b[39;49m"), // op + Some("\x1b[m\x0f"), // sgr0 + Some("\x1b[H"), // home + Some("\x1b[%i%p1%d;%p2%dH"), // cup + Some("\x1b[4m"), // smul + Some("\x1b[24m"), // rmul + Some("\x1b[7m"), // smso + Some("\x1b[27m"), // rmso + Some("\x1b[7m"), // rev + Some("\x1b[1m"), // bold + Some("\x1b[5m"), // blink + Some("\x1b[?25l"), // civis + Some("\x1b[?25h"), // cnorm + Some("\x1b7\x1b[?47h"), // smcup + Some("\x1b[2J\x1b[?47l\x1b8"), // rmcup + Some(""), // smkx + Some(""), // rmkx + Some("\x08"), // kbs + Some("\x0d"), // cr + Some("\x09"), // ht + Some("\x1b[A"), // kcuu1 + Some("\x1b[B"), // kcud1 + Some("\x1b[D"), // kcub1 + Some("\x1b[C"), // kcuf1 + Some("\x1b[7~"), // khome + Some("\x1b[8~"), // kend + Some("\x1b[2~"), // kich1 + Some("\x1b[3~"), // kdch1 + Some("\x1b[11~"), // kf1 + Some("\x1b[12~"), // kf2 + Some("\x1b[13~"), // kf3 + Some("\x1b[14~"), // kf4 + Some("\x1b[15~"), // kf5 + Some("\x1b[17~"), // kf6 + Some("\x1b[18~"), // kf7 + Some("\x1b[19~"), // kf8 + Some("\x1b[20~"), // kf9 + Some("\x1b[21~"), // kf10 + Some("\x1b[23~"), // kf11 + Some("\x1b[24~"), // kf12 + ], + [ // kterm + Some("\x1b[H\x1b[2J"), // clear + Some("\x1b[3%p1%dm"), // setaf + Some("\x1b[4%p1%dm"), // setab + Some("\x1b[39;49m"), // op + Some("\x1b[m\x1b(B"), // sgr0 + Some("\x1b[H"), // home + Some("\x1b[%i%p1%d;%p2%dH"), // cup + Some("\x1b[4m"), // smul + Some("\x1b[m"), // rmul + Some("\x1b[7m"), // smso + Some("\x1b[m"), // rmso + Some("\x1b[7m"), // rev + Some("\x1b[1m"), // bold + None, // blink + None, // civis + None, // cnorm + Some("\x1b7\x1b[?47h"), // smcup + Some("\x1b[2J\x1b[?47l\x1b8"), // rmcup + Some("\x1b[?1h\x1b="), // smkx + Some("\x1b[?1l\x1b>"), // rmkx + Some("\x08"), // kbs + Some("\x0d"), // cr + Some("\x09"), // ht + Some("\x1bOA"), // kcuu1 + Some("\x1bOB"), // kcud1 + Some("\x1bOD"), // kcub1 + Some("\x1bOC"), // kcuf1 + None, // khome + None, // kend + Some("\x1b[2~"), // kich1 + Some("\x1b[3~"), // kdch1 + Some("\x1b[11~"), // kf1 + Some("\x1b[12~"), // kf2 + Some("\x1b[13~"), // kf3 + Some("\x1b[14~"), // kf4 + Some("\x1b[15~"), // kf5 + Some("\x1b[17~"), // kf6 + Some("\x1b[18~"), // kf7 + Some("\x1b[19~"), // kf8 + Some("\x1b[20~"), // kf9 + Some("\x1b[21~"), // kf10 + Some("\x1b[23~"), // kf11 + Some("\x1b[24~"), // kf12 + ], + [ // gnome + Some("\x1b[H\x1b[2J"), // clear + Some("\x1b[3%p1%dm"), // setaf + Some("\x1b[4%p1%dm"), // setab + Some("\x1b[39;49m"), // op + Some("\x1b[0m\x0f"), // sgr0 + Some("\x1b[H"), // home + Some("\x1b[%i%p1%d;%p2%dH"), // cup + Some("\x1b[4m"), // smul + Some("\x1b[m"), // rmul + Some("\x1b[7m"), // smso + Some("\x1b[m"), // rmso + Some("\x1b[7m"), // rev + Some("\x1b[1m"), // bold + None, // blink + Some("\x1b[?25l"), // civis + Some("\x1b[?25h"), // cnorm + Some("\x1b7\x1b[?47h"), // smcup + Some("\x1b[2J\x1b[?47l\x1b8"), // rmcup + Some("\x1b[?1h\x1b="), // smkx + Some("\x1b[?1l\x1b>"), // rmkx + Some("\x7f"), // kbs + Some("\x0d"), // cr + Some("\x09"), // ht + Some("\x1bOA"), // kcuu1 + Some("\x1bOB"), // kcud1 + Some("\x1bOD"), // kcub1 + Some("\x1bOC"), // kcuf1 + Some("\x1bOH"), // khome + Some("\x1bOF"), // kend + Some("\x1b[2~"), // kich1 + Some("\x1b[3~"), // kdch1 + Some("\x1bOP"), // kf1 + Some("\x1bOQ"), // kf2 + Some("\x1bOR"), // kf3 + Some("\x1bOS"), // kf4 + Some("\x1b[15~"), // kf5 + Some("\x1b[17~"), // kf6 + Some("\x1b[18~"), // kf7 + Some("\x1b[19~"), // kf8 + Some("\x1b[20~"), // kf9 + Some("\x1b[21~"), // kf10 + Some("\x1b[23~"), // kf11 + Some("\x1b[24~"), // kf12 + ], +]; + +pub fn init () { + // nothing + // TODO cache the value of TERM here, so we don't have to keep looking it + // up? this will require mutable globals +} + +pub fn escape (name: &str) -> Option<~str> { + let cap = name_to_cap(name).expect( + fmt!("Unknown terminal capability %s", name) + ); + escape_cap(cap) +} + +pub fn escape1 (name: &str, p1: int) -> Option<~str> { + escape(name).map(|&s| { tparm1(s, p1) }) +} + +pub fn escape2 (name: &str, p1: int, p2: int) -> Option<~str> { + escape(name).map(|&s| { tparm2(s, p1, p2) }) +} + +fn escape_cap (cap: Capability) -> Option<~str> { + // TODO warning and default to xterm, maybe? + let termname = os::getenv("TERM").expect( + "The TERM environment variable is not set" + ); + // TODO can we actually dynamically load libcurses and fall back to that + // if it exists? + let term = name_to_term(termname).expect( + fmt!("Unknown terminal type %s", termname) + ); + db[term as int][cap as int].map(|s| { s.to_owned() }) +} + +fn name_to_term (name: &str) -> Option { + match name { + "linux" => Some(Linux), + "xterm" => Some(Xterm), + "xterm-256color" => Some(Xterm256color), + "screen" => Some(Screen), + "screen-256color" => Some(Screen256color), + "rxvt" => Some(Rxvt), + "rxvt-unicode" => Some(RxvtUnicode), + "aterm" => Some(Aterm), + "Eterm" => Some(Eterm), + "kterm" => Some(Kterm), + "gnome" => Some(Gnome), + _ => None, + } +} + +fn name_to_cap (name: &str) -> Option { + match name { + "clear" => Some(Clear), + "setaf" => Some(SetForeground), + "setab" => Some(SetBackground), + "op" => Some(ResetColor), + "sgr0" => Some(ResetAttributes), + "home" => Some(CursorHome), + "cup" => Some(CursorMove), + "smul" => Some(EnableUnderline), + "rmul" => Some(DisableUnderline), + "smso" => Some(EnableStandout), + "rmso" => Some(DisableStandout), + "rev" => Some(EnableReverse), + "bold" => Some(EnableBold), + "blink" => Some(EnableBlink), + "civis" => Some(CursorInvisible), + "cnorm" => Some(CursorVisible), + "smcup" => Some(EnableAlternateScreen), + "rmcup" => Some(DisableAlternateScreen), + "smkx" => Some(EnableKeypadMode), + "rmkx" => Some(DisableKeypadMode), + "kbs" => Some(KeyBackspace), + "cr" => Some(KeyReturn), + "ht" => Some(KeyTab), + "kcuu1" => Some(KeyUp), + "kcud1" => Some(KeyDown), + "kcub1" => Some(KeyLeft), + "kcuf1" => Some(KeyRight), + "khome" => Some(KeyHome), + "kend" => Some(KeyEnd), + "kich1" => Some(KeyInsert), + "kdch1" => Some(KeyDelete), + "kf1" => Some(KeyF1), + "kf2" => Some(KeyF2), + "kf3" => Some(KeyF3), + "kf4" => Some(KeyF4), + "kf5" => Some(KeyF5), + "kf6" => Some(KeyF6), + "kf7" => Some(KeyF7), + "kf8" => Some(KeyF8), + "kf9" => Some(KeyF9), + "kf10" => Some(KeyF10), + "kf11" => Some(KeyF11), + "kf12" => Some(KeyF12), + _ => None, + } +} + +fn tparm1 (s: &str, p1: int) -> ~str { + tparm2(s, p1, 0) +} + +// XXX awful implementation +fn tparm2 (s: &str, p1: int, p2: int) -> ~str { + let mut r = s.to_owned(); + let mut a1 = p1; + let mut a2 = p2; + + if r.contains("%i") { + r = str::replace(r, "%i", ""); + a1 += 1; + a2 += 1; + } + r = str::replace(r, "%p1%d", fmt!("%d", a1)); + r = str::replace(r, "%p2%d", fmt!("%d", a2)); + let mut i = 0; + while i < r.len() - 1 { + if r.char_at(i) == '%' { + if r.char_at(i + 1) == '%' { + i += 2; + } + else { + fail!(fmt!("Unknown escape sequence %s", r.slice(i, i + 2))); + } + } + i += 1; + } + r = str::replace(r, "%%", "%"); + r +} + +macro_rules! def_escape( + ($name:ident -> $escape:expr) => ( + pub fn $name () -> ~str { + let attr = $escape; + match escape(attr) { + Some(e) => e, + None => fail!(fmt!("%s is not supported on this terminal", + attr)), + } + } + ); + ($name:ident -> $escape:expr, $ty1:ident) => ( + pub fn $name (p1: $ty1) -> ~str { + let attr = $escape; + match escape1(attr, p1 as int) { + Some(e) => e, + None => fail!(fmt!("%s is not supported on this terminal", + attr)), + } + } + ); + ($name:ident -> $escape:expr, $ty1:ident, $ty2:ident) => ( + pub fn $name (p1: $ty1, p2: $ty2) -> ~str { + let attr = $escape; + match escape2(attr, p1 as int, p2 as int) { + Some(e) => e, + None => fail!(fmt!("%s is not supported on this terminal", + attr)), + } + } + ); +) + +// XXX macros can't take attributes yet (including documentation), so change +// these to /// once that is fixed + +// The terminal escape to clear the screen. +def_escape!(clear_screen -> "clear") +// The terminal escape to set the foreground color to `p1`. +def_escape!(set_a_foreground -> "setaf", Color) +// The terminal escape to set the background color to `p1`. +def_escape!(set_a_background -> "setab", Color) +// The terminal escape to reset the foreground and background colors. +def_escape!(orig_pair -> "op") +// The terminal escape to reset all attributes. +def_escape!(exit_attribute_mode -> "sgr0") +// The terminal escape to move the cursor to the top left of the screen. +def_escape!(cursor_home -> "home") +// The terminal escape to move the cursor to (`p1`, `p2`). +def_escape!(cursor_address -> "cup", uint, uint) +// The terminal escape to enable underline mode. +def_escape!(enter_underline_mode -> "smul") +// The terminal escape to disable underline mode. +def_escape!(exit_underline_mode -> "rmul") +// The terminal escape to enable standout mode. +def_escape!(enter_standout_mode -> "smso") +// The terminal escape to disable standout mode. +def_escape!(exit_standout_mode -> "rmso") +// The terminal escape to enable reverse video mode. +def_escape!(enter_reverse_mode -> "rev") +// The terminal escape to enable bold mode. +def_escape!(enter_bold_mode -> "bold") +// The terminal escape to enable blink mode. +def_escape!(enter_blink_mode -> "blink") +// The terminal escape to make the cursor invisible. +def_escape!(cursor_invisible -> "civis") +// The terminal escape to make the cursor visible. +def_escape!(cursor_normal -> "cnorm") +// The terminal escape to enable the alternate screen. +def_escape!(enter_ca_mode -> "smcup") +// The terminal escape to disable the alternate screen. +def_escape!(exit_ca_mode -> "rmcup") +// The terminal escape to enter keypad mode. +def_escape!(keypad_xmit -> "smkx") +// The terminal escape to leave keypad mode. +def_escape!(keypad_local -> "rmkx") + +// The terminal escape generated by the backspace key. +def_escape!(key_backspace -> "kbs") +// The terminal escape generated by the return key. +def_escape!(carriage_return -> "cr") +// The terminal escape generated by the tab key. +def_escape!(tab -> "ht") +// The terminal escape generated by the up arrow key. +def_escape!(key_up -> "kcuu1") +// The terminal escape generated by the down arrow key. +def_escape!(key_down -> "kcud1") +// The terminal escape generated by the left arrow key. +def_escape!(key_left -> "kcub1") +// The terminal escape generated by the right arrow key. +def_escape!(key_right -> "kcuf1") +// The terminal escape generated by the home key. +def_escape!(key_home -> "khome") +// The terminal escape generated by the end key. +def_escape!(key_end -> "kend") +// The terminal escape generated by the insert key. +def_escape!(key_ic -> "kich1") +// The terminal escape generated by the delete key. +def_escape!(key_dc -> "kdch1") +// The terminal escape generated by the F1 key. +def_escape!(key_f1 -> "kf1") +// The terminal escape generated by the F2 key. +def_escape!(key_f2 -> "kf2") +// The terminal escape generated by the F3 key. +def_escape!(key_f3 -> "kf3") +// The terminal escape generated by the F4 key. +def_escape!(key_f4 -> "kf4") +// The terminal escape generated by the F5 key. +def_escape!(key_f5 -> "kf5") +// The terminal escape generated by the F6 key. +def_escape!(key_f6 -> "kf6") +// The terminal escape generated by the F7 key. +def_escape!(key_f7 -> "kf7") +// The terminal escape generated by the F8 key. +def_escape!(key_f8 -> "kf8") +// The terminal escape generated by the F9 key. +def_escape!(key_f9 -> "kf9") +// The terminal escape generated by the F10 key. +def_escape!(key_f10 -> "kf10") +// The terminal escape generated by the F11 key. +def_escape!(key_f11 -> "kf11") +// The terminal escape generated by the F12 key. +def_escape!(key_f12 -> "kf12") + +/// The terminal escape generated by the F<`n`> key. +pub fn key_f (n: uint) -> ~str { + let attr = fmt!("kf%?", n); + match escape(attr) { + Some(e) => e, + None => fail!(fmt!("%s is not supported on this terminal", attr)), + } +} diff --git a/util/gen_builtin_db.pl b/util/gen_builtin_db.pl new file mode 100644 index 0000000..036a556 --- /dev/null +++ b/util/gen_builtin_db.pl @@ -0,0 +1,98 @@ +#!/usr/bin/env perl +use strict; +use warnings; + +my @terms = qw( + linux + xterm + xterm-256color + screen + screen-256color + rxvt + rxvt-unicode + aterm + Eterm + kterm + gnome +); + +my @caps = qw( + clear + setaf + setab + op + sgr0 + home + cup + smul + rmul + smso + rmso + rev + bold + blink + civis + cnorm + smcup + rmcup + smkx + rmkx + kbs + cr + ht + kcuu1 + kcud1 + kcub1 + kcuf1 + khome + kend + kich1 + kdch1 + kf1 + kf2 + kf3 + kf4 + kf5 + kf6 + kf7 + kf8 + kf9 + kf10 + kf11 + kf12 +); + +my @db; +for my $term (@terms) { + my @vals; + for my $cap (@caps) { + my $str = `tput -T$term $cap`; + if ($? == 0) { + push @vals, $str; + } + else { + push @vals, undef; + } + } + push @db, \@vals; +} + +my $i = 0; +for my $row (@db) { + print " [ // " . $terms[$i] . "\n"; + my $j = 0; + for my $val (@$row) { + print " "; + if (defined $val) { + $val =~ s/(\P{Print})/"\\x" . sprintf("%02x", ord($1))/ge; + print "Some(\"$val\"),"; + } + else { + print "None,"; + } + print " // " . $caps[$j] . "\n"; + $j++; + } + print " ],\n"; + $i++; +} -- cgit v1.2.3-54-g00ecf