0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

updated for version 7.3.713

Problem:    printf() can only align to bytes, not characters.
Solution:   Add the "S" item. (Christian Brabandt)
This commit is contained in:
Bram Moolenaar
2012-11-14 18:10:56 +01:00
parent e3a2246227
commit 3ab72c5c72
3 changed files with 27 additions and 0 deletions

View File

@@ -4451,6 +4451,7 @@ printf({fmt}, {expr1} ...) *printf()*
Often used items are: Often used items are:
%s string %s string
%6S string right-aligned in 6 display cells
%6s string right-aligned in 6 bytes %6s string right-aligned in 6 bytes
%.9s string truncated to 9 bytes %.9s string truncated to 9 bytes
%c single byte %c single byte
@@ -4565,6 +4566,10 @@ printf({fmt}, {expr1} ...) *printf()*
s The text of the String argument is used. If a s The text of the String argument is used. If a
precision is specified, no more bytes than the number precision is specified, no more bytes than the number
specified are used. specified are used.
S The text of the String argument is used. If a
precision is specified, no more display cells than the
number specified are used. Without the |+multi_byte|
feature works just like 's'.
*printf-f* *E807* *printf-f* *E807*
f The Float argument is converted into a string of the f The Float argument is converted into a string of the

View File

@@ -4290,6 +4290,7 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
case '%': case '%':
case 'c': case 'c':
case 's': case 's':
case 'S':
length_modifier = '\0'; length_modifier = '\0';
str_arg_l = 1; str_arg_l = 1;
switch (fmt_spec) switch (fmt_spec)
@@ -4318,6 +4319,7 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
} }
case 's': case 's':
case 'S':
str_arg = str_arg =
#ifndef HAVE_STDARG_H #ifndef HAVE_STDARG_H
(char *)get_a_arg(arg_idx); (char *)get_a_arg(arg_idx);
@@ -4354,6 +4356,24 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
str_arg_l = (q == NULL) ? precision str_arg_l = (q == NULL) ? precision
: (size_t)(q - str_arg); : (size_t)(q - str_arg);
} }
#ifdef FEAT_MBYTE
if (fmt_spec == 'S')
{
if (min_field_width != 0)
min_field_width += STRLEN(str_arg)
- mb_string2cells((char_u *)str_arg, -1);
if (precision)
{
char_u *p1 = (char_u *)str_arg;
size_t i;
for (i = 0; i < precision && *p1; i++)
p1 += mb_ptr2len(p1);
str_arg_l = precision = p1 - (char_u *)str_arg;
}
}
#endif
break; break;
default: default:

View File

@@ -725,6 +725,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 */
/**/
713,
/**/ /**/
712, 712,
/**/ /**/