1
0
forked from aniani/vim

updated for version 7.3.407

Problem:    ":12verbose call F()" may duplicate text while trying to truncate.
            (Thinca)
Solution:   Only truncate when there is not enough room.  Also check the byte
            length of the buffer.
This commit is contained in:
Bram Moolenaar 2012-01-20 20:44:43 +01:00
parent 3ef7cdf0fd
commit f31b764c23
6 changed files with 41 additions and 18 deletions

View File

@ -3258,9 +3258,8 @@ maketitle()
if (maxlen > 0) if (maxlen > 0)
{ {
/* make it shorter by removing a bit in the middle */ /* make it shorter by removing a bit in the middle */
len = vim_strsize(buf); if (vim_strsize(buf) > maxlen)
if (len > maxlen) trunc_string(buf, buf, maxlen, IOSIZE);
trunc_string(buf, buf, maxlen);
} }
} }
} }

View File

@ -22163,8 +22163,12 @@ call_user_func(fp, argcount, argvars, rettv, firstline, lastline, selfdict)
s = tv2string(&argvars[i], &tofree, numbuf2, 0); s = tv2string(&argvars[i], &tofree, numbuf2, 0);
if (s != NULL) if (s != NULL)
{ {
trunc_string(s, buf, MSG_BUF_CLEN); if (vim_strsize(s) > MSG_BUF_CLEN)
msg_puts(buf); {
trunc_string(s, buf, MSG_BUF_CLEN, MSG_BUF_LEN);
s = buf;
}
msg_puts(s);
vim_free(tofree); vim_free(tofree);
} }
} }
@ -22252,8 +22256,12 @@ call_user_func(fp, argcount, argvars, rettv, firstline, lastline, selfdict)
s = tv2string(fc->rettv, &tofree, numbuf2, 0); s = tv2string(fc->rettv, &tofree, numbuf2, 0);
if (s != NULL) if (s != NULL)
{ {
trunc_string(s, buf, MSG_BUF_CLEN); if (vim_strsize(s) > MSG_BUF_CLEN)
smsg((char_u *)_("%s returning %s"), sourcing_name, buf); {
trunc_string(s, buf, MSG_BUF_CLEN, MSG_BUF_LEN);
s = buf;
}
smsg((char_u *)_("%s returning %s"), sourcing_name, s);
vim_free(tofree); vim_free(tofree);
} }
} }

View File

@ -5923,7 +5923,7 @@ ex_history(eap)
hist[i].hisnum); hist[i].hisnum);
if (vim_strsize(hist[i].hisstr) > (int)Columns - 10) if (vim_strsize(hist[i].hisstr) > (int)Columns - 10)
trunc_string(hist[i].hisstr, IObuff + STRLEN(IObuff), trunc_string(hist[i].hisstr, IObuff + STRLEN(IObuff),
(int)Columns - 10); (int)Columns - 10, IOSIZE - STRLEN(IObuff));
else else
STRCAT(IObuff, hist[i].hisstr); STRCAT(IObuff, hist[i].hisstr);
msg_outtrans(IObuff); msg_outtrans(IObuff);

View File

@ -222,15 +222,16 @@ msg_strtrunc(s, force)
if (enc_utf8) if (enc_utf8)
/* may have up to 18 bytes per cell (6 per char, up to two /* may have up to 18 bytes per cell (6 per char, up to two
* composing chars) */ * composing chars) */
buf = alloc((room + 2) * 18); len = (room + 2) * 18;
else if (enc_dbcs == DBCS_JPNU) else if (enc_dbcs == DBCS_JPNU)
/* may have up to 2 bytes per cell for euc-jp */ /* may have up to 2 bytes per cell for euc-jp */
buf = alloc((room + 2) * 2); len = (room + 2) * 2;
else else
#endif #endif
buf = alloc(room + 2); len = room + 2;
buf = alloc(len);
if (buf != NULL) if (buf != NULL)
trunc_string(s, buf, room); trunc_string(s, buf, room, len);
} }
} }
return buf; return buf;
@ -241,10 +242,11 @@ msg_strtrunc(s, force)
* "s" and "buf" may be equal. * "s" and "buf" may be equal.
*/ */
void void
trunc_string(s, buf, room) trunc_string(s, buf, room, buflen)
char_u *s; char_u *s;
char_u *buf; char_u *buf;
int room; int room;
int buflen;
{ {
int half; int half;
int len; int len;
@ -257,7 +259,7 @@ trunc_string(s, buf, room)
len = 0; len = 0;
/* First part: Start of the string. */ /* First part: Start of the string. */
for (e = 0; len < half; ++e) for (e = 0; len < half && e < buflen; ++e)
{ {
if (s[e] == NUL) if (s[e] == NUL)
{ {
@ -274,7 +276,8 @@ trunc_string(s, buf, room)
if (has_mbyte) if (has_mbyte)
for (n = (*mb_ptr2len)(s + e); --n > 0; ) for (n = (*mb_ptr2len)(s + e); --n > 0; )
{ {
++e; if (++e == buflen)
break;
buf[e] = s[e]; buf[e] = s[e];
} }
#endif #endif
@ -319,8 +322,19 @@ trunc_string(s, buf, room)
} }
/* Set the middle and copy the last part. */ /* Set the middle and copy the last part. */
if (e + 3 < buflen)
{
mch_memmove(buf + e, "...", (size_t)3); mch_memmove(buf + e, "...", (size_t)3);
STRMOVE(buf + e + 3, s + i); len = STRLEN(s + i) + 1;
if (len >= buflen - e - 3)
len = buflen - e - 3 - 1;
mch_memmove(buf + e + 3, s + i, len);
buf[e + 3 + len - 1] = NUL;
}
else
{
buf[e - 1] = NUL; // make sure it is truncated
}
} }
/* /*

View File

@ -4,7 +4,7 @@ int verb_msg __ARGS((char_u *s));
int msg_attr __ARGS((char_u *s, int attr)); int msg_attr __ARGS((char_u *s, int attr));
int msg_attr_keep __ARGS((char_u *s, int attr, int keep)); int msg_attr_keep __ARGS((char_u *s, int attr, int keep));
char_u *msg_strtrunc __ARGS((char_u *s, int force)); char_u *msg_strtrunc __ARGS((char_u *s, int force));
void trunc_string __ARGS((char_u *s, char_u *buf, int room)); void trunc_string __ARGS((char_u *s, char_u *buf, int room, int buflen));
void reset_last_sourcing __ARGS((void)); void reset_last_sourcing __ARGS((void));
void msg_source __ARGS((int attr)); void msg_source __ARGS((int attr));
int emsg_not_now __ARGS((void)); int emsg_not_now __ARGS((void));

View File

@ -714,6 +714,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 */
/**/
407,
/**/ /**/
406, 406,
/**/ /**/