Refactoring FTerm::init_termcaps

This commit is contained in:
Markus Gans 2018-02-19 01:36:38 +01:00
parent 4322e957c9
commit 9426657c43
4 changed files with 73 additions and 62 deletions

View File

@ -1,3 +1,6 @@
2017-02-19 Markus Gans <guru.mail@muenster.de>
* Refactoring FTerm::init_termcaps
2017-02-18 Markus Gans <guru.mail@muenster.de>
* Avoid scroll bar overshooting
* Refactoring FListView::onMouseMove

View File

@ -31,7 +31,7 @@
static FVTerm* terminal;
// Function prototype
void tcapBooleans (const std::string&, bool);
void tcapBoolean (const std::string&, bool);
void tcapNumeric (const std::string&, int);
void tcapString (const std::string&, const char[]);
void debug (FApplication&);
@ -142,7 +142,7 @@ const int last_item = int ( sizeof(strings) / sizeof(strings[0]) ) - 1;
//----------------------------------------------------------------------
// Functions
//----------------------------------------------------------------------
void tcapBooleans (const std::string& name, bool cap_bool)
void tcapBoolean (const std::string& name, bool cap_bool)
{
std::cout << "FTermcap::" << name << ": ";
@ -232,19 +232,19 @@ void debug (FApplication& TermApp)
void booleans()
{
std::cout << "\r\n[Booleans]\r\n";
tcapBooleans ( "background_color_erase"
tcapBoolean ( "background_color_erase"
, FTermcap::background_color_erase );
tcapBooleans ( "automatic_left_margin"
tcapBoolean ( "automatic_left_margin"
, FTermcap::automatic_left_margin );
tcapBooleans ( "automatic_right_margin"
tcapBoolean ( "automatic_right_margin"
, FTermcap::automatic_right_margin );
tcapBooleans ( "eat_nl_glitch"
tcapBoolean ( "eat_nl_glitch"
, FTermcap::eat_nl_glitch );
tcapBooleans ( "ansi_default_color"
tcapBoolean ( "ansi_default_color"
, FTermcap::ansi_default_color );
tcapBooleans ( "osc_support"
tcapBoolean ( "osc_support"
, FTermcap::osc_support );
tcapBooleans ( "no_utf8_acs_chars"
tcapBoolean ( "no_utf8_acs_chars"
, FTermcap::no_utf8_acs_chars );
}

View File

@ -495,8 +495,10 @@ class FTerm
static void init_cygwin_charmap();
static void init_teraterm_charmap();
static void init_termcaps();
static void init_termcaps_error (int);
static void init_termcaps_variables(char*&);
static void init_termcaps_booleans();
static void init_termcaps_numeric();
static void init_termcaps_numerics();
static void init_termcaps_strings (char*&);
static void init_termcaps_quirks();
#if defined(__FreeBSD__) || defined(__DragonFly__)

View File

@ -3366,8 +3366,6 @@ void FTerm::init_teraterm_charmap()
}
//----------------------------------------------------------------------
void FTerm::init_termcaps()
{
/* Terminal capability data base
* -----------------------------
* Info under: man 5 terminfo
@ -3376,11 +3374,12 @@ void FTerm::init_termcaps()
* captoinfo - convert all termcap descriptions into terminfo descriptions
* infocmp - print out terminfo description from the current terminal
*/
static const int
success = 1
, no_entry = 0
, db_not_found = -1
, uninitialized = -2;
void FTerm::init_termcaps()
{
std::vector<std::string> terminals;
std::vector<std::string>::iterator iter;
static const int success = 1;
static const int uninitialized = -2;
static char term_buffer[2048];
static char string_buf[2048];
char* buffer = string_buf;
@ -3389,43 +3388,46 @@ void FTerm::init_termcaps()
// share the terminal capabilities
FTermcap().setTermcapMap(tcap);
if ( termtype[0] )
// open termcap file
terminals.push_back(termtype); // available terminal type
if ( color256 ) // 1st fallback if not found
terminals.push_back("xterm-256color");
terminals.push_back("xterm"); // 2nd fallback if not found
terminals.push_back("ansi"); // 3rd fallback if not found
terminals.push_back("vt100"); // 4th fallback if not found
iter = terminals.begin();
while ( iter != terminals.end() )
{
// open the termcap file + load entry for termtype
// Copy c-string + terminating null-character ('\0')
std::strncpy (termtype, (*iter).c_str(), (*iter).length() + 1);
// Open the termcap file + load entry for termtype
status = tgetent(term_buffer, termtype);
if ( status == success || ! terminal_detection )
break;
++iter;
}
if ( status != success && color256 )
{
// use "xterm-256color" as fallback if not found
std::strncpy (termtype, C_STR("xterm-256color"), 15);
status = tgetent(term_buffer, termtype);
}
if ( status != success )
{
// use "xterm" as fallback if not found
std::strncpy (termtype, C_STR("xterm"), 6);
status = tgetent(term_buffer, termtype);
if ( status != success )
{
// use "ansi" as fallback if not found
std::strncpy (termtype, C_STR("ansi"), 5);
status = tgetent(term_buffer, termtype);
if ( std::strncmp(termtype, "ansi", 4) == 0 )
ansi_terminal = true;
if ( status != success )
{
// use "vt100" as fallback if not found
std::strncpy (termtype, C_STR("vt100"), 6);
status = tgetent(term_buffer, termtype);
ansi_terminal = false;
}
}
init_termcaps_error (status);
init_termcaps_variables (buffer);
}
if ( status == no_entry )
//----------------------------------------------------------------------
void FTerm::init_termcaps_error (int status)
{
static const int no_entry = 0;
static const int db_not_found = -1;
static const int uninitialized = -2;
if ( status == no_entry || status == uninitialized )
{
std::cerr << "Unknown terminal: " << termtype << "\n"
<< "Check the TERM environment variable\n"
@ -3438,12 +3440,16 @@ void FTerm::init_termcaps()
std::cerr << "The termcap/terminfo database could not be found.\n";
std::abort();
}
}
//----------------------------------------------------------------------
void FTerm::init_termcaps_variables (char*& buffer)
{
// Get termcap booleans
init_termcaps_booleans();
// Get termcap numeric
init_termcaps_numeric();
// Get termcap numerics
init_termcaps_numerics();
// Get termcap strings
init_termcaps_strings(buffer);
@ -3490,7 +3496,7 @@ void FTerm::init_termcaps_booleans()
}
//----------------------------------------------------------------------
void FTerm::init_termcaps_numeric()
void FTerm::init_termcaps_numerics()
{
// Get termcap numeric