forked from aniani/vim
patch 8.0.1807: function to set terminal name is too long
Problem: Function to set terminal name is too long. Solution: Refactor the function. Fix typo in test.
This commit is contained in:
285
src/term.c
285
src/term.c
@@ -1544,6 +1544,150 @@ static char *(key_names[]) =
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_term_entries(int *height, int *width)
|
||||||
|
{
|
||||||
|
static struct {
|
||||||
|
enum SpecialKey dest; /* index in term_strings[] */
|
||||||
|
char *name; /* termcap name for string */
|
||||||
|
} string_names[] =
|
||||||
|
{ {KS_CE, "ce"}, {KS_AL, "al"}, {KS_CAL,"AL"},
|
||||||
|
{KS_DL, "dl"}, {KS_CDL,"DL"}, {KS_CS, "cs"},
|
||||||
|
{KS_CL, "cl"}, {KS_CD, "cd"},
|
||||||
|
{KS_VI, "vi"}, {KS_VE, "ve"}, {KS_MB, "mb"},
|
||||||
|
{KS_ME, "me"}, {KS_MR, "mr"},
|
||||||
|
{KS_MD, "md"}, {KS_SE, "se"}, {KS_SO, "so"},
|
||||||
|
{KS_CZH,"ZH"}, {KS_CZR,"ZR"}, {KS_UE, "ue"},
|
||||||
|
{KS_US, "us"}, {KS_UCE, "Ce"}, {KS_UCS, "Cs"},
|
||||||
|
{KS_STE,"Te"}, {KS_STS,"Ts"},
|
||||||
|
{KS_CM, "cm"}, {KS_SR, "sr"},
|
||||||
|
{KS_CRI,"RI"}, {KS_VB, "vb"}, {KS_KS, "ks"},
|
||||||
|
{KS_KE, "ke"}, {KS_TI, "ti"}, {KS_TE, "te"},
|
||||||
|
{KS_BC, "bc"}, {KS_CSB,"Sb"}, {KS_CSF,"Sf"},
|
||||||
|
{KS_CAB,"AB"}, {KS_CAF,"AF"}, {KS_LE, "le"},
|
||||||
|
{KS_ND, "nd"}, {KS_OP, "op"}, {KS_CRV, "RV"},
|
||||||
|
{KS_VS, "vs"}, {KS_CVS, "VS"},
|
||||||
|
{KS_CIS, "IS"}, {KS_CIE, "IE"},
|
||||||
|
{KS_CSC, "SC"}, {KS_CEC, "EC"},
|
||||||
|
{KS_TS, "ts"}, {KS_FS, "fs"},
|
||||||
|
{KS_CWP, "WP"}, {KS_CWS, "WS"},
|
||||||
|
{KS_CSI, "SI"}, {KS_CEI, "EI"},
|
||||||
|
{KS_U7, "u7"}, {KS_RFG, "RF"}, {KS_RBG, "RB"},
|
||||||
|
{KS_8F, "8f"}, {KS_8B, "8b"},
|
||||||
|
{KS_CBE, "BE"}, {KS_CBD, "BD"},
|
||||||
|
{KS_CPS, "PS"}, {KS_CPE, "PE"},
|
||||||
|
{(enum SpecialKey)0, NULL}
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
char_u *p;
|
||||||
|
static char_u tstrbuf[TBUFSZ];
|
||||||
|
char_u *tp = tstrbuf;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* get output strings
|
||||||
|
*/
|
||||||
|
for (i = 0; string_names[i].name != NULL; ++i)
|
||||||
|
{
|
||||||
|
if (TERM_STR(string_names[i].dest) == NULL
|
||||||
|
|| TERM_STR(string_names[i].dest) == empty_option)
|
||||||
|
TERM_STR(string_names[i].dest) = TGETSTR(string_names[i].name, &tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* tgetflag() returns 1 if the flag is present, 0 if not and
|
||||||
|
* possibly -1 if the flag doesn't exist. */
|
||||||
|
if ((T_MS == NULL || T_MS == empty_option) && tgetflag("ms") > 0)
|
||||||
|
T_MS = (char_u *)"y";
|
||||||
|
if ((T_XS == NULL || T_XS == empty_option) && tgetflag("xs") > 0)
|
||||||
|
T_XS = (char_u *)"y";
|
||||||
|
if ((T_XN == NULL || T_XN == empty_option) && tgetflag("xn") > 0)
|
||||||
|
T_XN = (char_u *)"y";
|
||||||
|
if ((T_DB == NULL || T_DB == empty_option) && tgetflag("db") > 0)
|
||||||
|
T_DB = (char_u *)"y";
|
||||||
|
if ((T_DA == NULL || T_DA == empty_option) && tgetflag("da") > 0)
|
||||||
|
T_DA = (char_u *)"y";
|
||||||
|
if ((T_UT == NULL || T_UT == empty_option) && tgetflag("ut") > 0)
|
||||||
|
T_UT = (char_u *)"y";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* get key codes
|
||||||
|
*/
|
||||||
|
for (i = 0; key_names[i] != NULL; ++i)
|
||||||
|
if (find_termcode((char_u *)key_names[i]) == NULL)
|
||||||
|
{
|
||||||
|
p = TGETSTR(key_names[i], &tp);
|
||||||
|
/* if cursor-left == backspace, ignore it (televideo 925) */
|
||||||
|
if (p != NULL
|
||||||
|
&& (*p != Ctrl_H
|
||||||
|
|| key_names[i][0] != 'k'
|
||||||
|
|| key_names[i][1] != 'l'))
|
||||||
|
add_termcode((char_u *)key_names[i], p, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*height == 0)
|
||||||
|
*height = tgetnum("li");
|
||||||
|
if (*width == 0)
|
||||||
|
*width = tgetnum("co");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get number of colors (if not done already).
|
||||||
|
*/
|
||||||
|
if (TERM_STR(KS_CCO) == NULL || TERM_STR(KS_CCO) == empty_option)
|
||||||
|
set_color_count(tgetnum("Co"));
|
||||||
|
|
||||||
|
# ifndef hpux
|
||||||
|
BC = (char *)TGETSTR("bc", &tp);
|
||||||
|
UP = (char *)TGETSTR("up", &tp);
|
||||||
|
p = TGETSTR("pc", &tp);
|
||||||
|
if (p)
|
||||||
|
PC = *p;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
report_term_error(char_u *error_msg, char_u *term)
|
||||||
|
{
|
||||||
|
struct builtin_term *termp;
|
||||||
|
|
||||||
|
mch_errmsg("\r\n");
|
||||||
|
if (error_msg != NULL)
|
||||||
|
{
|
||||||
|
mch_errmsg((char *)error_msg);
|
||||||
|
mch_errmsg("\r\n");
|
||||||
|
}
|
||||||
|
mch_errmsg("'");
|
||||||
|
mch_errmsg((char *)term);
|
||||||
|
mch_errmsg(_("' not known. Available builtin terminals are:"));
|
||||||
|
mch_errmsg("\r\n");
|
||||||
|
for (termp = &(builtin_termcaps[0]); termp->bt_string != NULL; ++termp)
|
||||||
|
{
|
||||||
|
if (termp->bt_entry == (int)KS_NAME)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_TGETENT
|
||||||
|
mch_errmsg(" builtin_");
|
||||||
|
#else
|
||||||
|
mch_errmsg(" ");
|
||||||
|
#endif
|
||||||
|
mch_errmsg(termp->bt_string);
|
||||||
|
mch_errmsg("\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
report_default_term(char_u *term)
|
||||||
|
{
|
||||||
|
mch_errmsg(_("defaulting to '"));
|
||||||
|
mch_errmsg((char *)term);
|
||||||
|
mch_errmsg("'\r\n");
|
||||||
|
if (emsg_silent == 0)
|
||||||
|
{
|
||||||
|
screen_start(); /* don't know where cursor is now */
|
||||||
|
out_flush();
|
||||||
|
if (!is_not_a_term())
|
||||||
|
ui_delay(2000L, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set terminal options for terminal "term".
|
* Set terminal options for terminal "term".
|
||||||
* Return OK if terminal 'term' was found in a termcap, FAIL otherwise.
|
* Return OK if terminal 'term' was found in a termcap, FAIL otherwise.
|
||||||
@@ -1595,42 +1739,7 @@ set_termname(char_u *term)
|
|||||||
*/
|
*/
|
||||||
if (try == 1)
|
if (try == 1)
|
||||||
{
|
{
|
||||||
char_u *p;
|
|
||||||
static char_u tstrbuf[TBUFSZ];
|
|
||||||
int i;
|
|
||||||
char_u tbuf[TBUFSZ];
|
char_u tbuf[TBUFSZ];
|
||||||
char_u *tp;
|
|
||||||
static struct {
|
|
||||||
enum SpecialKey dest; /* index in term_strings[] */
|
|
||||||
char *name; /* termcap name for string */
|
|
||||||
} string_names[] =
|
|
||||||
{ {KS_CE, "ce"}, {KS_AL, "al"}, {KS_CAL,"AL"},
|
|
||||||
{KS_DL, "dl"}, {KS_CDL,"DL"}, {KS_CS, "cs"},
|
|
||||||
{KS_CL, "cl"}, {KS_CD, "cd"},
|
|
||||||
{KS_VI, "vi"}, {KS_VE, "ve"}, {KS_MB, "mb"},
|
|
||||||
{KS_ME, "me"}, {KS_MR, "mr"},
|
|
||||||
{KS_MD, "md"}, {KS_SE, "se"}, {KS_SO, "so"},
|
|
||||||
{KS_CZH,"ZH"}, {KS_CZR,"ZR"}, {KS_UE, "ue"},
|
|
||||||
{KS_US, "us"}, {KS_UCE, "Ce"}, {KS_UCS, "Cs"},
|
|
||||||
{KS_STE,"Te"}, {KS_STS,"Ts"},
|
|
||||||
{KS_CM, "cm"}, {KS_SR, "sr"},
|
|
||||||
{KS_CRI,"RI"}, {KS_VB, "vb"}, {KS_KS, "ks"},
|
|
||||||
{KS_KE, "ke"}, {KS_TI, "ti"}, {KS_TE, "te"},
|
|
||||||
{KS_BC, "bc"}, {KS_CSB,"Sb"}, {KS_CSF,"Sf"},
|
|
||||||
{KS_CAB,"AB"}, {KS_CAF,"AF"}, {KS_LE, "le"},
|
|
||||||
{KS_ND, "nd"}, {KS_OP, "op"}, {KS_CRV, "RV"},
|
|
||||||
{KS_VS, "vs"}, {KS_CVS, "VS"},
|
|
||||||
{KS_CIS, "IS"}, {KS_CIE, "IE"},
|
|
||||||
{KS_CSC, "SC"}, {KS_CEC, "EC"},
|
|
||||||
{KS_TS, "ts"}, {KS_FS, "fs"},
|
|
||||||
{KS_CWP, "WP"}, {KS_CWS, "WS"},
|
|
||||||
{KS_CSI, "SI"}, {KS_CEI, "EI"},
|
|
||||||
{KS_U7, "u7"}, {KS_RFG, "RF"}, {KS_RBG, "RB"},
|
|
||||||
{KS_8F, "8f"}, {KS_8B, "8b"},
|
|
||||||
{KS_CBE, "BE"}, {KS_CBD, "BD"},
|
|
||||||
{KS_CPS, "PS"}, {KS_CPE, "PE"},
|
|
||||||
{(enum SpecialKey)0, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the external termcap does not have a matching entry, try the
|
* If the external termcap does not have a matching entry, try the
|
||||||
@@ -1638,81 +1747,13 @@ set_termname(char_u *term)
|
|||||||
*/
|
*/
|
||||||
if ((error_msg = tgetent_error(tbuf, term)) == NULL)
|
if ((error_msg = tgetent_error(tbuf, term)) == NULL)
|
||||||
{
|
{
|
||||||
tp = tstrbuf;
|
|
||||||
if (!termcap_cleared)
|
if (!termcap_cleared)
|
||||||
{
|
{
|
||||||
clear_termoptions(); /* clear old options */
|
clear_termoptions(); /* clear old options */
|
||||||
termcap_cleared = TRUE;
|
termcap_cleared = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get output strings */
|
get_term_entries(&height, &width);
|
||||||
for (i = 0; string_names[i].name != NULL; ++i)
|
|
||||||
{
|
|
||||||
if (TERM_STR(string_names[i].dest) == NULL
|
|
||||||
|| TERM_STR(string_names[i].dest) == empty_option)
|
|
||||||
TERM_STR(string_names[i].dest) =
|
|
||||||
TGETSTR(string_names[i].name, &tp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* tgetflag() returns 1 if the flag is present, 0 if not and
|
|
||||||
* possibly -1 if the flag doesn't exist. */
|
|
||||||
if ((T_MS == NULL || T_MS == empty_option)
|
|
||||||
&& tgetflag("ms") > 0)
|
|
||||||
T_MS = (char_u *)"y";
|
|
||||||
if ((T_XS == NULL || T_XS == empty_option)
|
|
||||||
&& tgetflag("xs") > 0)
|
|
||||||
T_XS = (char_u *)"y";
|
|
||||||
if ((T_XN == NULL || T_XN == empty_option)
|
|
||||||
&& tgetflag("xn") > 0)
|
|
||||||
T_XN = (char_u *)"y";
|
|
||||||
if ((T_DB == NULL || T_DB == empty_option)
|
|
||||||
&& tgetflag("db") > 0)
|
|
||||||
T_DB = (char_u *)"y";
|
|
||||||
if ((T_DA == NULL || T_DA == empty_option)
|
|
||||||
&& tgetflag("da") > 0)
|
|
||||||
T_DA = (char_u *)"y";
|
|
||||||
if ((T_UT == NULL || T_UT == empty_option)
|
|
||||||
&& tgetflag("ut") > 0)
|
|
||||||
T_UT = (char_u *)"y";
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* get key codes
|
|
||||||
*/
|
|
||||||
for (i = 0; key_names[i] != NULL; ++i)
|
|
||||||
{
|
|
||||||
if (find_termcode((char_u *)key_names[i]) == NULL)
|
|
||||||
{
|
|
||||||
p = TGETSTR(key_names[i], &tp);
|
|
||||||
/* if cursor-left == backspace, ignore it (televideo
|
|
||||||
* 925) */
|
|
||||||
if (p != NULL
|
|
||||||
&& (*p != Ctrl_H
|
|
||||||
|| key_names[i][0] != 'k'
|
|
||||||
|| key_names[i][1] != 'l'))
|
|
||||||
add_termcode((char_u *)key_names[i], p, FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (height == 0)
|
|
||||||
height = tgetnum("li");
|
|
||||||
if (width == 0)
|
|
||||||
width = tgetnum("co");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get number of colors (if not done already).
|
|
||||||
*/
|
|
||||||
if (TERM_STR(KS_CCO) == NULL
|
|
||||||
|| TERM_STR(KS_CCO) == empty_option)
|
|
||||||
set_color_count(tgetnum("Co"));
|
|
||||||
|
|
||||||
# ifndef hpux
|
|
||||||
BC = (char *)TGETSTR("bc", &tp);
|
|
||||||
UP = (char *)TGETSTR("up", &tp);
|
|
||||||
p = TGETSTR("pc", &tp);
|
|
||||||
if (p)
|
|
||||||
PC = *p;
|
|
||||||
# endif /* hpux */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* try == 0 || try == 2 */
|
else /* try == 0 || try == 2 */
|
||||||
@@ -1748,31 +1789,8 @@ set_termname(char_u *term)
|
|||||||
if (termcap_cleared) /* found in external termcap */
|
if (termcap_cleared) /* found in external termcap */
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
report_term_error(error_msg, term);
|
||||||
|
|
||||||
mch_errmsg("\r\n");
|
|
||||||
if (error_msg != NULL)
|
|
||||||
{
|
|
||||||
mch_errmsg((char *)error_msg);
|
|
||||||
mch_errmsg("\r\n");
|
|
||||||
}
|
|
||||||
mch_errmsg("'");
|
|
||||||
mch_errmsg((char *)term);
|
|
||||||
mch_errmsg(_("' not known. Available builtin terminals are:"));
|
|
||||||
mch_errmsg("\r\n");
|
|
||||||
for (termp = &(builtin_termcaps[0]); termp->bt_string != NULL;
|
|
||||||
++termp)
|
|
||||||
{
|
|
||||||
if (termp->bt_entry == (int)KS_NAME)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_TGETENT
|
|
||||||
mch_errmsg(" builtin_");
|
|
||||||
#else
|
|
||||||
mch_errmsg(" ");
|
|
||||||
#endif
|
|
||||||
mch_errmsg(termp->bt_string);
|
|
||||||
mch_errmsg("\r\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* when user typed :set term=xxx, quit here */
|
/* when user typed :set term=xxx, quit here */
|
||||||
if (starting != NO_SCREEN)
|
if (starting != NO_SCREEN)
|
||||||
{
|
{
|
||||||
@@ -1781,16 +1799,7 @@ set_termname(char_u *term)
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
term = DEFAULT_TERM;
|
term = DEFAULT_TERM;
|
||||||
mch_errmsg(_("defaulting to '"));
|
report_default_term(term);
|
||||||
mch_errmsg((char *)term);
|
|
||||||
mch_errmsg("'\r\n");
|
|
||||||
if (emsg_silent == 0)
|
|
||||||
{
|
|
||||||
screen_start(); /* don't know where cursor is now */
|
|
||||||
out_flush();
|
|
||||||
if (!is_not_a_term())
|
|
||||||
ui_delay(2000L, TRUE);
|
|
||||||
}
|
|
||||||
set_string_option_direct((char_u *)"term", -1, term,
|
set_string_option_direct((char_u *)"term", -1, term,
|
||||||
OPT_FREE, 0);
|
OPT_FREE, 0);
|
||||||
display_errors();
|
display_errors();
|
||||||
|
@@ -284,7 +284,7 @@ func Test_set_ttytype()
|
|||||||
" in travis on some builds. Why? Catch both for now
|
" in travis on some builds. Why? Catch both for now
|
||||||
try
|
try
|
||||||
set ttytype=
|
set ttytype=
|
||||||
call assert_report('set ttype= did not fail')
|
call assert_report('set ttytype= did not fail')
|
||||||
catch /E529\|E522/
|
catch /E529\|E522/
|
||||||
endtry
|
endtry
|
||||||
|
|
||||||
@@ -292,7 +292,7 @@ func Test_set_ttytype()
|
|||||||
" check for failure of finding the entry and for missing 'cm' entry.
|
" check for failure of finding the entry and for missing 'cm' entry.
|
||||||
try
|
try
|
||||||
set ttytype=xxx
|
set ttytype=xxx
|
||||||
call assert_report('set ttype=xxx did not fail')
|
call assert_report('set ttytype=xxx did not fail')
|
||||||
catch /E522\|E437/
|
catch /E522\|E437/
|
||||||
endtry
|
endtry
|
||||||
|
|
||||||
|
@@ -761,6 +761,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1807,
|
||||||
/**/
|
/**/
|
||||||
1806,
|
1806,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user