summaryrefslogtreecommitdiff
path: root/src/message.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-07-01 18:17:26 +0200
committerBram Moolenaar <Bram@vim.org>2016-07-01 18:17:26 +0200
commit22fcfad29276bd5f317faf516637dcd491b96a12 (patch)
tree5787f5e2134b066406fd0d222c4f2f0d18e28024 /src/message.c
parent8767f52fbfd4f053ce00a978227c95f1d7d323fe (diff)
downloadvim-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.c67
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
}
}