diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-07-01 18:17:26 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-07-01 18:17:26 +0200 |
commit | 22fcfad29276bd5f317faf516637dcd491b96a12 (patch) | |
tree | 5787f5e2134b066406fd0d222c4f2f0d18e28024 /src/message.c | |
parent | 8767f52fbfd4f053ce00a978227c95f1d7d323fe (diff) | |
download | vim-git-22fcfad29276bd5f317faf516637dcd491b96a12.tar.gz |
patch 7.4.1976v7.4.1976
Problem: Number variables are not 64 bits while they could be.
Solution: Add the num64 feature. (Ken Takata)
Diffstat (limited to 'src/message.c')
-rw-r--r-- | src/message.c | 67 |
1 files changed, 61 insertions, 6 deletions
diff --git a/src/message.c b/src/message.c index 5bd602784..b86c88675 100644 --- a/src/message.c +++ b/src/message.c @@ -3846,7 +3846,7 @@ do_browse( #if defined(FEAT_EVAL) static char *e_printf = N_("E766: Insufficient arguments for printf()"); -static long tv_nr(typval_T *tvs, int *idxp); +static varnumber_T tv_nr(typval_T *tvs, int *idxp); static char *tv_str(typval_T *tvs, int *idxp); # ifdef FEAT_FLOAT static double tv_float(typval_T *tvs, int *idxp); @@ -3855,11 +3855,11 @@ static double tv_float(typval_T *tvs, int *idxp); /* * Get number argument from "idxp" entry in "tvs". First entry is 1. */ - static long + static varnumber_T tv_nr(typval_T *tvs, int *idxp) { int idx = *idxp - 1; - long n = 0; + varnumber_T n = 0; int err = FALSE; if (tvs[idx].v_type == VAR_UNKNOWN) @@ -3912,7 +3912,7 @@ tv_float(typval_T *tvs, int *idxp) if (tvs[idx].v_type == VAR_FLOAT) f = tvs[idx].vval.v_float; else if (tvs[idx].v_type == VAR_NUMBER) - f = tvs[idx].vval.v_number; + f = (double)tvs[idx].vval.v_number; else EMSG(_("E807: Expected Float argument for printf()")); } @@ -4170,7 +4170,11 @@ vim_vsnprintf( if (length_modifier == 'l' && *p == 'l') { /* double l = long long */ +# ifdef FEAT_NUM64 + length_modifier = 'L'; +# else length_modifier = 'l'; /* treat it as a single 'l' */ +# endif p++; } } @@ -4299,6 +4303,12 @@ vim_vsnprintf( long int long_arg = 0; unsigned long int ulong_arg = 0; +# ifdef FEAT_NUM64 + /* only defined for length modifier ll */ + varnumber_T llong_arg = 0; + uvarnumber_T ullong_arg = 0; +# endif + /* pointer argument value -only defined for p * conversion */ void *ptr_arg = NULL; @@ -4343,6 +4353,19 @@ vim_vsnprintf( else if (long_arg < 0) arg_sign = -1; break; +# ifdef FEAT_NUM64 + case 'L': + llong_arg = +# if defined(FEAT_EVAL) + tvs != NULL ? tv_nr(tvs, &arg_idx) : +# endif + va_arg(ap, varnumber_T); + if (llong_arg > 0) + arg_sign = 1; + else if (llong_arg < 0) + arg_sign = -1; + break; +# endif } } else @@ -4371,6 +4394,18 @@ vim_vsnprintf( if (ulong_arg != 0) arg_sign = 1; break; +# ifdef FEAT_NUM64 + case 'L': + ullong_arg = +# if defined(FEAT_EVAL) + tvs != NULL ? (uvarnumber_T) + tv_nr(tvs, &arg_idx) : +# endif + va_arg(ap, uvarnumber_T); + if (ullong_arg != 0) + arg_sign = 1; + break; +# endif } } @@ -4415,17 +4450,27 @@ vim_vsnprintf( } else { - char f[5]; + char f[6]; int f_l = 0; /* construct a simple format string for sprintf */ f[f_l++] = '%'; if (!length_modifier) ; - else if (length_modifier == '2') + else if (length_modifier == 'L') { +# ifdef FEAT_NUM64 +# ifdef WIN3264 + f[f_l++] = 'I'; + f[f_l++] = '6'; + f[f_l++] = '4'; +# else f[f_l++] = 'l'; f[f_l++] = 'l'; +# endif +# else + f[f_l++] = 'l'; +# endif } else f[f_l++] = length_modifier; @@ -4446,6 +4491,11 @@ vim_vsnprintf( case 'l': str_arg_l += sprintf( tmp + str_arg_l, f, long_arg); break; +# ifdef FEAT_NUM64 + case 'L': str_arg_l += sprintf( + tmp + str_arg_l, f, llong_arg); + break; +# endif } } else @@ -4460,6 +4510,11 @@ vim_vsnprintf( case 'l': str_arg_l += sprintf( tmp + str_arg_l, f, ulong_arg); break; +# ifdef FEAT_NUM64 + case 'L': str_arg_l += sprintf( + tmp + str_arg_l, f, ullong_arg); + break; +# endif } } |