0
0
mirror of https://github.com/vim/vim.git synced 2025-10-17 07:44:28 -04:00

patch 7.4.1976

Problem:    Number variables are not 64 bits while they could be.
Solution:   Add the num64 feature. (Ken Takata)
This commit is contained in:
Bram Moolenaar
2016-07-01 18:17:26 +02:00
parent 8767f52fbf
commit 22fcfad292
23 changed files with 384 additions and 227 deletions

View File

@@ -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
}
}