Hi,
2016/2/1 Mon 22:37:07 UTC+9 Ken Takata wrote:
> Hi,
>
> 2016/1/30 Sat 21:29:00 UTC+9 Bram Moolenaar wrote:
> > Ken Takata wrote:
> >
> > > 2016/1/25 Mon 8:13:42 UTC+9 Ken Takata wrote:
> > > > Hi,
> > > >
> > > > 2016/1/22 Fri 21:00:16 UTC+9 Ken Takata wrote:
> > > > > Hi,
> > > > >
> > > > > 2016/1/21 Thu 21:48:44 UTC+9 Ken Takata wrote:
> > > > > > Hi mattn and all,
> > > > > >
> > > > > > I think that supporting 64-bit Number (even on 32-bit systems) is
> > > > > > very useful.
> > > > > > One of the best examples is getfsize() as mattn said. 32-bit
> > > > > > Number is too
> > > > > > small to represent a filesize nowadays.
> > > > > >
> > > > > >
> > > > > > 2014/1/6 Mon 15:34:44 UTC+9 mattn wrote:
> > > > > > > https://gist.github.com/mattn/8278843
> > > > > > >
> > > > > > > This is in progress.
> > > > > >
> > > > > > I have updated mattn's patch:
> > > > > > https://bitbucket.org/k_takata/vim-ktakata-mq/src/fd966d51f56b69e02d9ebb984355f692b73b2260/num64.patch?at=default&fileviewer=file-view-default
> > > > > >
> > > > > > Changes are:
> > > > > >
> > > > > > * Sync with the latest codebase.
> > > > > > * VC9 or earlier doesn't have stdint.h, int64_t and uint64_t.
> > > > > > Use __int64 for old Windows compilers.
> > > > > > * Define FEAT_NUM64 in feature.h.
> > > > > > (If someone doesn't like this feature, s/he can disable this by
> > > > > > editing
> > > > > > feature.h.)
> > > > > > * Display +/-num64 in :version.
> > > > > > * Add has('num64').
> > > > > > * Adjust the behaviour when dividing by 0. (:help expr-/)
> > > > > > * Adjust the behaviour of float2nr().
> > > > > >
> > > > > > I confirmed that getfsize() returned a right value even if the
> > > > > > filesize was
> > > > > > over 2 GiB. (My largefile patches are also needed.)
> > > > > > I also confirmed that all existing tests passed.
> > > > > >
> > > > > > Of cause, more tests are needed, and documents should be updated.
> > > > > >
> > > > > > (See also: [patch] Always use long for vimscript Numbers
> > > > > > https://groups.google.com/d/topic/vim_dev/Ju0DDCqeuMc/discussion )
> > > > >
> > > > > I have updated the patch and divided it into two:
> > > > > https://bitbucket.org/k_takata/vim-ktakata-mq/src/ec8fa710e76975724c30d0f84c02e1460e5bb705/num64.patch?at=default&fileviewer=file-view-default
> > > > > https://bitbucket.org/k_takata/vim-ktakata-mq/src/ec8fa710e76975724c30d0f84c02e1460e5bb705/incdec64.patch?at=default&fileviewer=file-view-default
> > > > >
> > > > > If incdec64.patch is applied, incrementing/decrementing with
> > > > > <C-A>/<C-X> uses
> > > > > 64-bit integer on supported platforms. (Currently, 64-bit int is used
> > > > > on 64-bit
> > > > > Linux but not on 64-bit Windows.)
> > > >
> > > > I have updated the paches:
> > > > https://bitbucket.org/k_takata/vim-ktakata-mq/src/d1b6fe7c1f38ffc8d7fda03fda31d0dec6a5cbd1/num64.patch?fileviewer=file-view-default
> > > > https://bitbucket.org/k_takata/vim-ktakata-mq/src/d1b6fe7c1f38ffc8d7fda03fda31d0dec6a5cbd1/incdec64.patch?fileviewer=file-view-default
> > > >
> > > > Now, vim_snprintf() supports 64-bit formats (%lld, etc.).
> > >
> > > Here are the updated num64 patches for 7.4.1202 (including docs).
> > > Also available on my bitbucket repository:
> > > https://bitbucket.org/k_takata/vim-ktakata-mq/src
> >
> > Thanks. I'm going to change the function declarations today, this
> > probably means it's going to change again... After that everything will
> > be better!
>
> Here are the updated num64 patches.
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
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 9d8fda4afd85ff6667a407d5dabdc9e5fbf15bcf
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*
@@ -843,6 +845,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.
@@ -3380,8 +3387,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 >
@@ -7361,6 +7370,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/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
@@ -490,6 +490,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
@@ -1837,14 +1837,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] == '-')
@@ -1913,7 +1913,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;
@@ -1926,7 +1926,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;
@@ -1937,7 +1937,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;
@@ -1951,9 +1951,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
@@ -845,7 +845,7 @@ static int get_var_tv(char_u *name, int
static int handle_subscript(char_u **arg, typval_T *rettv, int evaluate, int verbose);
static typval_T *alloc_string_tv(char_u *string);
static void init_tv(typval_T *varp);
-static long get_tv_number(typval_T *varp);
+static varnumber_T get_tv_number(typval_T *varp);
#ifdef FEAT_FLOAT
static float_T get_tv_float(typval_T *varp);
#endif
@@ -1342,7 +1342,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;
@@ -1360,7 +1360,7 @@ eval_to_bool(
if (skip)
--emsg_skip;
- return retval;
+ return (int)retval;
}
/*
@@ -1485,11 +1485,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;
@@ -1594,7 +1594,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
@@ -1635,7 +1635,7 @@ call_vim_function(
typval_T *rettv)
{
typval_T *argvars;
- long n;
+ varnumber_T n;
int len;
int i;
int doesrange;
@@ -1701,7 +1701,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,
@@ -1709,7 +1709,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)
@@ -1846,7 +1846,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);
@@ -1881,7 +1881,7 @@ eval_foldexpr(char_u *arg, int *cp)
--sandbox;
--textlock;
- return retval;
+ return (int)retval;
}
#endif
@@ -3085,7 +3085,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;
@@ -4394,7 +4394,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];
regmatch_T regmatch;
@@ -4698,7 +4698,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
@@ -4883,7 +4883,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;
@@ -5004,12 +5004,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;
@@ -5063,7 +5072,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;
@@ -6355,7 +6364,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);
}
/*
@@ -7428,7 +7437,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;
@@ -7550,7 +7559,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;
@@ -11961,12 +11970,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
}
}
@@ -13803,6 +13821,9 @@ f_has(typval_T *argvars, typval_T *rettv
"mzscheme",
#endif
#endif
+#ifdef FEAT_NUM64
+ "num64",
+#endif
#ifdef FEAT_OLE
"ole",
#endif
@@ -17532,7 +17553,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;
}
@@ -17628,8 +17649,8 @@ f_screenattr(typval_T *argvars UNUSED, 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;
@@ -17649,8 +17670,8 @@ f_screenchar(typval_T *argvars UNUSED, 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;
@@ -19429,7 +19450,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)
@@ -19809,14 +19830,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)))
@@ -19840,7 +19861,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)
{
@@ -19928,7 +19949,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);
@@ -19946,8 +19967,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;
@@ -19959,7 +19980,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));
@@ -20006,8 +20027,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
@@ -20017,7 +20038,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))
@@ -20939,29 +20960,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);
@@ -21623,7 +21644,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;
}
@@ -21631,7 +21652,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;
@@ -22159,7 +22180,7 @@ init_tv(typval_T *varp)
* caller of incompatible types: it sets *denote to TRUE if "denote"
* is not NULL or returns -1 otherwise.
*/
- static long
+ static varnumber_T
get_tv_number(typval_T *varp)
{
int error = FALSE;
@@ -22167,15 +22188,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"));
@@ -22273,12 +22294,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;
@@ -22297,7 +22318,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);
}
/*
@@ -22343,7 +22364,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:
EMSG(_("E729: using Funcref as a String"));
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
@@ -5875,7 +5875,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
@@ -371,12 +371,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
@@ -188,8 +188,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;
@@ -523,7 +523,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)
@@ -582,7 +582,7 @@ json_decode_string(js_read_T *reader, ty
buf[(*mb_char2bytes)((int)nr, buf)] = NUL;
ga_concat(&ga, buf);
#else
- ga_append(&ga, nr);
+ ga_append(&ga, (int)nr);
#endif
}
break;
@@ -705,7 +705,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
@@ -3812,7 +3812,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);
@@ -3821,11 +3821,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)
@@ -3878,7 +3878,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()"));
}
@@ -4136,7 +4136,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++;
}
}
@@ -4265,6 +4269,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;
@@ -4309,6 +4319,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
@@ -4337,6 +4360,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
}
}
@@ -4381,17 +4416,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;
@@ -4412,6 +4457,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
@@ -4426,6 +4476,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
@@ -2718,7 +2718,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
@@ -4728,7 +4728,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;
@@ -5422,8 +5422,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;
@@ -5629,9 +5629,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)
{
@@ -5639,7 +5639,7 @@ do_addsub(
{
if (n > oldn)
{
- n = 1 + (n ^ (unsigned long)-1);
+ n = 1 + (n ^ (uvarnumber_T)-1);
negative ^= TRUE;
}
}
@@ -5648,7 +5648,7 @@ do_addsub(
/* add */
if (n < oldn)
{
- n = (n ^ (unsigned long)-1);
+ n = (n ^ (uvarnumber_T)-1);
negative ^= TRUE;
}
}
@@ -5724,7 +5724,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--)
@@ -5736,13 +5736,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);
/*
@@ -6835,7 +6835,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.
@@ -6851,17 +6851,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; )
@@ -6911,17 +6911,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;
@@ -7057,12 +7057,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. */
@@ -7086,14 +7088,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,
@@ -7112,7 +7114,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,
@@ -7120,7 +7122,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,
@@ -7148,19 +7150,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
@@ -4159,7 +4159,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 */
@@ -9085,7 +9085,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);
@@ -74,11 +74,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 channel_unref(channel_T *channel);
void job_stop_on_exit(void);
int string2float(char_u *text, float_T *value);
@@ -91,8 +91,8 @@ void job_check_ended(void);
void mzscheme_call_vim(char_u *name, typval_T *args, typval_T *rettv);
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);
-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);
@@ -107,7 +107,7 @@ 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_chk(typval_T *varp, int *denote);
+varnumber_T get_tv_number_chk(typval_T *varp, int *denote);
char_u *get_tv_string_chk(typval_T *varp);
char_u *get_tv_string_buf_chk(typval_T *varp, char_u *buf);
char_u *get_var_value(char_u *name);
diff --git a/src/quickfix.c b/src/quickfix.c
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -4003,11 +4003,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",