0
0
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:
John Marriott
2025-05-07 19:59:42 +02:00
committed by Christian Brabandt
parent 38972d8b1a
commit d2fcbb465d
2 changed files with 41 additions and 22 deletions

View File

@@ -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"

View File

@@ -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,
/**/ /**/