diff options
author | Eliseo Martínez <eliseomarmol@gmail.com> | 2014-04-21 13:28:43 +0200 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-04-23 06:56:33 -0300 |
commit | b9c550ebd5ce5d3f37ca6bab7657be1b3fba6697 (patch) | |
tree | 9669524559a3532a609d520ff5626875fafd4051 | |
parent | 20fdaaaa9427f6e5ef65c4f6529e26b8bdbcbe23 (diff) | |
download | rneovim-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.c | 32 |
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; } } |