Hi,
2016/2/24 Wed 22:10:33 UTC+9 Ken Takata wrote:
> I have updated the num64 patch. I have merged the three patches into one
> again.
> This includes the fix of the g<C-G> problem:
> https://groups.google.com/d/msg/vim_dev/8epHlRuIAHc/j5I9x9eHEQAJ
I have updated the num64 patch for 7.4.1665.
Please check the attached patch.
Bram, I'm afraid that you are mistaking some of my patches.
Attached patch is related to the following item from the todo.txt:
L175-176
> Patch to support 64 bit ints for Number. (Ken Takata, 2016 Jan 21)
> Also in update of Feb 24?
The num64 patch is also available from the following URL:
https://bitbucket.org/k_takata/vim-ktakata-mq/src/tip/num64.patch
(I will keep it up to date in the same URL.)
Regards,
Ken Takata
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.
# HG changeset patch
# Parent 52b6a76106215890bbecb2811018e59403efd0a0
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -40,6 +40,8 @@ 1.1 Variable types ~
There are nine types of variables:
Number A 32 or 64 bit signed number. |expr-number| *Number*
+ 64-bit Number is avaliable only when compiled with the
+ |+num64| feature.
Examples: -123 0x10 0177
Float A floating point number. |floating-point-format| *Float*
@@ -846,6 +848,11 @@ When dividing a Number by zero the resul
<0 / 0 = -0x7fffffff (like negative infinity)
(before Vim 7.2 it was always 0x7fffffff)
+When 64-bit Number support is enabled:
+ 0 / 0 = -0x8000000000000000 (like NaN for Float)
+ >0 / 0 = 0x7fffffffffffffff (like positive infinity)
+ <0 / 0 = -0x7fffffffffffffff (like negative infinity)
+
When the righthand side of '%' is zero, the result is 0.
None of these work for |Funcref|s.
@@ -3462,8 +3469,10 @@ float2nr({expr}) *float2nr()*
decimal point.
{expr} must evaluate to a |Float| or a Number.
When the value of {expr} is out of range for a |Number| the
- result is truncated to 0x7fffffff or -0x7fffffff. NaN results
- in -0x80000000.
+ result is truncated to 0x7fffffff or -0x7fffffff (or when
+ 64-bit Number support is enabled, 0x7fffffffffffffff or
+ -0x7fffffffffffffff. NaN results in -0x80000000 (or when
+ 64-bit Number support is enabled, -0x8000000000000000).
Examples: >
echo float2nr(3.95)
< 3 >
@@ -7607,6 +7616,7 @@ multi_lang Compiled with support for mu
mzscheme Compiled with MzScheme interface |mzscheme|.
netbeans_enabled Compiled with support for |netbeans| and connected.
netbeans_intg Compiled with support for |netbeans|.
+num64 Compiled with 64-bit |Number| support.
ole Compiled with OLE automation support for Win32.
os2 OS/2 version of Vim.
path_extra Compiled with up/downwards search in 'path' and 'tags'
diff --git a/runtime/doc/tags b/runtime/doc/tags
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -1256,6 +1256,7 @@
+mzscheme various.txt /*+mzscheme*
+mzscheme/dyn various.txt /*+mzscheme\/dyn*
+netbeans_intg various.txt /*+netbeans_intg*
++num64 various.txt /*+num64*
+ole various.txt /*+ole*
+path_extra various.txt /*+path_extra*
+perl various.txt /*+perl*
diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt
--- a/runtime/doc/various.txt
+++ b/runtime/doc/various.txt
@@ -390,6 +390,7 @@ N *+multi_lang* non-English language su
m *+mzscheme* Mzscheme interface |mzscheme|
m *+mzscheme/dyn* Mzscheme interface |mzscheme-dynamic| |/dyn|
m *+netbeans_intg* |netbeans|
+ *+num64* 64-bit Number support |Number|
m *+ole* Win32 GUI only: |ole-interface|
N *+path_extra* Up/downwards search in 'path' and 'tags'
m *+perl* Perl interface |perl|
diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak
--- a/src/Make_cyg_ming.mak
+++ b/src/Make_cyg_ming.mak
@@ -378,7 +378,7 @@ endif # RUBY
# Any other defines can be included here.
DEF_GUI=-DFEAT_GUI_W32 -DFEAT_CLIPBOARD
DEFINES=-DWIN32 -DWINVER=$(WINVER) -D_WIN32_WINNT=$(WINVER) \
- -DHAVE_PATHDEF -DFEAT_$(FEATURES)
+ -DHAVE_PATHDEF -DFEAT_$(FEATURES) -DHAVE_STDINT_H
ifeq ($(ARCH),x86-64)
DEFINES+=-DMS_WIN64
endif
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -478,6 +478,11 @@ OPTFLAG = $(OPTFLAG) /GL
CFLAGS=$(CFLAGS) $(WP64CHECK)
!endif
+# VC10 or later has stdint.h.
+!if $(MSVC_MAJOR) >= 10
+CFLAGS = $(CFLAGS) -DHAVE_STDINT_H
+!endif
+
# Static code analysis generally available starting with VS2012 (VC11) or
# Windows SDK 7.1 (VC10)
!if ("$(ANALYZE)" == "yes") && ($(MSVC_MAJOR) >= 10)
diff --git a/src/charset.c b/src/charset.c
--- a/src/charset.c
+++ b/src/charset.c
@@ -1836,14 +1836,14 @@ vim_str2nr(
is bin */
int *len, /* return: detected length of number */
int what, /* what numbers to recognize */
- long *nptr, /* return: signed result */
- unsigned long *unptr, /* return: unsigned result */
+ varnumber_T *nptr, /* return: signed result */
+ uvarnumber_T *unptr, /* return: unsigned result */
int maxlen) /* max length of string to check */
{
char_u *ptr = start;
int pre = 0; /* default is decimal */
int negative = FALSE;
- unsigned long un = 0;
+ uvarnumber_T un = 0;
int n;
if (ptr[0] == '-')
@@ -1912,7 +1912,7 @@ vim_str2nr(
/* octal */
while ('0' <= *ptr && *ptr <= '7')
{
- un = 8 * un + (unsigned long)(*ptr - '0');
+ un = 8 * un + (uvarnumber_T)(*ptr - '0');
++ptr;
if (n++ == maxlen)
break;
@@ -1925,7 +1925,7 @@ vim_str2nr(
n += 2; /* skip over "0x" */
while (vim_isxdigit(*ptr))
{
- un = 16 * un + (unsigned long)hex2nr(*ptr);
+ un = 16 * un + (uvarnumber_T)hex2nr(*ptr);
++ptr;
if (n++ == maxlen)
break;
@@ -1936,7 +1936,7 @@ vim_str2nr(
/* decimal */
while (VIM_ISDIGIT(*ptr))
{
- un = 10 * un + (unsigned long)(*ptr - '0');
+ un = 10 * un + (uvarnumber_T)(*ptr - '0');
++ptr;
if (n++ == maxlen)
break;
@@ -1950,9 +1950,9 @@ vim_str2nr(
if (nptr != NULL)
{
if (negative) /* account for leading '-' for decimal numbers */
- *nptr = -(long)un;
+ *nptr = -(varnumber_T)un;
else
- *nptr = (long)un;
+ *nptr = (varnumber_T)un;
}
if (unptr != NULL)
*unptr = un;
diff --git a/src/eval.c b/src/eval.c
--- a/src/eval.c
+++ b/src/eval.c
@@ -1343,7 +1343,7 @@ eval_to_bool(
int skip) /* only parse, don't execute */
{
typval_T tv;
- int retval = FALSE;
+ varnumber_T retval = FALSE;
if (skip)
++emsg_skip;
@@ -1361,7 +1361,7 @@ eval_to_bool(
if (skip)
--emsg_skip;
- return retval;
+ return (int)retval;
}
/*
@@ -1486,11 +1486,11 @@ eval_to_string_safe(
* Evaluates "expr" silently.
* Returns -1 for an error.
*/
- int
+ varnumber_T
eval_to_number(char_u *expr)
{
typval_T rettv;
- int retval;
+ varnumber_T retval;
char_u *p = skipwhite(expr);
++emsg_off;
@@ -1595,7 +1595,7 @@ get_spellword(list_T *list, char_u **pp)
li = li->li_next;
if (li == NULL)
return -1;
- return get_tv_number(&li->li_tv);
+ return (int)get_tv_number(&li->li_tv);
}
#endif
@@ -1636,7 +1636,7 @@ call_vim_function(
typval_T *rettv)
{
typval_T *argvars;
- long n;
+ varnumber_T n;
int len;
int i;
int doesrange;
@@ -1702,7 +1702,7 @@ call_vim_function(
* Returns -1 when calling the function fails.
* Uses argv[argc] for the function arguments.
*/
- long
+ varnumber_T
call_func_retnr(
char_u *func,
int argc,
@@ -1710,7 +1710,7 @@ call_func_retnr(
int safe) /* use the sandbox */
{
typval_T rettv;
- long retval;
+ varnumber_T retval;
/* All arguments are passed as strings, no conversion to number. */
if (call_vim_function(func, argc, argv, safe, TRUE, &rettv) == FAIL)
@@ -1847,7 +1847,7 @@ prof_child_exit(
eval_foldexpr(char_u *arg, int *cp)
{
typval_T tv;
- int retval;
+ varnumber_T retval;
char_u *s;
int use_sandbox = was_set_insecurely((char_u *)"foldexpr",
OPT_LOCAL);
@@ -1882,7 +1882,7 @@ eval_foldexpr(char_u *arg, int *cp)
--sandbox;
--textlock;
- return retval;
+ return (int)retval;
}
#endif
@@ -3086,7 +3086,7 @@ set_var_lval(
static int
tv_op(typval_T *tv1, typval_T *tv2, char_u *op)
{
- long n;
+ varnumber_T n;
char_u numbuf[NUMBUFLEN];
char_u *s;
@@ -4426,7 +4426,7 @@ eval4(char_u **arg, typval_T *rettv, int
exptype_T type = TYPE_UNKNOWN;
int type_is = FALSE; /* TRUE for "is" and "isnot" */
int len = 2;
- long n1, n2;
+ varnumber_T n1, n2;
char_u *s1, *s2;
char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN];
int ic;
@@ -4705,7 +4705,7 @@ eval5(char_u **arg, typval_T *rettv, int
typval_T var2;
typval_T var3;
int op;
- long n1, n2;
+ varnumber_T n1, n2;
#ifdef FEAT_FLOAT
float_T f1 = 0, f2 = 0;
#endif
@@ -4890,7 +4890,7 @@ eval6(
{
typval_T var2;
int op;
- long n1, n2;
+ varnumber_T n1, n2;
#ifdef FEAT_FLOAT
int use_float = FALSE;
float_T f1 = 0, f2;
@@ -5011,12 +5011,21 @@ eval6(
{
if (n2 == 0) /* give an error message? */
{
+#ifdef FEAT_NUM64
+ if (n1 == 0)
+ n1 = -0x7fffffffffffffff - 1; /* similar to NaN */
+ else if (n1 < 0)
+ n1 = -0x7fffffffffffffff;
+ else
+ n1 = 0x7fffffffffffffff;
+#else
if (n1 == 0)
n1 = -0x7fffffffL - 1L; /* similar to NaN */
else if (n1 < 0)
n1 = -0x7fffffffL;
else
n1 = 0x7fffffffL;
+#endif
}
else
n1 = n1 / n2;
@@ -5070,7 +5079,7 @@ eval7(
int evaluate,
int want_string UNUSED) /* after "." operator */
{
- long n;
+ varnumber_T n;
int len;
char_u *s;
char_u *start_leader, *end_leader;
@@ -6376,7 +6385,7 @@ list_find_nr(
*errorp = TRUE;
return -1L;
}
- return get_tv_number_chk(&li->li_tv, errorp);
+ return (long)get_tv_number_chk(&li->li_tv, errorp);
}
/*
@@ -7491,7 +7500,7 @@ dict_add(dict_T *d, dictitem_T *item)
dict_add_nr_str(
dict_T *d,
char *key,
- long nr,
+ varnumber_T nr,
char_u *str)
{
dictitem_T *item;
@@ -7613,7 +7622,7 @@ get_dict_string(dict_T *d, char_u *key,
* Get a number item from a dictionary.
* Returns 0 if the entry doesn't exist.
*/
- long
+ varnumber_T
get_dict_number(dict_T *d, char_u *key)
{
dictitem_T *di;
@@ -11664,12 +11673,21 @@ f_float2nr(typval_T *argvars, typval_T *
if (get_float_arg(argvars, &f) == OK)
{
+# ifdef FEAT_NUM64
+ if (f < -0x7fffffffffffffff)
+ rettv->vval.v_number = -0x7fffffffffffffff;
+ else if (f > 0x7fffffffffffffff)
+ rettv->vval.v_number = 0x7fffffffffffffff;
+ else
+ rettv->vval.v_number = (varnumber_T)f;
+# else
if (f < -0x7fffffff)
rettv->vval.v_number = -0x7fffffff;
else if (f > 0x7fffffff)
rettv->vval.v_number = 0x7fffffff;
else
rettv->vval.v_number = (varnumber_T)f;
+# endif
}
}
@@ -13684,6 +13702,9 @@ f_has(typval_T *argvars, typval_T *rettv
"mzscheme",
#endif
#endif
+#ifdef FEAT_NUM64
+ "num64",
+#endif
#ifdef FEAT_OLE
"ole",
#endif
@@ -17211,7 +17232,7 @@ search_cmn(typval_T *argvars, pos_T *mat
#ifdef FEAT_RELTIME
if (argvars[3].v_type != VAR_UNKNOWN)
{
- time_limit = get_tv_number_chk(&argvars[3], NULL);
+ time_limit = (long)get_tv_number_chk(&argvars[3], NULL);
if (time_limit < 0)
goto theend;
}
@@ -17307,8 +17328,8 @@ f_screenattr(typval_T *argvars, typval_T
int col;
int c;
- row = get_tv_number_chk(&argvars[0], NULL) - 1;
- col = get_tv_number_chk(&argvars[1], NULL) - 1;
+ row = (int)get_tv_number_chk(&argvars[0], NULL) - 1;
+ col = (int)get_tv_number_chk(&argvars[1], NULL) - 1;
if (row < 0 || row >= screen_Rows
|| col < 0 || col >= screen_Columns)
c = -1;
@@ -17328,8 +17349,8 @@ f_screenchar(typval_T *argvars, typval_T
int off;
int c;
- row = get_tv_number_chk(&argvars[0], NULL) - 1;
- col = get_tv_number_chk(&argvars[1], NULL) - 1;
+ row = (int)get_tv_number_chk(&argvars[0], NULL) - 1;
+ col = (int)get_tv_number_chk(&argvars[1], NULL) - 1;
if (row < 0 || row >= screen_Rows
|| col < 0 || col >= screen_Columns)
c = -1;
@@ -19167,7 +19188,7 @@ f_str2nr(typval_T *argvars, typval_T *re
{
int base = 10;
char_u *p;
- long n;
+ varnumber_T n;
int what;
if (argvars[1].v_type != VAR_UNKNOWN)
@@ -19548,14 +19569,14 @@ f_synID(typval_T *argvars UNUSED, typval
{
int id = 0;
#ifdef FEAT_SYN_HL
- long lnum;
- long col;
+ linenr_T lnum;
+ colnr_T col;
int trans;
int transerr = FALSE;
lnum = get_tv_lnum(argvars); /* -1 on type error */
- col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */
- trans = get_tv_number_chk(&argvars[2], &transerr);
+ col = (linenr_T)get_tv_number(&argvars[1]) - 1; /* -1 on type error */
+ trans = (int)get_tv_number_chk(&argvars[2], &transerr);
if (!transerr && lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
&& col >= 0 && col < (long)STRLEN(ml_get(lnum)))
@@ -19579,7 +19600,7 @@ f_synIDattr(typval_T *argvars UNUSED, ty
char_u modebuf[NUMBUFLEN];
int modec;
- id = get_tv_number(&argvars[0]);
+ id = (int)get_tv_number(&argvars[0]);
what = get_tv_string(&argvars[1]);
if (argvars[2].v_type != VAR_UNKNOWN)
{
@@ -19667,7 +19688,7 @@ f_synIDtrans(typval_T *argvars UNUSED, t
int id;
#ifdef FEAT_SYN_HL
- id = get_tv_number(&argvars[0]);
+ id = (int)get_tv_number(&argvars[0]);
if (id > 0)
id = syn_get_final_id(id);
@@ -19685,8 +19706,8 @@ f_synIDtrans(typval_T *argvars UNUSED, t
f_synconcealed(typval_T *argvars UNUSED, typval_T *rettv)
{
#if defined(FEAT_SYN_HL) && defined(FEAT_CONCEAL)
- long lnum;
- long col;
+ linenr_T lnum;
+ colnr_T col;
int syntax_flags = 0;
int cchar;
int matchid = 0;
@@ -19698,7 +19719,7 @@ f_synconcealed(typval_T *argvars UNUSED,
#if defined(FEAT_SYN_HL) && defined(FEAT_CONCEAL)
lnum = get_tv_lnum(argvars); /* -1 on type error */
- col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */
+ col = (colnr_T)get_tv_number(&argvars[1]) - 1; /* -1 on type error */
vim_memset(str, NUL, sizeof(str));
@@ -19745,8 +19766,8 @@ f_synconcealed(typval_T *argvars UNUSED,
f_synstack(typval_T *argvars UNUSED, typval_T *rettv)
{
#ifdef FEAT_SYN_HL
- long lnum;
- long col;
+ linenr_T lnum;
+ colnr_T col;
int i;
int id;
#endif
@@ -19756,7 +19777,7 @@ f_synstack(typval_T *argvars UNUSED, typ
#ifdef FEAT_SYN_HL
lnum = get_tv_lnum(argvars); /* -1 on type error */
- col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */
+ col = (colnr_T)get_tv_number(&argvars[1]) - 1; /* -1 on type error */
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
&& col >= 0 && col <= (long)STRLEN(ml_get(lnum))
@@ -20754,29 +20775,29 @@ f_winrestview(typval_T *argvars, typval_
else
{
if (dict_find(dict, (char_u *)"lnum", -1) != NULL)
- curwin->w_cursor.lnum = get_dict_number(dict, (char_u *)"lnum");
+ curwin->w_cursor.lnum = (linenr_T)get_dict_number(dict, (char_u *)"lnum");
if (dict_find(dict, (char_u *)"col", -1) != NULL)
- curwin->w_cursor.col = get_dict_number(dict, (char_u *)"col");
+ curwin->w_cursor.col = (colnr_T)get_dict_number(dict, (char_u *)"col");
#ifdef FEAT_VIRTUALEDIT
if (dict_find(dict, (char_u *)"coladd", -1) != NULL)
- curwin->w_cursor.coladd = get_dict_number(dict, (char_u *)"coladd");
+ curwin->w_cursor.coladd = (colnr_T)get_dict_number(dict, (char_u *)"coladd");
#endif
if (dict_find(dict, (char_u *)"curswant", -1) != NULL)
{
- curwin->w_curswant = get_dict_number(dict, (char_u *)"curswant");
+ curwin->w_curswant = (colnr_T)get_dict_number(dict, (char_u *)"curswant");
curwin->w_set_curswant = FALSE;
}
if (dict_find(dict, (char_u *)"topline", -1) != NULL)
- set_topline(curwin, get_dict_number(dict, (char_u *)"topline"));
+ set_topline(curwin, (linenr_T)get_dict_number(dict, (char_u *)"topline"));
#ifdef FEAT_DIFF
if (dict_find(dict, (char_u *)"topfill", -1) != NULL)
- curwin->w_topfill = get_dict_number(dict, (char_u *)"topfill");
+ curwin->w_topfill = (int)get_dict_number(dict, (char_u *)"topfill");
#endif
if (dict_find(dict, (char_u *)"leftcol", -1) != NULL)
- curwin->w_leftcol = get_dict_number(dict, (char_u *)"leftcol");
+ curwin->w_leftcol = (colnr_T)get_dict_number(dict, (char_u *)"leftcol");
if (dict_find(dict, (char_u *)"skipcol", -1) != NULL)
- curwin->w_skipcol = get_dict_number(dict, (char_u *)"skipcol");
+ curwin->w_skipcol = (colnr_T)get_dict_number(dict, (char_u *)"skipcol");
check_cursor();
win_new_height(curwin, curwin->w_height);
@@ -21438,7 +21459,7 @@ eval_isnamec1(int c)
* Set number v: variable to "val".
*/
void
-set_vim_var_nr(int idx, long val)
+set_vim_var_nr(int idx, varnumber_T val)
{
vimvars[idx].vv_nr = val;
}
@@ -21446,7 +21467,7 @@ set_vim_var_nr(int idx, long val)
/*
* Get number v: variable value.
*/
- long
+ varnumber_T
get_vim_var_nr(int idx)
{
return vimvars[idx].vv_nr;
@@ -22054,7 +22075,7 @@ init_tv(typval_T *varp)
* caller of incompatible types: it sets *denote to TRUE if "denote"
* is not NULL or returns -1 otherwise.
*/
- long
+ varnumber_T
get_tv_number(typval_T *varp)
{
int error = FALSE;
@@ -22062,15 +22083,15 @@ get_tv_number(typval_T *varp)
return get_tv_number_chk(varp, &error); /* return 0L on error */
}
- long
+ varnumber_T
get_tv_number_chk(typval_T *varp, int *denote)
{
- long n = 0L;
+ varnumber_T n = 0L;
switch (varp->v_type)
{
case VAR_NUMBER:
- return (long)(varp->vval.v_number);
+ return varp->vval.v_number;
case VAR_FLOAT:
#ifdef FEAT_FLOAT
EMSG(_("E805: Using a Float as a Number"));
@@ -22170,12 +22191,12 @@ get_tv_lnum(typval_T *argvars)
typval_T rettv;
linenr_T lnum;
- lnum = get_tv_number_chk(&argvars[0], NULL);
+ lnum = (linenr_T)get_tv_number_chk(&argvars[0], NULL);
if (lnum == 0) /* no valid number, try using line() */
{
rettv.v_type = VAR_NUMBER;
f_line(argvars, &rettv);
- lnum = rettv.vval.v_number;
+ lnum = (linenr_T)rettv.vval.v_number;
clear_tv(&rettv);
}
return lnum;
@@ -22194,7 +22215,7 @@ get_tv_lnum_buf(typval_T *argvars, buf_T
&& argvars[0].vval.v_string[0] == '$'
&& buf != NULL)
return buf->b_ml.ml_line_count;
- return get_tv_number_chk(&argvars[0], NULL);
+ return (linenr_T)get_tv_number_chk(&argvars[0], NULL);
}
/*
@@ -22240,7 +22261,8 @@ get_tv_string_buf_chk(typval_T *varp, ch
switch (varp->v_type)
{
case VAR_NUMBER:
- sprintf((char *)buf, "%ld", (long)varp->vval.v_number);
+ sprintf((char *)buf, "%"VARNUMBER_FMT"d",
+ (varnumber_T)varp->vval.v_number);
return buf;
case VAR_FUNC:
case VAR_PARTIAL:
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -289,10 +289,10 @@ typedef struct
union {
struct
{
- long start_col_nr; /* starting column number */
- long end_col_nr; /* ending column number */
+ varnumber_T start_col_nr; /* starting column number */
+ varnumber_T end_col_nr; /* ending column number */
} line;
- long value; /* value if sorting by integer */
+ varnumber_T value; /* value if sorting by integer */
#ifdef FEAT_FLOAT
float_T value_flt; /* value if sorting by float */
#endif
diff --git a/src/ex_getln.c b/src/ex_getln.c
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -5973,7 +5973,7 @@ get_list_range(char_u **str, int *num1,
{
int len;
int first = FALSE;
- long num;
+ varnumber_T num;
*str = skipwhite(*str);
if (**str == '-' || vim_isdigit(**str)) /* parse "from" part of range */
diff --git a/src/feature.h b/src/feature.h
--- a/src/feature.h
+++ b/src/feature.h
@@ -362,12 +362,16 @@
* +eval Built-in script language and expression evaluation,
* ":let", ":if", etc.
* +float Floating point variables.
+ * +num64 64-bit Number.
*/
#ifdef FEAT_NORMAL
# define FEAT_EVAL
# if defined(HAVE_FLOAT_FUNCS) || defined(WIN3264) || defined(MACOS)
# define FEAT_FLOAT
# endif
+# if defined(HAVE_STDINT_H) || defined(WIN3264) || (VIM_SIZEOF_LONG >= 8)
+# define FEAT_NUM64
+# endif
#endif
/*
diff --git a/src/fileio.c b/src/fileio.c
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -9437,7 +9437,7 @@ apply_autocmds_group(
#ifdef FEAT_EVAL
/* set v:cmdarg (only when there is a matching pattern) */
- save_cmdbang = get_vim_var_nr(VV_CMDBANG);
+ save_cmdbang = (long)get_vim_var_nr(VV_CMDBANG);
if (eap != NULL)
{
save_cmdarg = set_cmdarg(eap, NULL);
diff --git a/src/fold.c b/src/fold.c
--- a/src/fold.c
+++ b/src/fold.c
@@ -3029,7 +3029,7 @@ foldlevelExpr(fline_T *flp)
/* KeyTyped may be reset to 0 when calling a function which invokes
* do_cmdline(). To make 'foldopen' work correctly restore KeyTyped. */
save_keytyped = KeyTyped;
- n = eval_foldexpr(flp->wp->w_p_fde, &c);
+ n = (int)eval_foldexpr(flp->wp->w_p_fde, &c);
KeyTyped = save_keytyped;
switch (c)
diff --git a/src/json.c b/src/json.c
--- a/src/json.c
+++ b/src/json.c
@@ -201,8 +201,8 @@ json_encode_item(garray_T *gap, typval_T
break;
case VAR_NUMBER:
- vim_snprintf((char *)numbuf, NUMBUFLEN, "%ld",
- (long)val->vval.v_number);
+ vim_snprintf((char *)numbuf, NUMBUFLEN, "%lld",
+ val->vval.v_number);
ga_concat(gap, numbuf);
break;
@@ -536,7 +536,7 @@ json_decode_string(js_read_T *reader, ty
int len;
char_u *p;
int c;
- long nr;
+ varnumber_T nr;
char_u buf[NUMBUFLEN];
if (res != NULL)
@@ -599,7 +599,7 @@ json_decode_string(js_read_T *reader, ty
&& (int)(reader->js_end - p) >= 6
&& *p == '\\' && *(p+1) == 'u')
{
- long nr2 = 0;
+ varnumber_T nr2 = 0;
/* decode surrogate pair: \ud812\u3456 */
len = 0;
@@ -618,7 +618,7 @@ json_decode_string(js_read_T *reader, ty
buf[utf_char2bytes((int)nr, buf)] = NUL;
ga_concat(&ga, buf);
#else
- ga_append(&ga, nr);
+ ga_append(&ga, (int)nr);
#endif
}
break;
@@ -764,7 +764,7 @@ json_decode_item(js_read_T *reader, typv
else
#endif
{
- long nr;
+ varnumber_T nr;
vim_str2nr(reader->js_buf + reader->js_used,
NULL, &len, 0, /* what */
diff --git a/src/message.c b/src/message.c
--- a/src/message.c
+++ b/src/message.c
@@ -3819,7 +3819,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);
@@ -3828,11 +3828,11 @@ static double tv_float(typval_T *tvs, in
/*
* 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)
@@ -3885,7 +3885,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()"));
}
@@ -4143,7 +4143,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++;
}
}
@@ -4272,6 +4276,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;
@@ -4316,6 +4326,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
@@ -4344,6 +4367,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
}
}
@@ -4388,17 +4423,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;
@@ -4419,6 +4464,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
@@ -4433,6 +4483,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
}
}
diff --git a/src/misc1.c b/src/misc1.c
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -9163,7 +9163,7 @@ get_expr_indent(void)
if (use_sandbox)
++sandbox;
++textlock;
- indent = eval_to_number(curbuf->b_p_inde);
+ indent = (int)eval_to_number(curbuf->b_p_inde);
if (use_sandbox)
--sandbox;
--textlock;
diff --git a/src/misc2.c b/src/misc2.c
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2719,7 +2719,7 @@ find_special_key(
int modifiers;
int bit;
int key;
- unsigned long n;
+ uvarnumber_T n;
int l;
src = *srcp;
diff --git a/src/ops.c b/src/ops.c
--- a/src/ops.c
+++ b/src/ops.c
@@ -4736,7 +4736,7 @@ fex_format(
*/
if (use_sandbox)
++sandbox;
- r = eval_to_number(curbuf->b_p_fex);
+ r = (int)eval_to_number(curbuf->b_p_fex);
if (use_sandbox)
--sandbox;
@@ -5430,8 +5430,8 @@ do_addsub(
char_u buf2[NUMBUFLEN];
int pre; /* 'X'/'x': hex; '0': octal; 'B'/'b': bin */
static int hexupper = FALSE; /* 0xABC */
- unsigned long n;
- long_u oldn;
+ uvarnumber_T n;
+ uvarnumber_T oldn;
char_u *ptr;
int c;
int todel;
@@ -5637,9 +5637,9 @@ do_addsub(
oldn = n;
if (subtract)
- n -= (unsigned long)Prenum1;
+ n -= (uvarnumber_T)Prenum1;
else
- n += (unsigned long)Prenum1;
+ n += (uvarnumber_T)Prenum1;
/* handle wraparound for decimal numbers */
if (!pre)
{
@@ -5647,7 +5647,7 @@ do_addsub(
{
if (n > oldn)
{
- n = 1 + (n ^ (unsigned long)-1);
+ n = 1 + (n ^ (uvarnumber_T)-1);
negative ^= TRUE;
}
}
@@ -5656,7 +5656,7 @@ do_addsub(
/* add */
if (n < oldn)
{
- n = (n ^ (unsigned long)-1);
+ n = (n ^ (uvarnumber_T)-1);
negative ^= TRUE;
}
}
@@ -5732,7 +5732,7 @@ do_addsub(
{
int i;
int bit = 0;
- int bits = sizeof(unsigned long) * 8;
+ int bits = sizeof(uvarnumber_T) * 8;
/* leading zeros */
for (bit = bits; bit > 0; bit--)
@@ -5744,13 +5744,13 @@ do_addsub(
buf2[i] = '\0';
}
else if (pre == 0)
- sprintf((char *)buf2, "%lu", n);
+ sprintf((char *)buf2, "%"VARNUMBER_FMT"u", n);
else if (pre == '0')
- sprintf((char *)buf2, "%lo", n);
+ sprintf((char *)buf2, "%"VARNUMBER_FMT"o", n);
else if (pre && hexupper)
- sprintf((char *)buf2, "%lX", n);
+ sprintf((char *)buf2, "%"VARNUMBER_FMT"X", n);
else
- sprintf((char *)buf2, "%lx", n);
+ sprintf((char *)buf2, "%"VARNUMBER_FMT"x", n);
length -= (int)STRLEN(buf2);
/*
@@ -6845,7 +6845,7 @@ clear_oparg(oparg_T *oap)
vim_memset(oap, 0, sizeof(oparg_T));
}
-static long line_count_info(char_u *line, long *wc, long *cc, long limit, int eol_size);
+static varnumber_T line_count_info(char_u *line, varnumber_T *wc, varnumber_T *cc, varnumber_T limit, int eol_size);
/*
* Count the number of bytes, characters and "words" in a line.
@@ -6861,17 +6861,17 @@ static long line_count_info(char_u *line
* case, eol_size will be added to the character count to account for
* the size of the EOL character.
*/
- static long
+ static varnumber_T
line_count_info(
char_u *line,
- long *wc,
- long *cc,
- long limit,
+ varnumber_T *wc,
+ varnumber_T *cc,
+ varnumber_T limit,
int eol_size)
{
- long i;
- long words = 0;
- long chars = 0;
+ varnumber_T i;
+ varnumber_T words = 0;
+ varnumber_T chars = 0;
int is_word = 0;
for (i = 0; i < limit && line[i] != NUL; )
@@ -6921,17 +6921,17 @@ cursor_pos_info(dict_T *dict)
char_u buf1[50];
char_u buf2[40];
linenr_T lnum;
- long byte_count = 0;
+ varnumber_T byte_count = 0;
#ifdef FEAT_MBYTE
- long bom_count = 0;
-#endif
- long byte_count_cursor = 0;
- long char_count = 0;
- long char_count_cursor = 0;
- long word_count = 0;
- long word_count_cursor = 0;
+ varnumber_T bom_count = 0;
+#endif
+ varnumber_T byte_count_cursor = 0;
+ varnumber_T char_count = 0;
+ varnumber_T char_count_cursor = 0;
+ varnumber_T word_count = 0;
+ varnumber_T word_count_cursor = 0;
int eol_size;
- long last_check = 100000L;
+ varnumber_T last_check = 100000L;
long line_count_selected = 0;
pos_T min_pos, max_pos;
oparg_T oparg;
@@ -7067,12 +7067,14 @@ cursor_pos_info(dict_T *dict)
byte_count_cursor = byte_count +
line_count_info(ml_get(lnum),
&word_count_cursor, &char_count_cursor,
- (long)(curwin->w_cursor.col + 1), eol_size);
+ (varnumber_T)(curwin->w_cursor.col + 1),
+ eol_size);
}
}
/* Add to the running totals */
byte_count += line_count_info(ml_get(lnum), &word_count,
- &char_count, (long)MAXCOL, eol_size);
+ &char_count, (varnumber_T)MAXCOL,
+ eol_size);
}
/* Correction for when last line doesn't have an EOL. */
@@ -7096,14 +7098,14 @@ cursor_pos_info(dict_T *dict)
if (char_count_cursor == byte_count_cursor
&& char_count == byte_count)
vim_snprintf((char *)IObuff, IOSIZE,
- _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Bytes"),
+ _("Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Bytes"),
buf1, line_count_selected,
(long)curbuf->b_ml.ml_line_count,
word_count_cursor, word_count,
byte_count_cursor, byte_count);
else
vim_snprintf((char *)IObuff, IOSIZE,
- _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Chars; %ld of %ld Bytes"),
+ _("Selected %s%ld of %ld Lines; %lld of %lld Words; %lld of %lld Chars; %lld of %lld Bytes"),
buf1, line_count_selected,
(long)curbuf->b_ml.ml_line_count,
word_count_cursor, word_count,
@@ -7122,7 +7124,7 @@ cursor_pos_info(dict_T *dict)
if (char_count_cursor == byte_count_cursor
&& char_count == byte_count)
vim_snprintf((char *)IObuff, IOSIZE,
- _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Byte %ld of %ld"),
+ _("Col %s of %s; Line %ld of %ld; Word %lld of %lld; Byte %lld of %lld"),
(char *)buf1, (char *)buf2,
(long)curwin->w_cursor.lnum,
(long)curbuf->b_ml.ml_line_count,
@@ -7130,7 +7132,7 @@ cursor_pos_info(dict_T *dict)
byte_count_cursor, byte_count);
else
vim_snprintf((char *)IObuff, IOSIZE,
- _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Char %ld of %ld; Byte %ld of %ld"),
+ _("Col %s of %s; Line %ld of %ld; Word %lld of %lld; Char %lld of %lld; Byte %lld of %lld"),
(char *)buf1, (char *)buf2,
(long)curwin->w_cursor.lnum,
(long)curbuf->b_ml.ml_line_count,
@@ -7158,19 +7160,19 @@ cursor_pos_info(dict_T *dict)
#if defined(FEAT_EVAL)
if (dict != NULL)
{
- dict_add_nr_str(dict, "words", (long)word_count, NULL);
- dict_add_nr_str(dict, "chars", (long)char_count, NULL);
- dict_add_nr_str(dict, "bytes", (long)byte_count
+ dict_add_nr_str(dict, "words", word_count, NULL);
+ dict_add_nr_str(dict, "chars", char_count, NULL);
+ dict_add_nr_str(dict, "bytes", byte_count
# ifdef FEAT_MBYTE
+ bom_count
# endif
, NULL);
dict_add_nr_str(dict, VIsual_active ? "visual_bytes" : "cursor_bytes",
- (long)byte_count_cursor, NULL);
+ byte_count_cursor, NULL);
dict_add_nr_str(dict, VIsual_active ? "visual_chars" : "cursor_chars",
- (long)char_count_cursor, NULL);
+ char_count_cursor, NULL);
dict_add_nr_str(dict, VIsual_active ? "visual_words" : "cursor_words",
- (long)word_count_cursor, NULL);
+ word_count_cursor, NULL);
}
#endif
}
diff --git a/src/option.c b/src/option.c
--- a/src/option.c
+++ b/src/option.c
@@ -4174,7 +4174,7 @@ do_set(
int afterchar; /* character just after option name */
int len;
int i;
- long value;
+ varnumber_T value;
int key;
long_u flags; /* flags for current option */
char_u *varp = NULL; /* pointer to variable for current option */
@@ -9100,7 +9100,7 @@ get_option_value(
if ((int *)varp == &curbuf->b_changed)
*numval = curbufIsChanged();
else
- *numval = *(int *)varp;
+ *numval = (long) *(varnumber_T *)varp;
}
return 1;
}
diff --git a/src/proto/charset.pro b/src/proto/charset.pro
--- a/src/proto/charset.pro
+++ b/src/proto/charset.pro
@@ -52,7 +52,7 @@ char_u *skiptowhite(char_u *p);
char_u *skiptowhite_esc(char_u *p);
long getdigits(char_u **pp);
int vim_isblankline(char_u *lbuf);
-void vim_str2nr(char_u *start, int *prep, int *len, int what, long *nptr, unsigned long *unptr, int maxlen);
+void vim_str2nr(char_u *start, int *prep, int *len, int what, varnumber_T *nptr, uvarnumber_T *unptr, int maxlen);
int hex2nr(int c);
int hexhex2nr(char_u *p);
int rem_backslash(char_u *str);
diff --git a/src/proto/eval.pro b/src/proto/eval.pro
--- a/src/proto/eval.pro
+++ b/src/proto/eval.pro
@@ -19,12 +19,12 @@ char_u *eval_to_string_skip(char_u *arg,
int skip_expr(char_u **pp);
char_u *eval_to_string(char_u *arg, char_u **nextcmd, int convert);
char_u *eval_to_string_safe(char_u *arg, char_u **nextcmd, int use_sandbox);
-int eval_to_number(char_u *expr);
+varnumber_T eval_to_number(char_u *expr);
list_T *eval_spell_expr(char_u *badword, char_u *expr);
int get_spellword(list_T *list, char_u **pp);
typval_T *eval_expr(char_u *arg, char_u **nextcmd);
int call_vim_function(char_u *func, int argc, char_u **argv, int safe, int str_arg_only, typval_T *rettv);
-long call_func_retnr(char_u *func, int argc, char_u **argv, int safe);
+varnumber_T call_func_retnr(char_u *func, int argc, char_u **argv, int safe);
void *call_func_retstr(char_u *func, int argc, char_u **argv, int safe);
void *call_func_retlist(char_u *func, int argc, char_u **argv, int safe);
void *save_funccal(void);
@@ -75,11 +75,11 @@ void dict_free(dict_T *d, int recurse);
dictitem_T *dictitem_alloc(char_u *key);
void dictitem_free(dictitem_T *item);
int dict_add(dict_T *d, dictitem_T *item);
-int dict_add_nr_str(dict_T *d, char *key, long nr, char_u *str);
+int dict_add_nr_str(dict_T *d, char *key, varnumber_T nr, char_u *str);
int dict_add_list(dict_T *d, char *key, list_T *list);
dictitem_T *dict_find(dict_T *d, char_u *key, int len);
char_u *get_dict_string(dict_T *d, char_u *key, int save);
-long get_dict_number(dict_T *d, char_u *key);
+varnumber_T get_dict_number(dict_T *d, char_u *key);
int string2float(char_u *text, float_T *value);
char_u *get_function_name(expand_T *xp, int idx);
char_u *get_expr_name(expand_T *xp, int idx);
@@ -92,8 +92,8 @@ void mzscheme_call_vim(char_u *name, typ
float_T vim_round(float_T f);
long do_searchpair(char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit);
char_u *get_callback(typval_T *arg, partial_T **pp);
-void set_vim_var_nr(int idx, long val);
-long get_vim_var_nr(int idx);
+void set_vim_var_nr(int idx, varnumber_T val);
+varnumber_T get_vim_var_nr(int idx);
char_u *get_vim_var_str(int idx);
list_T *get_vim_var_list(int idx);
void set_vim_var_char(int c);
@@ -108,8 +108,8 @@ char_u *set_cmdarg(exarg_T *eap, char_u
typval_T *alloc_tv(void);
void free_tv(typval_T *varp);
void clear_tv(typval_T *varp);
-long get_tv_number(typval_T *varp);
-long get_tv_number_chk(typval_T *varp, int *denote);
+varnumber_T get_tv_number(typval_T *varp);
+varnumber_T get_tv_number_chk(typval_T *varp, int *denote);
char_u *get_tv_string(typval_T *varp);
char_u *get_tv_string_buf(typval_T *varp, char_u *buf);
char_u *get_tv_string_chk(typval_T *varp);
diff --git a/src/quickfix.c b/src/quickfix.c
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -4057,11 +4057,11 @@ set_errorlist(
continue;
filename = get_dict_string(d, (char_u *)"filename", TRUE);
- bufnum = get_dict_number(d, (char_u *)"bufnr");
- lnum = get_dict_number(d, (char_u *)"lnum");
- col = get_dict_number(d, (char_u *)"col");
- vcol = get_dict_number(d, (char_u *)"vcol");
- nr = get_dict_number(d, (char_u *)"nr");
+ bufnum = (int)get_dict_number(d, (char_u *)"bufnr");
+ lnum = (int)get_dict_number(d, (char_u *)"lnum");
+ col = (int)get_dict_number(d, (char_u *)"col");
+ vcol = (int)get_dict_number(d, (char_u *)"vcol");
+ nr = (int)get_dict_number(d, (char_u *)"nr");
type = get_dict_string(d, (char_u *)"type", TRUE);
pattern = get_dict_string(d, (char_u *)"pattern", TRUE);
text = get_dict_string(d, (char_u *)"text", TRUE);
diff --git a/src/structs.h b/src/structs.h
--- a/src/structs.h
+++ b/src/structs.h
@@ -1101,11 +1101,34 @@ typedef struct hashtable_S
typedef long_u hash_T; /* Type for hi_hash */
-#if VIM_SIZEOF_INT <= 3 /* use long if int is smaller than 32 bits */
-typedef long varnumber_T;
+#ifdef FEAT_NUM64
+/* Use 64-bit Number. */
+# ifdef WIN3264
+typedef __int64 varnumber_T;
+typedef unsigned __int64 uvarnumber_T;
+# define VARNUMBER_FMT "I64"
+# elif defined(HAVE_STDINT_H)
+typedef int64_t varnumber_T;
+typedef uint64_t uvarnumber_T;
+# define VARNUMBER_FMT "ll"
+# else
+typedef long varnumber_T;
+typedef unsigned long uvarnumber_T;
+# define VARNUMBER_FMT "l"
+# endif
#else
-typedef int varnumber_T;
+/* Use 32-bit Number. */
+# if VIM_SIZEOF_INT <= 3 /* use long if int is smaller than 32 bits */
+typedef long varnumber_T;
+typedef unsigned long uvarnumber_T;
+# define VARNUMBER_FMT "l"
+# else
+typedef int varnumber_T;
+typedef unsigned int uvarnumber_T;
+# define VARNUMBER_FMT ""
+# endif
#endif
+
typedef double float_T;
typedef struct listvar_S list_T;
diff --git a/src/version.c b/src/version.c
--- a/src/version.c
+++ b/src/version.c
@@ -455,6 +455,11 @@ static char *(features[]) =
#else
"-netbeans_intg",
#endif
+#ifdef FEAT_NUM64
+ "+num64",
+#else
+ "-num64",
+#endif
#ifdef FEAT_GUI_W32
# ifdef FEAT_OLE
"+ole",