/*
* Copyright (c) 2002-2016, the original author or authors.
*
* This software is distributable under the BSD license. See the terms of the
* BSD license in the documentation provided with this software.
*
* http://www.opensource.org/licenses/bsd-license.php
*/
package jdk.internal.org.jline.utils;
import java.io.BufferedReader;
import java.io.IOError;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
Infocmp helper methods.
Author: Guillaume Nodet
/**
* Infocmp helper methods.
*
* @author <a href="mailto:gnodet@gmail.com">Guillaume Nodet</a>
*/
public final class InfoCmp {
private static final Map<String, Object> CAPS = new HashMap<>();
private InfoCmp() {
}
@SuppressWarnings("unused")
public enum Capability {
auto_left_margin, // auto_left_margin, bw, bw
auto_right_margin, // auto_right_margin, am, am
back_color_erase, // back_color_erase, bce, ut
can_change, // can_change, ccc, cc
ceol_standout_glitch, // ceol_standout_glitch, xhp, xs
col_addr_glitch, // col_addr_glitch, xhpa, YA
cpi_changes_res, // cpi_changes_res, cpix, YF
cr_cancels_micro_mode, // cr_cancels_micro_mode, crxm, YB
dest_tabs_magic_smso, // dest_tabs_magic_smso, xt, xt
eat_newline_glitch, // eat_newline_glitch, xenl, xn
erase_overstrike, // erase_overstrike, eo, eo
generic_type, // generic_type, gn, gn
hard_copy, // hard_copy, hc, hc
hard_cursor, // hard_cursor, chts, HC
has_meta_key, // has_meta_key, km, km
has_print_wheel, // has_print_wheel, daisy, YC
has_status_line, // has_status_line, hs, hs
hue_lightness_saturation, // hue_lightness_saturation, hls, hl
insert_null_glitch, // insert_null_glitch, in, in
lpi_changes_res, // lpi_changes_res, lpix, YG
memory_above, // memory_above, da, da
memory_below, // memory_below, db, db
move_insert_mode, // move_insert_mode, mir, mi
move_standout_mode, // move_standout_mode, msgr, ms
needs_xon_xoff, // needs_xon_xoff, nxon, nx
no_esc_ctlc, // no_esc_ctlc, xsb, xb
no_pad_char, // no_pad_char, npc, NP
non_dest_scroll_region, // non_dest_scroll_region, ndscr, ND
non_rev_rmcup, // non_rev_rmcup, nrrmc, NR
over_strike, // over_strike, os, os
prtr_silent, // prtr_silent, mc5i, 5i
row_addr_glitch, // row_addr_glitch, xvpa, YD
semi_auto_right_margin, // semi_auto_right_margin, sam, YE
status_line_esc_ok, // status_line_esc_ok, eslok, es
tilde_glitch, // tilde_glitch, hz, hz
transparent_underline, // transparent_underline, ul, ul
xon_xoff, // xon_xoff, xon, xo
columns, // columns, cols, co
init_tabs, // init_tabs, it, it
label_height, // label_height, lh, lh
label_width, // label_width, lw, lw
lines, // lines, lines, li
lines_of_memory, // lines_of_memory, lm, lm
magic_cookie_glitch, // magic_cookie_glitch, xmc, sg
max_attributes, // max_attributes, ma, ma
max_colors, // max_colors, colors, Co
max_pairs, // max_pairs, pairs, pa
maximum_windows, // maximum_windows, wnum, MW
no_color_video, // no_color_video, ncv, NC
num_labels, // num_labels, nlab, Nl
padding_baud_rate, // padding_baud_rate, pb, pb
virtual_terminal, // virtual_terminal, vt, vt
width_status_line, // width_status_line, wsl, ws
bit_image_entwining, // bit_image_entwining, bitwin, Yo
bit_image_type, // bit_image_type, bitype, Yp
buffer_capacity, // buffer_capacity, bufsz, Ya
buttons, // buttons, btns, BT
dot_horz_spacing, // dot_horz_spacing, spinh, Yc
dot_vert_spacing, // dot_vert_spacing, spinv, Yb
max_micro_address, // max_micro_address, maddr, Yd
max_micro_jump, // max_micro_jump, mjump, Ye
micro_col_size, // micro_col_size, mcs, Yf
micro_line_size, // micro_line_size, mls, Yg
number_of_pins, // number_of_pins, npins, Yh
output_res_char, // output_res_char, orc, Yi
output_res_horz_inch, // output_res_horz_inch, orhi, Yk
output_res_line, // output_res_line, orl, Yj
output_res_vert_inch, // output_res_vert_inch, orvi, Yl
print_rate, // print_rate, cps, Ym
wide_char_size, // wide_char_size, widcs, Yn
acs_chars, // acs_chars, acsc, ac
back_tab, // back_tab, cbt, bt
bell, // bell, bel, bl
carriage_return, // carriage_return, cr, cr
change_char_pitch, // change_char_pitch, cpi, ZA
change_line_pitch, // change_line_pitch, lpi, ZB
change_res_horz, // change_res_horz, chr, ZC
change_res_vert, // change_res_vert, cvr, ZD
change_scroll_region, // change_scroll_region, csr, cs
char_padding, // char_padding, rmp, rP
clear_all_tabs, // clear_all_tabs, tbc, ct
clear_margins, // clear_margins, mgc, MC
clear_screen, // clear_screen, clear, cl
clr_bol, // clr_bol, el1, cb
clr_eol, // clr_eol, el, ce
clr_eos, // clr_eos, ed, cd
column_address, // column_address, hpa, ch
command_character, // command_character, cmdch, CC
create_window, // create_window, cwin, CW
cursor_address, // cursor_address, cup, cm
cursor_down, // cursor_down, cud1, do
cursor_home, // cursor_home, home, ho
cursor_invisible, // cursor_invisible, civis, vi
cursor_left, // cursor_left, cub1, le
cursor_mem_address, // cursor_mem_address, mrcup, CM
cursor_normal, // cursor_normal, cnorm, ve
cursor_right, // cursor_right, cuf1, nd
cursor_to_ll, // cursor_to_ll, ll, ll
cursor_up, // cursor_up, cuu1, up
cursor_visible, // cursor_visible, cvvis, vs
define_char, // define_char, defc, ZE
delete_character, // delete_character, dch1, dc
delete_line, // delete_line, dl1, dl
dial_phone, // dial_phone, dial, DI
dis_status_line, // dis_status_line, dsl, ds
display_clock, // display_clock, dclk, DK
down_half_line, // down_half_line, hd, hd
ena_acs, // ena_acs, enacs, eA
enter_alt_charset_mode, // enter_alt_charset_mode, smacs, as
enter_am_mode, // enter_am_mode, smam, SA
enter_blink_mode, // enter_blink_mode, blink, mb
enter_bold_mode, // enter_bold_mode, bold, md
enter_ca_mode, // enter_ca_mode, smcup, ti
enter_delete_mode, // enter_delete_mode, smdc, dm
enter_dim_mode, // enter_dim_mode, dim, mh
enter_doublewide_mode, // enter_doublewide_mode, swidm, ZF
enter_draft_quality, // enter_draft_quality, sdrfq, ZG
enter_insert_mode, // enter_insert_mode, smir, im
enter_italics_mode, // enter_italics_mode, sitm, ZH
enter_leftward_mode, // enter_leftward_mode, slm, ZI
enter_micro_mode, // enter_micro_mode, smicm, ZJ
enter_near_letter_quality, // enter_near_letter_quality, snlq, ZK
enter_normal_quality, // enter_normal_quality, snrmq, ZL
enter_protected_mode, // enter_protected_mode, prot, mp
enter_reverse_mode, // enter_reverse_mode, rev, mr
enter_secure_mode, // enter_secure_mode, invis, mk
enter_shadow_mode, // enter_shadow_mode, sshm, ZM
enter_standout_mode, // enter_standout_mode, smso, so
enter_subscript_mode, // enter_subscript_mode, ssubm, ZN
enter_superscript_mode, // enter_superscript_mode, ssupm, ZO
enter_underline_mode, // enter_underline_mode, smul, us
enter_upward_mode, // enter_upward_mode, sum, ZP
enter_xon_mode, // enter_xon_mode, smxon, SX
erase_chars, // erase_chars, ech, ec
exit_alt_charset_mode, // exit_alt_charset_mode, rmacs, ae
exit_am_mode, // exit_am_mode, rmam, RA
exit_attribute_mode, // exit_attribute_mode, sgr0, me
exit_ca_mode, // exit_ca_mode, rmcup, te
exit_delete_mode, // exit_delete_mode, rmdc, ed
exit_doublewide_mode, // exit_doublewide_mode, rwidm, ZQ
exit_insert_mode, // exit_insert_mode, rmir, ei
exit_italics_mode, // exit_italics_mode, ritm, ZR
exit_leftward_mode, // exit_leftward_mode, rlm, ZS
exit_micro_mode, // exit_micro_mode, rmicm, ZT
exit_shadow_mode, // exit_shadow_mode, rshm, ZU
exit_standout_mode, // exit_standout_mode, rmso, se
exit_subscript_mode, // exit_subscript_mode, rsubm, ZV
exit_superscript_mode, // exit_superscript_mode, rsupm, ZW
exit_underline_mode, // exit_underline_mode, rmul, ue
exit_upward_mode, // exit_upward_mode, rum, ZX
exit_xon_mode, // exit_xon_mode, rmxon, RX
fixed_pause, // fixed_pause, pause, PA
flash_hook, // flash_hook, hook, fh
flash_screen, // flash_screen, flash, vb
form_feed, // form_feed, ff, ff
from_status_line, // from_status_line, fsl, fs
goto_window, // goto_window, wingo, WG
hangup, // hangup, hup, HU
init_1string, // init_1string, is1, i1
init_2string, // init_2string, is2, is
init_3string, // init_3string, is3, i3
init_file, // init_file, if, if
init_prog, // init_prog, iprog, iP
initialize_color, // initialize_color, initc, Ic
initialize_pair, // initialize_pair, initp, Ip
insert_character, // insert_character, ich1, ic
insert_line, // insert_line, il1, al
insert_padding, // insert_padding, ip, ip
key_a1, // key_a1, ka1, K1
key_a3, // key_a3, ka3, K3
key_b2, // key_b2, kb2, K2
key_backspace, // key_backspace, kbs, kb
key_beg, // key_beg, kbeg, @1
key_btab, // key_btab, kcbt, kB
key_c1, // key_c1, kc1, K4
key_c3, // key_c3, kc3, K5
key_cancel, // key_cancel, kcan, @2
key_catab, // key_catab, ktbc, ka
key_clear, // key_clear, kclr, kC
key_close, // key_close, kclo, @3
key_command, // key_command, kcmd, @4
key_copy, // key_copy, kcpy, @5
key_create, // key_create, kcrt, @6
key_ctab, // key_ctab, kctab, kt
key_dc, // key_dc, kdch1, kD
key_dl, // key_dl, kdl1, kL
key_down, // key_down, kcud1, kd
key_eic, // key_eic, krmir, kM
key_end, // key_end, kend, @7
key_enter, // key_enter, kent, @8
key_eol, // key_eol, kel, kE
key_eos, // key_eos, ked, kS
key_exit, // key_exit, kext, @9
key_f0, // key_f0, kf0, k0
key_f1, // key_f1, kf1, k1
key_f10, // key_f10, kf10, k;
key_f11, // key_f11, kf11, F1
key_f12, // key_f12, kf12, F2
key_f13, // key_f13, kf13, F3
key_f14, // key_f14, kf14, F4
key_f15, // key_f15, kf15, F5
key_f16, // key_f16, kf16, F6
key_f17, // key_f17, kf17, F7
key_f18, // key_f18, kf18, F8
key_f19, // key_f19, kf19, F9
key_f2, // key_f2, kf2, k2
key_f20, // key_f20, kf20, FA
key_f21, // key_f21, kf21, FB
key_f22, // key_f22, kf22, FC
key_f23, // key_f23, kf23, FD
key_f24, // key_f24, kf24, FE
key_f25, // key_f25, kf25, FF
key_f26, // key_f26, kf26, FG
key_f27, // key_f27, kf27, FH
key_f28, // key_f28, kf28, FI
key_f29, // key_f29, kf29, FJ
key_f3, // key_f3, kf3, k3
key_f30, // key_f30, kf30, FK
key_f31, // key_f31, kf31, FL
key_f32, // key_f32, kf32, FM
key_f33, // key_f33, kf33, FN
key_f34, // key_f34, kf34, FO
key_f35, // key_f35, kf35, FP
key_f36, // key_f36, kf36, FQ
key_f37, // key_f37, kf37, FR
key_f38, // key_f38, kf38, FS
key_f39, // key_f39, kf39, FT
key_f4, // key_f4, kf4, k4
key_f40, // key_f40, kf40, FU
key_f41, // key_f41, kf41, FV
key_f42, // key_f42, kf42, FW
key_f43, // key_f43, kf43, FX
key_f44, // key_f44, kf44, FY
key_f45, // key_f45, kf45, FZ
key_f46, // key_f46, kf46, Fa
key_f47, // key_f47, kf47, Fb
key_f48, // key_f48, kf48, Fc
key_f49, // key_f49, kf49, Fd
key_f5, // key_f5, kf5, k5
key_f50, // key_f50, kf50, Fe
key_f51, // key_f51, kf51, Ff
key_f52, // key_f52, kf52, Fg
key_f53, // key_f53, kf53, Fh
key_f54, // key_f54, kf54, Fi
key_f55, // key_f55, kf55, Fj
key_f56, // key_f56, kf56, Fk
key_f57, // key_f57, kf57, Fl
key_f58, // key_f58, kf58, Fm
key_f59, // key_f59, kf59, Fn
key_f6, // key_f6, kf6, k6
key_f60, // key_f60, kf60, Fo
key_f61, // key_f61, kf61, Fp
key_f62, // key_f62, kf62, Fq
key_f63, // key_f63, kf63, Fr
key_f7, // key_f7, kf7, k7
key_f8, // key_f8, kf8, k8
key_f9, // key_f9, kf9, k9
key_find, // key_find, kfnd, @0
key_help, // key_help, khlp, %1
key_home, // key_home, khome, kh
key_ic, // key_ic, kich1, kI
key_il, // key_il, kil1, kA
key_left, // key_left, kcub1, kl
key_ll, // key_ll, kll, kH
key_mark, // key_mark, kmrk, %2
key_message, // key_message, kmsg, %3
key_move, // key_move, kmov, %4
key_next, // key_next, knxt, %5
key_npage, // key_npage, knp, kN
key_open, // key_open, kopn, %6
key_options, // key_options, kopt, %7
key_ppage, // key_ppage, kpp, kP
key_previous, // key_previous, kprv, %8
key_print, // key_print, kprt, %9
key_redo, // key_redo, krdo, %0
key_reference, // key_reference, kref, &1
key_refresh, // key_refresh, krfr, &2
key_replace, // key_replace, krpl, &3
key_restart, // key_restart, krst, &4
key_resume, // key_resume, kres, &5
key_right, // key_right, kcuf1, kr
key_save, // key_save, ksav, &6
key_sbeg, // key_sbeg, kBEG, &9
key_scancel, // key_scancel, kCAN, &0
key_scommand, // key_scommand, kCMD, *1
key_scopy, // key_scopy, kCPY, *2
key_screate, // key_screate, kCRT, *3
key_sdc, // key_sdc, kDC, *4
key_sdl, // key_sdl, kDL, *5
key_select, // key_select, kslt, *6
key_send, // key_send, kEND, *7
key_seol, // key_seol, kEOL, *8
key_sexit, // key_sexit, kEXT, *9
key_sf, // key_sf, kind, kF
key_sfind, // key_sfind, kFND, *0
key_shelp, // key_shelp, kHLP, #1
key_shome, // key_shome, kHOM, #2
key_sic, // key_sic, kIC, #3
key_sleft, // key_sleft, kLFT, #4
key_smessage, // key_smessage, kMSG, %a
key_smove, // key_smove, kMOV, %b
key_snext, // key_snext, kNXT, %c
key_soptions, // key_soptions, kOPT, %d
key_sprevious, // key_sprevious, kPRV, %e
key_sprint, // key_sprint, kPRT, %f
key_sr, // key_sr, kri, kR
key_sredo, // key_sredo, kRDO, %g
key_sreplace, // key_sreplace, kRPL, %h
key_sright, // key_sright, kRIT, %i
key_srsume, // key_srsume, kRES, %j
key_ssave, // key_ssave, kSAV, !1
key_ssuspend, // key_ssuspend, kSPD, !2
key_stab, // key_stab, khts, kT
key_sundo, // key_sundo, kUND, !3
key_suspend, // key_suspend, kspd, &7
key_undo, // key_undo, kund, &8
key_up, // key_up, kcuu1, ku
keypad_local, // keypad_local, rmkx, ke
keypad_xmit, // keypad_xmit, smkx, ks
lab_f0, // lab_f0, lf0, l0
lab_f1, // lab_f1, lf1, l1
lab_f10, // lab_f10, lf10, la
lab_f2, // lab_f2, lf2, l2
lab_f3, // lab_f3, lf3, l3
lab_f4, // lab_f4, lf4, l4
lab_f5, // lab_f5, lf5, l5
lab_f6, // lab_f6, lf6, l6
lab_f7, // lab_f7, lf7, l7
lab_f8, // lab_f8, lf8, l8
lab_f9, // lab_f9, lf9, l9
label_format, // label_format, fln, Lf
label_off, // label_off, rmln, LF
label_on, // label_on, smln, LO
meta_off, // meta_off, rmm, mo
meta_on, // meta_on, smm, mm
micro_column_address, // micro_column_address, mhpa, ZY
micro_down, // micro_down, mcud1, ZZ
micro_left, // micro_left, mcub1, Za
micro_right, // micro_right, mcuf1, Zb
micro_row_address, // micro_row_address, mvpa, Zc
micro_up, // micro_up, mcuu1, Zd
newline, // newline, nel, nw
order_of_pins, // order_of_pins, porder, Ze
orig_colors, // orig_colors, oc, oc
orig_pair, // orig_pair, op, op
pad_char, // pad_char, pad, pc
parm_dch, // parm_dch, dch, DC
parm_delete_line, // parm_delete_line, dl, DL
parm_down_cursor, // parm_down_cursor, cud, DO
parm_down_micro, // parm_down_micro, mcud, Zf
parm_ich, // parm_ich, ich, IC
parm_index, // parm_index, indn, SF
parm_insert_line, // parm_insert_line, il, AL
parm_left_cursor, // parm_left_cursor, cub, LE
parm_left_micro, // parm_left_micro, mcub, Zg
parm_right_cursor, // parm_right_cursor, cuf, RI
parm_right_micro, // parm_right_micro, mcuf, Zh
parm_rindex, // parm_rindex, rin, SR
parm_up_cursor, // parm_up_cursor, cuu, UP
parm_up_micro, // parm_up_micro, mcuu, Zi
pkey_key, // pkey_key, pfkey, pk
pkey_local, // pkey_local, pfloc, pl
pkey_xmit, // pkey_xmit, pfx, px
plab_norm, // plab_norm, pln, pn
print_screen, // print_screen, mc0, ps
prtr_non, // prtr_non, mc5p, pO
prtr_off, // prtr_off, mc4, pf
prtr_on, // prtr_on, mc5, po
pulse, // pulse, pulse, PU
quick_dial, // quick_dial, qdial, QD
remove_clock, // remove_clock, rmclk, RC
repeat_char, // repeat_char, rep, rp
req_for_input, // req_for_input, rfi, RF
reset_1string, // reset_1string, rs1, r1
reset_2string, // reset_2string, rs2, r2
reset_3string, // reset_3string, rs3, r3
reset_file, // reset_file, rf, rf
restore_cursor, // restore_cursor, rc, rc
row_address, // row_address, vpa, cv
save_cursor, // save_cursor, sc, sc
scroll_forward, // scroll_forward, ind, sf
scroll_reverse, // scroll_reverse, ri, sr
select_char_set, // select_char_set, scs, Zj
set_attributes, // set_attributes, sgr, sa
set_background, // set_background, setb, Sb
set_bottom_margin, // set_bottom_margin, smgb, Zk
set_bottom_margin_parm, // set_bottom_margin_parm, smgbp, Zl
set_clock, // set_clock, sclk, SC
set_color_pair, // set_color_pair, scp, sp
set_foreground, // set_foreground, setf, Sf
set_left_margin, // set_left_margin, smgl, ML
set_left_margin_parm, // set_left_margin_parm, smglp, Zm
set_right_margin, // set_right_margin, smgr, MR
set_right_margin_parm, // set_right_margin_parm, smgrp, Zn
set_tab, // set_tab, hts, st
set_top_margin, // set_top_margin, smgt, Zo
set_top_margin_parm, // set_top_margin_parm, smgtp, Zp
set_window, // set_window, wind, wi
start_bit_image, // start_bit_image, sbim, Zq
start_char_set_def, // start_char_set_def, scsd, Zr
stop_bit_image, // stop_bit_image, rbim, Zs
stop_char_set_def, // stop_char_set_def, rcsd, Zt
subscript_characters, // subscript_characters, subcs, Zu
superscript_characters, // superscript_characters, supcs, Zv
tab, // tab, ht, ta
these_cause_cr, // these_cause_cr, docr, Zw
to_status_line, // to_status_line, tsl, ts
tone, // tone, tone, TO
underline_char, // underline_char, uc, uc
up_half_line, // up_half_line, hu, hu
user0, // user0, u0, u0
user1, // user1, u1, u1
user2, // user2, u2, u2
user3, // user3, u3, u3
user4, // user4, u4, u4
user5, // user5, u5, u5
user6, // user6, u6, u6
user7, // user7, u7, u7
user8, // user8, u8, u8
user9, // user9, u9, u9
wait_tone, // wait_tone, wait, WA
xoff_character, // xoff_character, xoffc, XF
xon_character, // xon_character, xonc, XN
zero_motion, // zero_motion, zerom, Zx
alt_scancode_esc, // alt_scancode_esc, scesa, S8
bit_image_carriage_return, // bit_image_carriage_return, bicr, Yv
bit_image_newline, // bit_image_newline, binel, Zz
bit_image_repeat, // bit_image_repeat, birep, Xy
char_set_names, // char_set_names, csnm, Zy
code_set_init, // code_set_init, csin, ci
color_names, // color_names, colornm, Yw
define_bit_image_region, // define_bit_image_region, defbi, Yx
device_type, // device_type, devt, dv
display_pc_char, // display_pc_char, dispc, S1
end_bit_image_region, // end_bit_image_region, endbi, Yy
enter_pc_charset_mode, // enter_pc_charset_mode, smpch, S2
enter_scancode_mode, // enter_scancode_mode, smsc, S4
exit_pc_charset_mode, // exit_pc_charset_mode, rmpch, S3
exit_scancode_mode, // exit_scancode_mode, rmsc, S5
get_mouse, // get_mouse, getm, Gm
key_mouse, // key_mouse, kmous, Km
mouse_info, // mouse_info, minfo, Mi
pc_term_options, // pc_term_options, pctrm, S6
pkey_plab, // pkey_plab, pfxl, xl
req_mouse_pos, // req_mouse_pos, reqmp, RQ
scancode_escape, // scancode_escape, scesc, S7
set0_des_seq, // set0_des_seq, s0ds, s0
set1_des_seq, // set1_des_seq, s1ds, s1
set2_des_seq, // set2_des_seq, s2ds, s2
set3_des_seq, // set3_des_seq, s3ds, s3
set_a_background, // set_a_background, setab, AB
set_a_foreground, // set_a_foreground, setaf, AF
set_color_band, // set_color_band, setcolor, Yz
set_lr_margin, // set_lr_margin, smglr, ML
set_page_length, // set_page_length, slines, YZ
set_tb_margin, // set_tb_margin, smgtb, MT
enter_horizontal_hl_mode, // enter_horizontal_hl_mode, ehhlm, Xh
enter_left_hl_mode, // enter_left_hl_mode, elhlm, Xl
enter_low_hl_mode, // enter_low_hl_mode, elohlm, Xo
enter_right_hl_mode, // enter_right_hl_mode, erhlm, Xr
enter_top_hl_mode, // enter_top_hl_mode, ethlm, Xt
enter_vertical_hl_mode, // enter_vertical_hl_mode, evhlm, Xv
set_a_attributes, // set_a_attributes, sgr1, sA
set_pglen_inch, // set_pglen_inch, slength, sL)
;
public String[] getNames() {
return getCapabilitiesByName().entrySet().stream()
.filter(e -> e.getValue() == this)
.map(Map.Entry::getValue)
.toArray(String[]::new);
}
public static Capability byName(String name) {
return getCapabilitiesByName().get(name);
}
}
public static Map<String, Capability> getCapabilitiesByName() {
Map<String, Capability> capabilities = new LinkedHashMap<>();
try (InputStream is = InfoCmp.class.getResourceAsStream("capabilities.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
br.lines().map(String::trim)
.filter(s -> !s.startsWith("#"))
.filter(s -> !s.isEmpty())
.forEach(s -> {
String[] names = s.split(", ");
Capability cap = Enum.valueOf(Capability.class, names[0]);
capabilities.put(names[0], cap);
capabilities.put(names[1], cap);
});
return capabilities;
} catch (IOException e) {
throw new IOError(e);
}
}
public static void setDefaultInfoCmp(String terminal, String caps) {
CAPS.putIfAbsent(terminal, caps);
}
public static void setDefaultInfoCmp(String terminal, Supplier<String> caps) {
CAPS.putIfAbsent(terminal, caps);
}
public static String getInfoCmp(
String terminal
) throws IOException, InterruptedException {
String caps = getLoadedInfoCmp(terminal);
if (caps == null) {
Process p = new ProcessBuilder(OSUtils.INFOCMP_COMMAND, terminal).start();
caps = ExecHelper.waitAndCapture(p);
CAPS.put(terminal, caps);
}
return caps;
}
public static String getLoadedInfoCmp(String terminal) {
Object caps = CAPS.get(terminal);
if (caps instanceof Supplier) {
caps = ((Supplier) caps).get();
}
return (String) caps;
}
public static void parseInfoCmp(
String capabilities,
Set<Capability> bools,
Map<Capability, Integer> ints,
Map<Capability, String> strings
) {
Map<String, Capability> capsByName = getCapabilitiesByName();
String[] lines = capabilities.split("\n");
for (int i = 1; i < lines.length; i++) {
Matcher m = Pattern.compile("\\s*(([^,]|\\\\,)+)\\s*[,$]").matcher(lines[i]);
while (m.find()) {
String cap = m.group(1);
if (cap.contains("#")) {
int index = cap.indexOf('#');
String key = cap.substring(0, index);
String val = cap.substring(index + 1);
int iVal;
if (val.startsWith("0x")) {
iVal = Integer.parseInt(val.substring(2), 16);
} else {
iVal = Integer.parseInt(val);
}
Capability c = capsByName.get(key);
if (c != null) {
ints.put(c, iVal);
}
} else if (cap.contains("=")) {
int index = cap.indexOf('=');
String key = cap.substring(0, index);
String val = cap.substring(index + 1);
Capability c = capsByName.get(key);
if (c != null) {
strings.put(c, val);
}
} else {
Capability c = capsByName.get(cap);
if (c != null) {
bools.add(c);
}
}
}
}
}
static String loadDefaultInfoCmp(String name) {
try (InputStream is = InfoCmp.class.getResourceAsStream(name + ".caps");
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
return br.lines().collect(Collectors.joining("\n", "", "\n"));
} catch (IOException e) {
throw new IOError(e);
}
}
static {
for (String s : Arrays.asList("dumb", "ansi", "xterm", "xterm-256color",
"windows", "windows-256color", "windows-vtp",
"screen", "screen-256color")) {
setDefaultInfoCmp(s, () -> loadDefaultInfoCmp(s));
}
}
}