mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 9.1.1367: too many strlen() calls in gui.c
Problem: too many strlen() calls in gui.c Solution: refactor gui.c slightly (John Marriott) This does the following changes: - use macro STRCMP() instead of strcmp(). - refactor gui_outstr_nowrap() to remove call to STRLEN(). - refactor get_tabline_label() in attempt to simply it. At the same time use standard looping construct for iterating over windows in a tab. Move variables closer to where they are used. Add check that we don't exceed size of NameBuff. - small optimisation in get_find_dialog_text() to measure the string length once. closes: #17269 Signed-off-by: John Marriott <basilisk@internode.on.net> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
38972d8b1a
commit
d2fcbb465d
61
src/gui.c
61
src/gui.c
@@ -357,7 +357,7 @@ gui_read_child_pipe(int fd)
|
|||||||
if (bytes_read < 0)
|
if (bytes_read < 0)
|
||||||
return GUI_CHILD_IO_ERROR;
|
return GUI_CHILD_IO_ERROR;
|
||||||
buffer[bytes_read] = NUL;
|
buffer[bytes_read] = NUL;
|
||||||
if (strcmp(buffer, "ok") == 0)
|
if (STRCMP(buffer, "ok") == 0)
|
||||||
return GUI_CHILD_OK;
|
return GUI_CHILD_OK;
|
||||||
return GUI_CHILD_FAILED;
|
return GUI_CHILD_FAILED;
|
||||||
}
|
}
|
||||||
@@ -2330,6 +2330,8 @@ gui_outstr_nowrap(
|
|||||||
# endif
|
# endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
size_t slen = 2; // 2 spaces by default
|
||||||
|
|
||||||
# ifdef FEAT_NETBEANS_INTG
|
# ifdef FEAT_NETBEANS_INTG
|
||||||
if (*s == MULTISIGN_BYTE)
|
if (*s == MULTISIGN_BYTE)
|
||||||
multi_sign = TRUE;
|
multi_sign = TRUE;
|
||||||
@@ -2338,14 +2340,16 @@ gui_outstr_nowrap(
|
|||||||
if (*curwin->w_p_scl == 'n' && *(curwin->w_p_scl + 1) == 'u' &&
|
if (*curwin->w_p_scl == 'n' && *(curwin->w_p_scl + 1) == 'u' &&
|
||||||
(curwin->w_p_nu || curwin->w_p_rnu))
|
(curwin->w_p_nu || curwin->w_p_rnu))
|
||||||
{
|
{
|
||||||
sprintf((char *)extra, "%*c ", number_width(curwin), ' ');
|
int n = number_width(curwin);
|
||||||
s = extra;
|
|
||||||
|
slen = MIN(n, (int)sizeof(extra) - 1);
|
||||||
}
|
}
|
||||||
else
|
vim_memset(extra, ' ', slen);
|
||||||
s = (char_u *)" ";
|
extra[slen] = NUL;
|
||||||
|
s = extra;
|
||||||
if (len == 1 && col > 0)
|
if (len == 1 && col > 0)
|
||||||
--col;
|
--col;
|
||||||
len = (int)STRLEN(s);
|
len = (int)slen;
|
||||||
if (len > 2)
|
if (len > 2)
|
||||||
// right align sign icon in the number column
|
// right align sign icon in the number column
|
||||||
signcol = col + len - 3;
|
signcol = col + len - 3;
|
||||||
@@ -3756,10 +3760,6 @@ get_tabline_label(
|
|||||||
tabpage_T *tp,
|
tabpage_T *tp,
|
||||||
int tooltip) // TRUE: get tooltip
|
int tooltip) // TRUE: get tooltip
|
||||||
{
|
{
|
||||||
int modified = FALSE;
|
|
||||||
char_u buf[40];
|
|
||||||
int wincount;
|
|
||||||
win_T *wp;
|
|
||||||
char_u **opt;
|
char_u **opt;
|
||||||
|
|
||||||
// Use 'guitablabel' or 'guitabtooltip' if it's set.
|
// Use 'guitablabel' or 'guitabtooltip' if it's set.
|
||||||
@@ -3805,26 +3805,42 @@ get_tabline_label(
|
|||||||
// use a default label.
|
// use a default label.
|
||||||
if (**opt == NUL || *NameBuff == NUL)
|
if (**opt == NUL || *NameBuff == NUL)
|
||||||
{
|
{
|
||||||
|
win_T *wp;
|
||||||
|
int wincount = 0;
|
||||||
|
int modified = FALSE;
|
||||||
|
|
||||||
// Get the buffer name into NameBuff[] and shorten it.
|
// Get the buffer name into NameBuff[] and shorten it.
|
||||||
get_trans_bufname(tp == curtab ? curbuf : tp->tp_curwin->w_buffer);
|
get_trans_bufname(tp == curtab ? curbuf : tp->tp_curwin->w_buffer);
|
||||||
if (!tooltip)
|
if (!tooltip)
|
||||||
shorten_dir(NameBuff);
|
shorten_dir(NameBuff);
|
||||||
|
|
||||||
wp = (tp == curtab) ? firstwin : tp->tp_firstwin;
|
FOR_ALL_WINDOWS_IN_TAB(tp, wp)
|
||||||
for (wincount = 0; wp != NULL; wp = wp->w_next, ++wincount)
|
{
|
||||||
|
++wincount;
|
||||||
if (bufIsChanged(wp->w_buffer))
|
if (bufIsChanged(wp->w_buffer))
|
||||||
modified = TRUE;
|
modified = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if (modified || wincount > 1)
|
if (modified || wincount > 1)
|
||||||
{
|
{
|
||||||
|
char_u buf[40] = "+ "; // Tentatively assume modified only
|
||||||
|
size_t buflen = 2;
|
||||||
|
size_t NameBufflen = STRLEN(NameBuff);
|
||||||
|
|
||||||
if (wincount > 1)
|
if (wincount > 1)
|
||||||
vim_snprintf((char *)buf, sizeof(buf), "%d", wincount);
|
buflen = vim_snprintf_safelen(
|
||||||
else
|
(char *)buf,
|
||||||
buf[0] = NUL;
|
sizeof(buf),
|
||||||
if (modified)
|
"%d%s ",
|
||||||
STRCAT(buf, "+");
|
wincount,
|
||||||
STRCAT(buf, " ");
|
modified ? "+" : "");
|
||||||
STRMOVE(NameBuff + STRLEN(buf), NameBuff);
|
|
||||||
mch_memmove(NameBuff, buf, STRLEN(buf));
|
// Make sure resulting NameBuff will not exceed it's bounds.
|
||||||
|
if (NameBufflen + buflen < MAXPATHL)
|
||||||
|
{
|
||||||
|
mch_memmove(NameBuff + buflen, NameBuff, NameBufflen + 1); // +1 for NUL
|
||||||
|
mch_memmove(NameBuff, buf, buflen);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5158,10 +5174,11 @@ get_find_dialog_text(
|
|||||||
text = arg;
|
text = arg;
|
||||||
if (text != NULL)
|
if (text != NULL)
|
||||||
{
|
{
|
||||||
text = vim_strsave(text);
|
int len = (int)STRLEN(text);
|
||||||
|
|
||||||
|
text = vim_strnsave(text, len);
|
||||||
if (text != NULL)
|
if (text != NULL)
|
||||||
{
|
{
|
||||||
int len = (int)STRLEN(text);
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// Remove "\V"
|
// Remove "\V"
|
||||||
|
@@ -704,6 +704,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 */
|
||||||
|
/**/
|
||||||
|
1367,
|
||||||
/**/
|
/**/
|
||||||
1366,
|
1366,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user