mirror of
https://github.com/neovim/neovim.git
synced 2025-09-29 06:28:35 +00:00
Use portable format specifiers: Support 'll' in vim_snprintf.
Add support for 'll' length specifier in vim_snprintf/vim_vsnprintf.
This commit is contained in:

committed by
Thiago de Arruda

parent
20fdaaaa94
commit
b9c550ebd5
@@ -3290,9 +3290,8 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs)
|
|||||||
if (*p == 'h' || *p == 'l') {
|
if (*p == 'h' || *p == 'l') {
|
||||||
length_modifier = *p;
|
length_modifier = *p;
|
||||||
p++;
|
p++;
|
||||||
if (length_modifier == 'l' && *p == 'l') {
|
if (length_modifier == 'l' && *p == 'l') { /* double l = long long */
|
||||||
/* double l = long long */
|
length_modifier = '2'; /* double l encoded as '2' */
|
||||||
length_modifier = 'l'; /* treat it as a single 'l' */
|
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3310,8 +3309,7 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs)
|
|||||||
|
|
||||||
/* get parameter value, do initial processing */
|
/* get parameter value, do initial processing */
|
||||||
switch (fmt_spec) {
|
switch (fmt_spec) {
|
||||||
/* '%' and 'c' behave similar to 's' regarding flags and field
|
/* '%' and 'c' behave similar to 's' regarding flags and field widths */
|
||||||
* widths */
|
|
||||||
case '%':
|
case '%':
|
||||||
case 'c':
|
case 'c':
|
||||||
case 's':
|
case 's':
|
||||||
@@ -3400,6 +3398,10 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs)
|
|||||||
long int long_arg = 0;
|
long int long_arg = 0;
|
||||||
unsigned long int ulong_arg = 0;
|
unsigned long int ulong_arg = 0;
|
||||||
|
|
||||||
|
/* only defined for length modifier ll */
|
||||||
|
long long int long_long_arg = 0;
|
||||||
|
unsigned long long int ulong_long_arg = 0;
|
||||||
|
|
||||||
/* pointer argument value -only defined for p
|
/* pointer argument value -only defined for p
|
||||||
* conversion */
|
* conversion */
|
||||||
void *ptr_arg = NULL;
|
void *ptr_arg = NULL;
|
||||||
@@ -3430,6 +3432,14 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs)
|
|||||||
else if (long_arg < 0)
|
else if (long_arg < 0)
|
||||||
arg_sign = -1;
|
arg_sign = -1;
|
||||||
break;
|
break;
|
||||||
|
case '2':
|
||||||
|
long_long_arg = tvs != NULL ? tv_nr(tvs, &arg_idx)
|
||||||
|
: va_arg(ap, long long int);
|
||||||
|
if (long_long_arg > 0)
|
||||||
|
arg_sign = 1;
|
||||||
|
else if (long_long_arg < 0)
|
||||||
|
arg_sign = -1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* unsigned */
|
/* unsigned */
|
||||||
@@ -3447,6 +3457,12 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs)
|
|||||||
if (ulong_arg != 0)
|
if (ulong_arg != 0)
|
||||||
arg_sign = 1;
|
arg_sign = 1;
|
||||||
break;
|
break;
|
||||||
|
case '2':
|
||||||
|
ulong_long_arg = tvs != NULL ?
|
||||||
|
(unsigned long long)tv_nr(tvs, &arg_idx) :
|
||||||
|
va_arg(ap, unsigned long long int);
|
||||||
|
if (ulong_long_arg) arg_sign = 1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3511,6 +3527,9 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs)
|
|||||||
case 'l': str_arg_l += sprintf(
|
case 'l': str_arg_l += sprintf(
|
||||||
tmp + str_arg_l, f, long_arg);
|
tmp + str_arg_l, f, long_arg);
|
||||||
break;
|
break;
|
||||||
|
case '2': str_arg_l += sprintf(
|
||||||
|
tmp + str_arg_l, f, long_long_arg);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* unsigned */
|
/* unsigned */
|
||||||
@@ -3522,6 +3541,9 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs)
|
|||||||
case 'l': str_arg_l += sprintf(
|
case 'l': str_arg_l += sprintf(
|
||||||
tmp + str_arg_l, f, ulong_arg);
|
tmp + str_arg_l, f, ulong_arg);
|
||||||
break;
|
break;
|
||||||
|
case '2': str_arg_l += sprintf(
|
||||||
|
tmp + str_arg_l, f, ulong_long_arg);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user