aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEliseo Martínez <eliseomarmol@gmail.com>2014-04-21 13:28:43 +0200
committerThiago de Arruda <tpadilha84@gmail.com>2014-04-23 06:56:33 -0300
commitb9c550ebd5ce5d3f37ca6bab7657be1b3fba6697 (patch)
tree9669524559a3532a609d520ff5626875fafd4051
parent20fdaaaa9427f6e5ef65c4f6529e26b8bdbcbe23 (diff)
downloadrneovim-b9c550ebd5ce5d3f37ca6bab7657be1b3fba6697.tar.gz
rneovim-b9c550ebd5ce5d3f37ca6bab7657be1b3fba6697.tar.bz2
rneovim-b9c550ebd5ce5d3f37ca6bab7657be1b3fba6697.zip
Use portable format specifiers: Support 'll' in vim_snprintf.
Add support for 'll' length specifier in vim_snprintf/vim_vsnprintf.
-rw-r--r--src/message.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/message.c b/src/message.c
index cc84d88732..d41301fc90 100644
--- a/src/message.c
+++ b/src/message.c
@@ -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') {
length_modifier = *p;
p++;
- if (length_modifier == 'l' && *p == 'l') {
- /* double l = long long */
- length_modifier = 'l'; /* treat it as a single 'l' */
+ if (length_modifier == 'l' && *p == 'l') { /* double l = long long */
+ length_modifier = '2'; /* double l encoded as '2' */
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 */
switch (fmt_spec) {
- /* '%' and 'c' behave similar to 's' regarding flags and field
- * widths */
+ /* '%' and 'c' behave similar to 's' regarding flags and field widths */
case '%':
case 'c':
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;
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
* conversion */
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)
arg_sign = -1;
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 {
/* 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)
arg_sign = 1;
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(
tmp + str_arg_l, f, long_arg);
break;
+ case '2': str_arg_l += sprintf(
+ tmp + str_arg_l, f, long_long_arg);
+ break;
}
} else {
/* 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(
tmp + str_arg_l, f, ulong_arg);
break;
+ case '2': str_arg_l += sprintf(
+ tmp + str_arg_l, f, ulong_long_arg);
+ break;
}
}