]> granicus.if.org Git - vim/commitdiff
patch 7.4.1976 v7.4.1976
authorBram Moolenaar <Bram@vim.org>
Fri, 1 Jul 2016 16:17:26 +0000 (18:17 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 1 Jul 2016 16:17:26 +0000 (18:17 +0200)
Problem:    Number variables are not 64 bits while they could be.
Solution:   Add the num64 feature. (Ken Takata)

23 files changed:
runtime/doc/eval.txt
runtime/doc/various.txt
src/Make_cyg_ming.mak
src/Make_mvc.mak
src/charset.c
src/eval.c
src/ex_cmds.c
src/ex_getln.c
src/feature.h
src/fileio.c
src/fold.c
src/json.c
src/message.c
src/misc1.c
src/misc2.c
src/ops.c
src/option.c
src/proto/charset.pro
src/proto/eval.pro
src/quickfix.c
src/structs.h
src/testdir/test_viml.vim
src/version.c

index 4d9df8936a7c952fb5ba87c0ab0d58d6b55cbd02..8be5ee49ad8e4f27edebbbd806f6b0c5aaa32382 100644 (file)
@@ -1,4 +1,4 @@
-*eval.txt*     For Vim version 7.4.  Last change: 2016 Jun 06
+*eval.txt*     For Vim version 7.4.  Last change: 2016 Jul 01
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -40,6 +40,8 @@ done, the features in this document are not available.        See |+eval| and
 There are nine types of variables:
 
 Number         A 32 or 64 bit signed number.  |expr-number| *Number*
+               64-bit Number is available only when compiled with the
+               |+num64| feature.
                Examples:  -123  0x10  0177
 
 Float          A floating point number. |floating-point-format| *Float*
@@ -888,6 +890,11 @@ When dividing a Number by zero the result depends on the value:
         <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.
@@ -3566,17 +3573,19 @@ 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  >
                        echo float2nr(-23.45)
 <                      -23  >
                        echo float2nr(1.0e100)
-<                      2147483647  >
+<                      2147483647  (or 9223372036854775807) >
                        echo float2nr(-1.0e150)
-<                      -2147483647  >
+<                      -2147483647 (or -9223372036854775807) >
                        echo float2nr(1.0e-100)
 <                      0
                {only available when compiled with the |+float| feature}
@@ -7655,7 +7664,10 @@ winwidth({nr})                                           *winwidth()*
   :if winwidth(0) <= 50
   :  exe "normal 50\<C-W>|"
   :endif
-<
+<               For getting the terminal or screen size, see the 'columns'
+               option.
+
+
 wordcount()                                            *wordcount()*
                The result is a dictionary of byte/chars/word statistics for
                the current buffer.  This is the same info as provided by
@@ -7842,6 +7854,7 @@ multi_lang                Compiled with support for multiple languages.
 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.
 packages               Compiled with |packages| support.
index 067ae6e6ff7ca5885f906718a2962ea75196ad9f..31f1a1bd7c962e2076f0beff5e64932221fdbeca 100644 (file)
@@ -390,6 +390,7 @@ N  *+multi_lang*    non-English language support |multi-lang|
 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  *+packages*         Loading |packages|
 N  *+path_extra*       Up/downwards search in 'path' and 'tags'
index 86bbc3e5863f278ffabcc9606449944e527395bc..490ae0b78a925877eb45a1df2c167e42c90240c5 100644 (file)
@@ -379,7 +379,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
index 5687f0999fc184192c53b48ca899318b88455b44..b1a643c426ed188e8a83b39e7f05d9735e9206ea 100644 (file)
@@ -501,6 +501,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)
index e008399e15939b03ece02975e9ca31f81dfa7bcc..9fcd88cb9e3e5973e9415b966dec40b183c1851e 100644 (file)
@@ -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;
index 59a767a0c3a0f6f3d7c61497836a95f46e65a9d3..41abe37d9fe6797ff7e3faff50bfa5989ae00fcc 100644 (file)
@@ -1376,7 +1376,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;
@@ -1394,7 +1394,7 @@ eval_to_bool(
     if (skip)
        --emsg_skip;
 
-    return retval;
+    return (int)retval;
 }
 
 /*
@@ -1519,11 +1519,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;
@@ -1628,7 +1628,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
 
@@ -1669,7 +1669,7 @@ call_vim_function(
     typval_T   *rettv)
 {
     typval_T   *argvars;
-    long       n;
+    varnumber_T        n;
     int                len;
     int                i;
     int                doesrange;
@@ -1735,7 +1735,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,
@@ -1743,7 +1743,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)
@@ -1880,7 +1880,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);
@@ -1915,7 +1915,7 @@ eval_foldexpr(char_u *arg, int *cp)
        --sandbox;
     --textlock;
 
-    return retval;
+    return (int)retval;
 }
 #endif
 
@@ -2480,7 +2480,7 @@ ex_let_one(
            c1 = *p;
            *p = NUL;
 
-           n = get_tv_number(tv);
+           n = (long)get_tv_number(tv);
            s = get_tv_string_chk(tv);      /* != NULL if number or string */
            if (s != NULL && op != NULL && *op != '=')
            {
@@ -2888,7 +2888,8 @@ get_lval(
                lp->ll_n1 = 0;
            else
            {
-               lp->ll_n1 = get_tv_number(&var1);   /* is number or string */
+               lp->ll_n1 = (long)get_tv_number(&var1);
+                                                   /* is number or string */
                clear_tv(&var1);
            }
            lp->ll_dict = NULL;
@@ -2919,7 +2920,8 @@ get_lval(
             */
            if (lp->ll_range && !lp->ll_empty2)
            {
-               lp->ll_n2 = get_tv_number(&var2);   /* is number or string */
+               lp->ll_n2 = (long)get_tv_number(&var2);
+                                                   /* is number or string */
                clear_tv(&var2);
                if (lp->ll_n2 < 0)
                {
@@ -3117,7 +3119,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;
 
@@ -4468,7 +4470,7 @@ eval4(char_u **arg, typval_T *rettv, int evaluate)
     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;
@@ -4766,7 +4768,7 @@ eval5(char_u **arg, typval_T *rettv, int evaluate)
     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
@@ -4951,7 +4953,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;
@@ -5072,12 +5074,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;
@@ -5131,7 +5142,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;
@@ -5356,7 +5367,7 @@ eval7(
     if (ret == OK && evaluate && end_leader > start_leader)
     {
        int         error = FALSE;
-       int         val = 0;
+       varnumber_T val = 0;
 #ifdef FEAT_FLOAT
        float_T     f = 0.0;
 
@@ -6525,7 +6536,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);
 }
 
 /*
@@ -7770,7 +7781,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;
@@ -7894,7 +7905,7 @@ get_dict_string(dict_T *d, char_u *key, int save)
  * 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;
@@ -9612,7 +9623,7 @@ f_argv(typval_T *argvars, typval_T *rettv)
 
     if (argvars[0].v_type != VAR_UNKNOWN)
     {
-       idx = get_tv_number_chk(&argvars[0], NULL);
+       idx = (int)get_tv_number_chk(&argvars[0], NULL);
        if (idx >= 0 && idx < ARGCOUNT)
            rettv->vval.v_string = vim_strsave(alist_name(&ARGLIST[idx]));
        else
@@ -10012,7 +10023,7 @@ f_browse(typval_T *argvars UNUSED, typval_T *rettv)
     char_u     buf2[NUMBUFLEN];
     int                error = FALSE;
 
-    save = get_tv_number_chk(&argvars[0], &error);
+    save = (int)get_tv_number_chk(&argvars[0], &error);
     title = get_tv_string_chk(&argvars[1]);
     initdir = get_tv_string_buf_chk(&argvars[2], buf);
     defname = get_tv_string_buf_chk(&argvars[3], buf2);
@@ -10290,7 +10301,7 @@ byteidx(typval_T *argvars, typval_T *rettv, int comp UNUSED)
     char_u     *t;
 #endif
     char_u     *str;
-    long       idx;
+    varnumber_T        idx;
 
     str = get_tv_string_chk(&argvars[0]);
     idx = get_tv_number_chk(&argvars[1], NULL);
@@ -10660,7 +10671,7 @@ f_char2nr(typval_T *argvars, typval_T *rettv)
        int     utf8 = 0;
 
        if (argvars[1].v_type != VAR_UNKNOWN)
-           utf8 = get_tv_number_chk(&argvars[1], NULL);
+           utf8 = (int)get_tv_number_chk(&argvars[1], NULL);
 
        if (utf8)
            rettv->vval.v_number = (*utf_ptr2char)(get_tv_string(&argvars[0]));
@@ -10783,7 +10794,7 @@ f_complete(typval_T *argvars, typval_T *rettv UNUSED)
        return;
     }
 
-    startcol = get_tv_number_chk(&argvars[0], NULL);
+    startcol = (int)get_tv_number_chk(&argvars[0], NULL);
     if (startcol <= 0)
        return;
 
@@ -10840,7 +10851,7 @@ f_confirm(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
            error = TRUE;
        if (argvars[2].v_type != VAR_UNKNOWN)
        {
-           def = get_tv_number_chk(&argvars[2], &error);
+           def = (int)get_tv_number_chk(&argvars[2], &error);
            if (argvars[3].v_type != VAR_UNKNOWN)
            {
                typestr = get_tv_string_buf_chk(&argvars[3], buf2);
@@ -10933,10 +10944,10 @@ f_count(typval_T *argvars, typval_T *rettv)
            {
                int error = FALSE;
 
-               ic = get_tv_number_chk(&argvars[2], &error);
+               ic = (int)get_tv_number_chk(&argvars[2], &error);
                if (argvars[3].v_type != VAR_UNKNOWN)
                {
-                   idx = get_tv_number_chk(&argvars[3], &error);
+                   idx = (long)get_tv_number_chk(&argvars[3], &error);
                    if (!error)
                    {
                        li = list_find(l, idx);
@@ -10965,7 +10976,7 @@ f_count(typval_T *argvars, typval_T *rettv)
 
            if (argvars[2].v_type != VAR_UNKNOWN)
            {
-               ic = get_tv_number_chk(&argvars[2], &error);
+               ic = (int)get_tv_number_chk(&argvars[2], &error);
                if (argvars[3].v_type != VAR_UNKNOWN)
                    EMSG(_(e_invarg));
            }
@@ -11055,10 +11066,10 @@ f_cursor(typval_T *argvars, typval_T *rettv)
     else
     {
        line = get_tv_lnum(argvars);
-       col = get_tv_number_chk(&argvars[1], NULL);
+       col = (long)get_tv_number_chk(&argvars[1], NULL);
 #ifdef FEAT_VIRTUALEDIT
        if (argvars[2].v_type != VAR_UNKNOWN)
-           coladd = get_tv_number_chk(&argvars[2], NULL);
+           coladd = (long)get_tv_number_chk(&argvars[2], NULL);
 #endif
     }
     if (line < 0 || col < 0
@@ -11096,7 +11107,7 @@ f_deepcopy(typval_T *argvars, typval_T *rettv)
     int                noref = 0;
 
     if (argvars[1].v_type != VAR_UNKNOWN)
-       noref = get_tv_number_chk(&argvars[1], NULL);
+       noref = (int)get_tv_number_chk(&argvars[1], NULL);
     if (noref < 0 || noref > 1)
        EMSG(_(e_invarg));
     else
@@ -11604,7 +11615,7 @@ f_extend(typval_T *argvars, typval_T *rettv)
        {
            if (argvars[2].v_type != VAR_UNKNOWN)
            {
-               before = get_tv_number_chk(&argvars[2], &error);
+               before = (long)get_tv_number_chk(&argvars[2], &error);
                if (error)
                    return;             /* type error; errmsg already given */
 
@@ -11807,7 +11818,7 @@ findfilendir(
                path = p;
 
            if (argvars[2].v_type != VAR_UNKNOWN)
-               count = get_tv_number_chk(&argvars[2], &error);
+               count = (int)get_tv_number_chk(&argvars[2], &error);
        }
     }
 
@@ -12043,12 +12054,21 @@ f_float2nr(typval_T *argvars, typval_T *rettv)
 
     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
     }
 }
 
@@ -12511,7 +12531,7 @@ f_get(typval_T *argvars, typval_T *rettv)
        {
            int         error = FALSE;
 
-           li = list_find(l, get_tv_number_chk(&argvars[1], &error));
+           li = list_find(l, (long)get_tv_number_chk(&argvars[1], &error));
            if (!error && li != NULL)
                tv = &li->li_tv;
        }
@@ -13333,9 +13353,9 @@ f_getreg(typval_T *argvars, typval_T *rettv)
        error = strregname == NULL;
        if (argvars[1].v_type != VAR_UNKNOWN)
        {
-           arg2 = get_tv_number_chk(&argvars[1], &error);
+           arg2 = (int)get_tv_number_chk(&argvars[1], &error);
            if (!error && argvars[2].v_type != VAR_UNKNOWN)
-               return_list = get_tv_number_chk(&argvars[2], &error);
+               return_list = (int)get_tv_number_chk(&argvars[2], &error);
        }
     }
     else
@@ -13558,7 +13578,7 @@ find_win_by_nr(
 #endif
     int                nr;
 
-    nr = get_tv_number_chk(vp, NULL);
+    nr = (int)get_tv_number_chk(vp, NULL);
 
 #ifdef FEAT_WINDOWS
     if (nr < 0)
@@ -13601,7 +13621,7 @@ find_tabwin(
     {
        if (tvp->v_type != VAR_UNKNOWN)
        {
-           n = get_tv_number(tvp);
+           n = (long)get_tv_number(tvp);
            if (n >= 0)
                tp = find_tabpage(n);
        }
@@ -14126,6 +14146,9 @@ f_has(typval_T *argvars, typval_T *rettv)
        "mzscheme",
 #endif
 #endif
+#ifdef FEAT_NUM64
+       "num64",
+#endif
 #ifdef FEAT_OLE
        "ole",
 #endif
@@ -14468,7 +14491,7 @@ f_hasmapto(typval_T *argvars, typval_T *rettv)
     {
        mode = get_tv_string_buf(&argvars[1], buf);
        if (argvars[2].v_type != VAR_UNKNOWN)
-           abbr = get_tv_number(&argvars[2]);
+           abbr = (int)get_tv_number(&argvars[2]);
     }
 
     if (map_to_exists(name, mode, abbr))
@@ -14696,10 +14719,10 @@ f_index(typval_T *argvars, typval_T *rettv)
 
            /* Start at specified item.  Use the cached index that list_find()
             * sets, so that a negative number also works. */
-           item = list_find(l, get_tv_number_chk(&argvars[2], &error));
+           item = list_find(l, (long)get_tv_number_chk(&argvars[2], &error));
            idx = l->lv_idx;
            if (argvars[3].v_type != VAR_UNKNOWN)
-               ic = get_tv_number_chk(&argvars[3], &error);
+               ic = (int)get_tv_number_chk(&argvars[3], &error);
            if (error)
                item = NULL;
        }
@@ -14983,7 +15006,7 @@ f_insert(typval_T *argvars, typval_T *rettv)
            && !tv_check_lock(l->lv_lock, (char_u *)N_("insert() argument"), TRUE))
     {
        if (argvars[2].v_type != VAR_UNKNOWN)
-           before = get_tv_number_chk(&argvars[2], &error);
+           before = (long)get_tv_number_chk(&argvars[2], &error);
        if (error)
            return;             /* type error; errmsg already given */
 
@@ -15588,9 +15611,9 @@ get_maparg(typval_T *argvars, typval_T *rettv, int exact)
        which = get_tv_string_buf_chk(&argvars[1], buf);
        if (argvars[2].v_type != VAR_UNKNOWN)
        {
-           abbr = get_tv_number(&argvars[2]);
+           abbr = (int)get_tv_number(&argvars[2]);
            if (argvars[3].v_type != VAR_UNKNOWN)
-               get_dict = get_tv_number(&argvars[3]);
+               get_dict = (int)get_tv_number(&argvars[3]);
        }
     }
     else
@@ -15781,7 +15804,7 @@ find_some_match(typval_T *argvars, typval_T *rettv, int type)
     {
        int         error = FALSE;
 
-       start = get_tv_number_chk(&argvars[2], &error);
+       start = (long)get_tv_number_chk(&argvars[2], &error);
        if (error)
            goto theend;
        if (l != NULL)
@@ -15810,7 +15833,7 @@ find_some_match(typval_T *argvars, typval_T *rettv, int type)
        }
 
        if (argvars[3].v_type != VAR_UNKNOWN)
-           nth = get_tv_number_chk(&argvars[3], &error);
+           nth = (long)get_tv_number_chk(&argvars[3], &error);
        if (error)
            goto theend;
     }
@@ -15969,10 +15992,10 @@ f_matchadd(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
        return;
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
-       prio = get_tv_number_chk(&argvars[2], &error);
+       prio = (int)get_tv_number_chk(&argvars[2], &error);
        if (argvars[3].v_type != VAR_UNKNOWN)
        {
-           id = get_tv_number_chk(&argvars[3], &error);
+           id = (int)get_tv_number_chk(&argvars[3], &error);
            if (argvars[4].v_type != VAR_UNKNOWN)
            {
                if (argvars[4].v_type != VAR_DICT)
@@ -16032,10 +16055,10 @@ f_matchaddpos(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
-       prio = get_tv_number_chk(&argvars[2], &error);
+       prio = (int)get_tv_number_chk(&argvars[2], &error);
        if (argvars[3].v_type != VAR_UNKNOWN)
        {
-           id = get_tv_number_chk(&argvars[3], &error);
+           id = (int)get_tv_number_chk(&argvars[3], &error);
            if (argvars[4].v_type != VAR_UNKNOWN)
            {
                if (argvars[4].v_type != VAR_DICT)
@@ -16074,7 +16097,7 @@ f_matcharg(typval_T *argvars UNUSED, typval_T *rettv)
     if (rettv_list_alloc(rettv) == OK)
     {
 #ifdef FEAT_SEARCH_EXTRA
-       int         id = get_tv_number(&argvars[0]);
+       int         id = (int)get_tv_number(&argvars[0]);
        matchitem_T *m;
 
        if (id >= 1 && id <= 3)
@@ -16148,8 +16171,8 @@ static void max_min(typval_T *argvars, typval_T *rettv, int domax);
     static void
 max_min(typval_T *argvars, typval_T *rettv, int domax)
 {
-    long       n = 0;
-    long       i;
+    varnumber_T        n = 0;
+    varnumber_T        i;
     int                error = FALSE;
 
     if (argvars[0].v_type == VAR_LIST)
@@ -16285,7 +16308,7 @@ f_mkdir(typval_T *argvars, typval_T *rettv)
        if (argvars[1].v_type != VAR_UNKNOWN)
        {
            if (argvars[2].v_type != VAR_UNKNOWN)
-               prot = get_tv_number_chk(&argvars[2], NULL);
+               prot = (int)get_tv_number_chk(&argvars[2], NULL);
            if (prot != -1 && STRCMP(get_tv_string(&argvars[1]), "p") == 0)
                mkdir_recurse(dir, prot);
        }
@@ -16428,7 +16451,7 @@ f_nr2char(typval_T *argvars, typval_T *rettv)
        int     utf8 = 0;
 
        if (argvars[1].v_type != VAR_UNKNOWN)
-           utf8 = get_tv_number_chk(&argvars[1], NULL);
+           utf8 = (int)get_tv_number_chk(&argvars[1], NULL);
        if (utf8)
            buf[(*utf_char2bytes)((int)get_tv_number(&argvars[0]), buf)] = NUL;
        else
@@ -16610,10 +16633,10 @@ f_pyeval(typval_T *argvars, typval_T *rettv)
     static void
 f_range(typval_T *argvars, typval_T *rettv)
 {
-    long       start;
-    long       end;
-    long       stride = 1;
-    long       i;
+    varnumber_T        start;
+    varnumber_T        end;
+    varnumber_T        stride = 1;
+    varnumber_T        i;
     int                error = FALSE;
 
     start = get_tv_number_chk(&argvars[0], &error);
@@ -16671,7 +16694,7 @@ f_readfile(typval_T *argvars, typval_T *rettv)
        if (STRCMP(get_tv_string(&argvars[1]), "b") == 0)
            binary = TRUE;
        if (argvars[2].v_type != VAR_UNKNOWN)
-           maxline = get_tv_number(&argvars[2]);
+           maxline = (long)get_tv_number(&argvars[2]);
     }
 
     if (rettv_list_alloc(rettv) == FAIL)
@@ -17244,7 +17267,7 @@ f_remove(typval_T *argvars, typval_T *rettv)
     {
        int         error = FALSE;
 
-       idx = get_tv_number_chk(&argvars[1], &error);
+       idx = (long)get_tv_number_chk(&argvars[1], &error);
        if (error)
            ;           /* type error: do nothing, errmsg already given */
        else if ((item = list_find(l, idx)) == NULL)
@@ -17261,7 +17284,7 @@ f_remove(typval_T *argvars, typval_T *rettv)
            else
            {
                /* Remove range of items, return list with values. */
-               end = get_tv_number_chk(&argvars[2], &error);
+               end = (long)get_tv_number_chk(&argvars[2], &error);
                if (error)
                    ;           /* type error: do nothing */
                else if ((item2 = list_find(l, end)) == NULL)
@@ -17325,7 +17348,7 @@ f_repeat(typval_T *argvars, typval_T *rettv)
     char_u     *r;
     int                i;
 
-    n = get_tv_number(&argvars[1]);
+    n = (int)get_tv_number(&argvars[1]);
     if (argvars[0].v_type == VAR_LIST)
     {
        if (rettv_list_alloc(rettv) == OK && argvars[0].vval.v_list != NULL)
@@ -17696,13 +17719,13 @@ search_cmn(typval_T *argvars, pos_T *match_pos, int *flagsp)
     /* Optional arguments: line number to stop searching and timeout. */
     if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN)
     {
-       lnum_stop = get_tv_number_chk(&argvars[2], NULL);
+       lnum_stop = (long)get_tv_number_chk(&argvars[2], NULL);
        if (lnum_stop < 0)
            goto theend;
 #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;
        }
@@ -17798,8 +17821,8 @@ f_screenattr(typval_T *argvars, typval_T *rettv)
     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;
@@ -17819,8 +17842,8 @@ f_screenchar(typval_T *argvars, typval_T *rettv)
     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;
@@ -17884,9 +17907,9 @@ f_searchdecl(typval_T *argvars, typval_T *rettv)
     name = get_tv_string_chk(&argvars[0]);
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-       locally = get_tv_number_chk(&argvars[1], &error) == 0;
+       locally = (int)get_tv_number_chk(&argvars[1], &error) == 0;
        if (!error && argvars[2].v_type != VAR_UNKNOWN)
-           thisblock = get_tv_number_chk(&argvars[2], &error) != 0;
+           thisblock = (int)get_tv_number_chk(&argvars[2], &error) != 0;
     }
     if (!error && name != NULL)
        rettv->vval.v_number = find_decl(name, (int)STRLEN(name),
@@ -17946,13 +17969,13 @@ searchpair_cmn(typval_T *argvars, pos_T *match_pos)
        skip = get_tv_string_buf_chk(&argvars[4], nbuf3);
        if (argvars[5].v_type != VAR_UNKNOWN)
        {
-           lnum_stop = get_tv_number_chk(&argvars[5], NULL);
+           lnum_stop = (long)get_tv_number_chk(&argvars[5], NULL);
            if (lnum_stop < 0)
                goto theend;
 #ifdef FEAT_RELTIME
            if (argvars[6].v_type != VAR_UNKNOWN)
            {
-               time_limit = get_tv_number_chk(&argvars[6], NULL);
+               time_limit = (long)get_tv_number_chk(&argvars[6], NULL);
                if (time_limit < 0)
                    goto theend;
            }
@@ -18267,7 +18290,7 @@ f_setbufvar(typval_T *argvars, typval_T *rettv UNUSED)
            int         error = FALSE;
 
            ++varname;
-           numval = get_tv_number_chk(varp, &error);
+           numval = (long)get_tv_number_chk(varp, &error);
            strval = get_tv_string_buf_chk(varp, nbuf);
            if (!error && strval != NULL)
                set_option_value(varname, numval, strval, OPT_LOCAL);
@@ -18323,7 +18346,7 @@ f_setcharsearch(typval_T *argvars, typval_T *rettv UNUSED)
 
        di = dict_find(d, (char_u *)"forward", -1);
        if (di != NULL)
-           set_csearch_direction(get_tv_number(&di->di_tv)
+           set_csearch_direction((int)get_tv_number(&di->di_tv)
                                                        ? FORWARD : BACKWARD);
 
        di = dict_find(d, (char_u *)"until", -1);
@@ -18916,7 +18939,7 @@ setwinvar(typval_T *argvars, typval_T *rettv UNUSED, int off)
                int             error = FALSE;
 
                ++varname;
-               numval = get_tv_number_chk(varp, &error);
+               numval = (long)get_tv_number_chk(varp, &error);
                strval = get_tv_string_buf_chk(varp, nbuf);
                if (!error && strval != NULL)
                    set_option_value(varname, numval, strval, OPT_LOCAL);
@@ -19083,8 +19106,8 @@ item_compare(const void *s1, const void *s2)
 
     if (sortinfo->item_compare_numbers)
     {
-       long    v1 = get_tv_number(tv1);
-       long    v2 = get_tv_number(tv2);
+       varnumber_T     v1 = get_tv_number(tv1);
+       varnumber_T     v2 = get_tv_number(tv2);
 
        return v1 == v2 ? 0 : v1 > v2 ? 1 : -1;
     }
@@ -19190,7 +19213,7 @@ item_compare2(const void *s1, const void *s2)
     if (res == FAIL)
        res = ITEM_COMPARE_FAIL;
     else
-       res = get_tv_number_chk(&rettv, &sortinfo->item_compare_func_err);
+       res = (int)get_tv_number_chk(&rettv, &sortinfo->item_compare_func_err);
     if (sortinfo->item_compare_func_err)
        res = ITEM_COMPARE_FAIL;  /* return value has wrong type */
     clear_tv(&rettv);
@@ -19259,7 +19282,7 @@ do_sort_uniq(typval_T *argvars, typval_T *rettv, int sort)
            {
                int         error = FALSE;
 
-               i = get_tv_number_chk(&argvars[1], &error);
+               i = (long)get_tv_number_chk(&argvars[1], &error);
                if (error)
                    goto theend;        /* type error; errmsg already given */
                if (i == 1)
@@ -19516,12 +19539,12 @@ f_spellsuggest(typval_T *argvars UNUSED, typval_T *rettv)
        str = get_tv_string(&argvars[0]);
        if (argvars[1].v_type != VAR_UNKNOWN)
        {
-           maxcount = get_tv_number_chk(&argvars[1], &typeerr);
+           maxcount = (int)get_tv_number_chk(&argvars[1], &typeerr);
            if (maxcount <= 0)
                return;
            if (argvars[2].v_type != VAR_UNKNOWN)
            {
-               need_capital = get_tv_number_chk(&argvars[2], &typeerr);
+               need_capital = (int)get_tv_number_chk(&argvars[2], &typeerr);
                if (typeerr)
                    return;
            }
@@ -19576,7 +19599,7 @@ f_split(typval_T *argvars, typval_T *rettv)
        if (pat == NULL)
            typeerr = TRUE;
        if (argvars[2].v_type != VAR_UNKNOWN)
-           keepempty = get_tv_number_chk(&argvars[2], &typeerr);
+           keepempty = (int)get_tv_number_chk(&argvars[2], &typeerr);
     }
     if (pat == NULL || *pat == NUL)
        pat = (char_u *)"[\\x01- ]\\+";
@@ -19669,12 +19692,12 @@ f_str2nr(typval_T *argvars, typval_T *rettv)
 {
     int                base = 10;
     char_u     *p;
-    long       n;
+    varnumber_T        n;
     int                what;
 
     if (argvars[1].v_type != VAR_UNKNOWN)
     {
-       base = get_tv_number(&argvars[1]);
+       base = (int)get_tv_number(&argvars[1]);
        if (base != 2 && base != 8 && base != 10 && base != 16)
        {
            EMSG(_(e_invarg));
@@ -19772,7 +19795,7 @@ f_strgetchar(typval_T *argvars, typval_T *rettv)
     if (str == NULL)
        return;
     len = (int)STRLEN(str);
-    charidx = get_tv_number_chk(&argvars[1], &error);
+    charidx = (int)get_tv_number_chk(&argvars[1], &error);
     if (error)
        return;
 #ifdef FEAT_MBYTE
@@ -19819,7 +19842,7 @@ f_stridx(typval_T *argvars, typval_T *rettv)
     {
        int         error = FALSE;
 
-       start_idx = get_tv_number_chk(&argvars[2], &error);
+       start_idx = (int)get_tv_number_chk(&argvars[2], &error);
        if (error || start_idx >= (int)STRLEN(haystack))
            return;
        if (start_idx >= 0)
@@ -19872,7 +19895,7 @@ f_strchars(typval_T *argvars, typval_T *rettv)
 #endif
 
     if (argvars[1].v_type != VAR_UNKNOWN)
-       skipcc = get_tv_number_chk(&argvars[1], NULL);
+       skipcc = (int)get_tv_number_chk(&argvars[1], NULL);
     if (skipcc < 0 || skipcc > 1)
        EMSG(_(e_invarg));
     else
@@ -19901,7 +19924,7 @@ f_strdisplaywidth(typval_T *argvars, typval_T *rettv)
     int                col = 0;
 
     if (argvars[1].v_type != VAR_UNKNOWN)
-       col = get_tv_number(&argvars[1]);
+       col = (int)get_tv_number(&argvars[1]);
 
     rettv->vval.v_number = (varnumber_T)(linetabsize_col(col, s) - col);
 }
@@ -19941,7 +19964,7 @@ f_strcharpart(typval_T *argvars, typval_T *rettv)
     p = get_tv_string(&argvars[0]);
     slen = (int)STRLEN(p);
 
-    nchar = get_tv_number_chk(&argvars[1], &error);
+    nchar = (int)get_tv_number_chk(&argvars[1], &error);
     if (!error)
     {
        if (nchar > 0)
@@ -19954,7 +19977,7 @@ f_strcharpart(typval_T *argvars, typval_T *rettv)
            nbyte = nchar;
        if (argvars[2].v_type != VAR_UNKNOWN)
        {
-           charlen = get_tv_number(&argvars[2]);
+           charlen = (int)get_tv_number(&argvars[2]);
            while (charlen > 0 && nbyte + len < slen)
            {
                int off = nbyte + len;
@@ -20008,11 +20031,11 @@ f_strpart(typval_T *argvars, typval_T *rettv)
     p = get_tv_string(&argvars[0]);
     slen = (int)STRLEN(p);
 
-    n = get_tv_number_chk(&argvars[1], &error);
+    n = (int)get_tv_number_chk(&argvars[1], &error);
     if (error)
        len = 0;
     else if (argvars[2].v_type != VAR_UNKNOWN)
-       len = get_tv_number(&argvars[2]);
+       len = (int)get_tv_number(&argvars[2]);
     else
        len = slen - n;     /* default len: all bytes that are available. */
 
@@ -20060,7 +20083,7 @@ f_strridx(typval_T *argvars, typval_T *rettv)
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
        /* Third argument: upper limit for index */
-       end_idx = get_tv_number_chk(&argvars[2], NULL);
+       end_idx = (int)get_tv_number_chk(&argvars[2], NULL);
        if (end_idx < 0)
            return;     /* can never find a match */
     }
@@ -20114,7 +20137,7 @@ f_submatch(typval_T *argvars, typval_T *rettv)
        return;
     error = FALSE;
     if (argvars[1].v_type != VAR_UNKNOWN)
-       retList = get_tv_number_chk(&argvars[1], &error);
+       retList = (int)get_tv_number_chk(&argvars[1], &error);
     if (error)
        return;
 
@@ -20160,14 +20183,14 @@ f_synID(typval_T *argvars UNUSED, typval_T *rettv)
 {
     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)))
@@ -20191,7 +20214,7 @@ f_synIDattr(typval_T *argvars UNUSED, typval_T *rettv)
     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)
     {
@@ -20275,7 +20298,7 @@ f_synIDtrans(typval_T *argvars UNUSED, typval_T *rettv)
     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);
@@ -20293,8 +20316,8 @@ f_synIDtrans(typval_T *argvars UNUSED, typval_T *rettv)
 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;
@@ -20306,7 +20329,7 @@ f_synconcealed(typval_T *argvars UNUSED, typval_T *rettv)
 
 #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));
 
@@ -20353,8 +20376,8 @@ f_synconcealed(typval_T *argvars UNUSED, typval_T *rettv)
 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
@@ -20364,7 +20387,7 @@ f_synstack(typval_T *argvars UNUSED, typval_T *rettv)
 
 #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))
@@ -20835,7 +20858,7 @@ f_test_alloc_fail(typval_T *argvars, typval_T *rettv UNUSED)
     static void
 f_test_disable_char_avail(typval_T *argvars, typval_T *rettv UNUSED)
 {
-    disable_char_avail_for_testing = get_tv_number(&argvars[0]);
+    disable_char_avail_for_testing = (int)get_tv_number(&argvars[0]);
 }
 
 /*
@@ -20933,7 +20956,7 @@ get_callback(typval_T *arg, partial_T **pp)
     static void
 f_timer_start(typval_T *argvars, typval_T *rettv)
 {
-    long    msec = get_tv_number(&argvars[0]);
+    long    msec = (long)get_tv_number(&argvars[0]);
     timer_T *timer;
     int            repeat = 0;
     char_u  *callback;
@@ -20980,7 +21003,7 @@ f_timer_stop(typval_T *argvars, typval_T *rettv UNUSED)
          EMSG(_(e_number_exp));
          return;
     }
-    timer = find_timer(get_tv_number(&argvars[0]));
+    timer = find_timer((int)get_tv_number(&argvars[0]));
     if (timer != NULL)
        stop_timer(timer);
 }
@@ -21436,29 +21459,29 @@ f_winrestview(typval_T *argvars, typval_T *rettv UNUSED)
     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);
@@ -22120,7 +22143,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;
 }
@@ -22128,7 +22151,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;
@@ -22742,7 +22765,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;
@@ -22750,15 +22773,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"));
@@ -22858,12 +22881,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;
@@ -22882,7 +22905,7 @@ get_tv_lnum_buf(typval_T *argvars, buf_T *buf)
            && 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);
 }
 
 /*
@@ -22928,7 +22951,8 @@ get_tv_string_buf_chk(typval_T *varp, char_u *buf)
     switch (varp->v_type)
     {
        case VAR_NUMBER:
-           sprintf((char *)buf, "%ld", (long)varp->vval.v_number);
+           vim_snprintf((char *)buf, NUMBUFLEN, "%lld",
+                                           (varnumber_T)varp->vval.v_number);
            return buf;
        case VAR_FUNC:
        case VAR_PARTIAL:
index 088e1ac1358104ffc30671aa36adbe5c362620f7..e7b3b2865b41161c43dbb80157e9bf961a048495 100644 (file)
@@ -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
index fc0d995a86d13052a36f1749643ea23a4931810f..36902e5c53e3a76c34f7830c887ab7fe8d02bf12 100644 (file)
@@ -6005,7 +6005,7 @@ get_list_range(char_u **str, int *num1, int *num2)
 {
     int                len;
     int                first = FALSE;
-    long       num;
+    varnumber_T        num;
 
     *str = skipwhite(*str);
     if (**str == '-' || vim_isdigit(**str))  /* parse "from" part of range */
index 54f665f40ac823aa17c5b3ae418d7c2d46c92747..2a090ab589b4daf484358eb72c2b6535988e6d67 100644 (file)
  * +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
 
 /*
index 130419032994e0efcf3c55bab9b0393ba12037a9..621281e850a11cae0454fa4e072b8019d8521283 100644 (file)
@@ -9481,7 +9481,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);
index e4c7f412e0d249fb25d4dfc734395c269573f226..35ceceb4ad106ae9c5ff243c16d6ddbed6ab302b 100644 (file)
@@ -3032,7 +3032,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)
index aa168ec117f7a04fd2d3e0cc9188e5560dd4d49d..89c2fd25457c4fbe59902ba2bbe10fc4e98cd7b5 100644 (file)
@@ -201,8 +201,8 @@ json_encode_item(garray_T *gap, typval_T *val, int copyID, int options)
            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;
 
@@ -538,7 +538,7 @@ json_decode_string(js_read_T *reader, typval_T *res)
     int                len;
     char_u     *p;
     int                c;
-    long       nr;
+    varnumber_T        nr;
 
     if (res != NULL)
        ga_init2(&ga, 1, 200);
@@ -600,7 +600,7 @@ json_decode_string(js_read_T *reader, typval_T *res)
                            && (int)(reader->js_end - p) >= 6
                            && *p == '\\' && *(p+1) == 'u')
                    {
-                       long    nr2 = 0;
+                       varnumber_T     nr2 = 0;
 
                        /* decode surrogate pair: \ud812\u3456 */
                        len = 0;
@@ -620,7 +620,7 @@ json_decode_string(js_read_T *reader, typval_T *res)
                        buf[utf_char2bytes((int)nr, buf)] = NUL;
                        ga_concat(&ga, buf);
 #else
-                       ga_append(&ga, nr);
+                       ga_append(&ga, (int)nr);
 #endif
                    }
                    break;
@@ -766,7 +766,7 @@ json_decode_item(js_read_T *reader, typval_T *res, int options)
                else
 #endif
                {
-                   long nr;
+                   varnumber_T nr;
 
                    vim_str2nr(reader->js_buf + reader->js_used,
                            NULL, &len, 0, /* what */
index 5bd602784fe6269b95d23fdbd917ca2f9466d229..b86c88675096390e05773569b564ef69d9a4830b 100644 (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
                            }
                        }
 
index 82522b5cfb10149fff05c4e0b8df7915845c925a..b5394a410d35287dc21b7698c92a19637ec8b9fc 100644 (file)
@@ -9169,7 +9169,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;
index 2dd89f98d963286cfdd90cc86f3328c33ec8c543..4ed715b420d684097d6614d2a27aa5abec99477e 100644 (file)
@@ -2719,7 +2719,7 @@ find_special_key(
     int                modifiers;
     int                bit;
     int                key;
-    unsigned long n;
+    uvarnumber_T       n;
     int                l;
 
     src = *srcp;
index 8d62ed0b9d2970d6cb464615b5bad98f66791142..1767eb521e308708200f78888f20465bee07bc1c 100644 (file)
--- a/src/ops.c
+++ b/src/ops.c
@@ -1179,9 +1179,9 @@ stuff_yank(int regname, char_u *p)
 static int execreg_lastc = NUL;
 
 /*
- * execute a yank register: copy it into the stuff buffer
+ * Execute a yank register: copy it into the stuff buffer.
  *
- * return FAIL for failure, OK otherwise
+ * Return FAIL for failure, OK otherwise.
  */
     int
 do_execreg(
@@ -4755,7 +4755,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;
 
@@ -5449,8 +5449,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;
@@ -5708,9 +5708,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)
        {
@@ -5718,7 +5718,7 @@ do_addsub(
            {
                if (n > oldn)
                {
-                   n = 1 + (n ^ (unsigned long)-1);
+                   n = 1 + (n ^ (uvarnumber_T)-1);
                    negative ^= TRUE;
                }
            }
@@ -5727,7 +5727,7 @@ do_addsub(
                /* add */
                if (n < oldn)
                {
-                   n = (n ^ (unsigned long)-1);
+                   n = (n ^ (uvarnumber_T)-1);
                    negative ^= TRUE;
                }
            }
@@ -5803,7 +5803,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--)
@@ -5815,13 +5815,13 @@ do_addsub(
            buf2[i] = '\0';
        }
        else if (pre == 0)
-           sprintf((char *)buf2, "%lu", n);
+           vim_snprintf((char *)buf2, NUMBUFLEN, "%llu", n);
        else if (pre == '0')
-           sprintf((char *)buf2, "%lo", n);
+           vim_snprintf((char *)buf2, NUMBUFLEN, "%llo", n);
        else if (pre && hexupper)
-           sprintf((char *)buf2, "%lX", n);
+           vim_snprintf((char *)buf2, NUMBUFLEN, "%llX", n);
        else
-           sprintf((char *)buf2, "%lx", n);
+           vim_snprintf((char *)buf2, NUMBUFLEN, "%llx", n);
        length -= (int)STRLEN(buf2);
 
        /*
@@ -7086,7 +7086,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.
@@ -7102,17 +7102,17 @@ static long     line_count_info(char_u *line, long *wc, long *cc, long limit, int eo
  *  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; )
@@ -7162,17 +7162,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;
+    varnumber_T        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        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;
@@ -7308,12 +7308,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. */
@@ -7337,14 +7339,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,
@@ -7363,7 +7365,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,
@@ -7371,7 +7373,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,
@@ -7399,19 +7401,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
 }
index 80bd867a1fc5a9cd47f110a35593449548d66efb..47bbe733b1271cb7a71eff69d96f54ed25a4da41 100644 (file)
@@ -4179,7 +4179,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 */
@@ -9102,7 +9102,7 @@ get_option_value(
        if ((int *)varp == &curbuf->b_changed)
            *numval = curbufIsChanged();
        else
-           *numval = *(int *)varp;
+           *numval = (long) *(varnumber_T *)varp;
     }
     return 1;
 }
index 7b4961d704f83a335d4009d3015690be52bac0d4..52b741a740850e5505779b9e8a7e041c8382df75 100644 (file)
@@ -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);
index 60fad80634f7e6902e6f14e75dcaf4666b58d7e5..4ff063e72cd51083a862fbfa4c323610347c4333 100644 (file)
@@ -19,12 +19,12 @@ char_u *eval_to_string_skip(char_u *arg, char_u **nextcmd, int skip);
 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);
@@ -76,11 +76,11 @@ void dict_free(dict_T *d);
 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, 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);
 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 *oldarg);
 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);
index 19801e31ec9f1bb7a9396830bea8c99f733be5ea..b7760252f6ad1564aa2a0847b540fb8f4a9b6ee1 100644 (file)
@@ -4377,11 +4377,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);
index e4d36519841c71dc170a93237ecab913347ad16c..9d19c3c89f856164053f2ca88d02f3d72db92f71 100644 (file)
@@ -1111,11 +1111,29 @@ 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;
+# elif defined(HAVE_STDINT_H)
+typedef int64_t                    varnumber_T;
+typedef uint64_t           uvarnumber_T;
+# else
+typedef long               varnumber_T;
+typedef unsigned long      uvarnumber_T;
+# 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;
+# else
+typedef int                varnumber_T;
+typedef unsigned int       uvarnumber_T;
+# endif
 #endif
+
 typedef double float_T;
 
 typedef struct listvar_S list_T;
index f1dde4b93d2f3cd9ac4418758237b281acb75cd3..85baf12e41e41be92029f3cc9c5cd5d28cb6483a 100644 (file)
@@ -1196,6 +1196,34 @@ func Test_echo_and_string()
 
 endfunc
 
+"-------------------------------------------------------------------------------
+" Test 94:  64-bit Numbers                                         {{{1
+"-------------------------------------------------------------------------------
+
+func Test_num64()
+    if !has('num64')
+       return
+    endif
+
+    call assert_notequal( 4294967296, 0)
+    call assert_notequal(-4294967296, 0)
+    call assert_equal( 4294967296,  0xFFFFffff + 1)
+    call assert_equal(-4294967296, -0xFFFFffff - 1)
+
+    call assert_equal( 9223372036854775807,  1 / 0)
+    call assert_equal(-9223372036854775807, -1 / 0)
+    call assert_equal(-9223372036854775808,  0 / 0)
+
+    call assert_equal( 0x7FFFffffFFFFffff, float2nr( 1.0e150))
+    call assert_equal(-0x7FFFffffFFFFffff, float2nr(-1.0e150))
+
+    let rng = range(0xFFFFffff, 0x100000001)
+    call assert_equal([0xFFFFffff, 0x100000000, 0x100000001], rng)
+    call assert_equal(0x100000001, max(rng))
+    call assert_equal(0xFFFFffff, min(rng))
+    call assert_equal(rng, sort(range(0x100000001, 0xFFFFffff, -1), 'N'))
+endfunc
+
 "-------------------------------------------------------------------------------
 " Modelines                                                                {{{1
 " vim: ts=8 sw=4 tw=80 fdm=marker
index 8a57ba8833d4eed969ec06e05fc7d454e41666f8..78ea040eda74bac4baa488287e7ca1eb66f9d48c 100644 (file)
@@ -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",
@@ -753,6 +758,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1976,
 /**/
     1975,
 /**/