Patch 8.2.2928
Problem:    The evalfunc.c file is too big.
Solution:   Move float related functionality to a separate file. (Yegappan
            Lakshmanan, closes #8287)
Files:      Filelist, src/Make_ami.mak, src/Make_cyg_ming.mak,
            src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
            src/eval.c, src/evalfunc.c, src/float.c, src/proto.h,
            src/proto/eval.pro, src/proto/float.pro


*** ../vim-8.2.2927/Filelist    2021-05-24 18:48:00.756582853 +0200
--- Filelist    2021-06-02 16:53:34.790373298 +0200
***************
*** 68,73 ****
--- 68,74 ----
                src/fileio.c \
                src/filepath.c \
                src/findfile.c \
+               src/float.c \
                src/fold.c \
                src/getchar.c \
                src/globals.h \
***************
*** 246,251 ****
--- 247,253 ----
                src/proto/fileio.pro \
                src/proto/filepath.pro \
                src/proto/findfile.pro \
+               src/proto/float.pro \
                src/proto/fold.pro \
                src/proto/getchar.pro \
                src/proto/gui.pro \
*** ../vim-8.2.2927/src/Make_ami.mak    2020-09-09 20:41:21.588337124 +0200
--- src/Make_ami.mak    2021-06-02 16:53:34.790373298 +0200
***************
*** 117,122 ****
--- 117,123 ----
        fileio.c \
        filepath.c \
        findfile.c \
+       float.c \
        fold.c \
        getchar.c \
        hardcopy.c \
*** ../vim-8.2.2927/src/Make_cyg_ming.mak       2021-05-24 18:48:00.756582853 
+0200
--- src/Make_cyg_ming.mak       2021-06-02 16:53:34.790373298 +0200
***************
*** 749,754 ****
--- 749,755 ----
        $(OUTDIR)/fileio.o \
        $(OUTDIR)/filepath.o \
        $(OUTDIR)/findfile.o \
+       $(OUTDIR)/float.o \
        $(OUTDIR)/fold.o \
        $(OUTDIR)/getchar.o \
        $(OUTDIR)/gui_xim.o \
*** ../vim-8.2.2927/src/Make_mvc.mak    2021-05-24 18:48:00.756582853 +0200
--- src/Make_mvc.mak    2021-06-02 16:53:34.790373298 +0200
***************
*** 743,748 ****
--- 743,749 ----
        $(OUTDIR)\fileio.obj \
        $(OUTDIR)\filepath.obj \
        $(OUTDIR)\findfile.obj \
+       $(OUTDIR)\float.obj \
        $(OUTDIR)\fold.obj \
        $(OUTDIR)\getchar.obj \
        $(OUTDIR)\gui_xim.obj \
***************
*** 1599,1604 ****
--- 1600,1607 ----
  
  $(OUTDIR)/findfile.obj:       $(OUTDIR) findfile.c  $(INCL)
  
+ $(OUTDIR)/float.obj:  $(OUTDIR) float.c  $(INCL)
+ 
  $(OUTDIR)/fold.obj:   $(OUTDIR) fold.c  $(INCL)
  
  $(OUTDIR)/getchar.obj:        $(OUTDIR) getchar.c  $(INCL)
***************
*** 1935,1940 ****
--- 1938,1944 ----
        proto/fileio.pro \
        proto/filepath.pro \
        proto/findfile.pro \
+       proto/float.pro \
        proto/getchar.pro \
        proto/gui_xim.pro \
        proto/hardcopy.pro \
*** ../vim-8.2.2927/src/Make_vms.mms    2021-01-04 10:47:21.698153964 +0100
--- src/Make_vms.mms    2021-06-02 16:53:34.790373298 +0200
***************
*** 343,348 ****
--- 343,349 ----
        fileio.c \
        filepath.c, \
        findfile.c \
+       float.c \
        fold.c \
        getchar.c \
        gui_xim.c \
***************
*** 460,465 ****
--- 461,467 ----
        fileio.obj \
        filepath.obj \
        findfile.obj \
+       float.obj \
        fold.obj \
        getchar.obj \
        gui_xim.obj \
***************
*** 860,865 ****
--- 862,870 ----
   ascii.h keymap.h term.h macros.h structs.h regexp.h \
   gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
   errors.h globals.h
+ float.obj : float.c vim.h [.auto]config.h feature.h os_unix.h   \
+  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
+  [.proto]gui_beval.pro option.h ex_cmds.h proto.h errors.h globals.h
  fold.obj : fold.c vim.h [.auto]config.h feature.h os_unix.h   \
   ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
   [.proto]gui_beval.pro option.h ex_cmds.h proto.h errors.h globals.h
*** ../vim-8.2.2927/src/Makefile        2021-01-30 20:31:57.683115306 +0100
--- src/Makefile        2021-06-02 17:06:31.812471779 +0200
***************
*** 386,392 ****
  # Select the architecture supported.  Default is to build for the current
  # platform.  Use "both" for a universal binary.  That probably doesn't work
  # when including Perl, Python, etc.
! #CONF_OPT_DARWIN = --with-mac-arch=i386
  #CONF_OPT_DARWIN = --with-mac-arch=ppc
  #CONF_OPT_DARWIN = --with-mac-arch=both
  
--- 386,393 ----
  # Select the architecture supported.  Default is to build for the current
  # platform.  Use "both" for a universal binary.  That probably doesn't work
  # when including Perl, Python, etc.
! # NOTE: ppc probably doesn't work anymore,
! #CONF_OPT_DARWIN = --with-mac-arch=intel
  #CONF_OPT_DARWIN = --with-mac-arch=ppc
  #CONF_OPT_DARWIN = --with-mac-arch=both
  
***************
*** 436,441 ****
--- 437,444 ----
  # PYTHON
  # Uncomment lines here when you want to include the Python interface.
  # This requires at least "normal" features, "tiny" and "small" don't work.
+ # Python 3 is preferred, Python 2 (often referred to as "Python") has been
+ # deprecated for a long time.
  # NOTE: This may cause threading to be enabled, which has side effects (such
  # as using different libraries and debugging becomes more difficult).
  # For Python3 support make a symbolic link in /usr/local/bin:
***************
*** 463,469 ****
  # TCL
  # Uncomment this when you want to include the Tcl interface.
  # First one is for static linking, second one for dynamic loading.
! #CONF_OPT_TCL = --enable-tclinterp
  #CONF_OPT_TCL = --enable-tclinterp=dynamic
  #CONF_OPT_TCL = --enable-tclinterp --with-tclsh=tclsh8.4
  
--- 466,472 ----
  # TCL
  # Uncomment this when you want to include the Tcl interface.
  # First one is for static linking, second one for dynamic loading.
! CONF_OPT_TCL = --enable-tclinterp
  #CONF_OPT_TCL = --enable-tclinterp=dynamic
  #CONF_OPT_TCL = --enable-tclinterp --with-tclsh=tclsh8.4
  
***************
*** 690,705 ****
  # PROFILE_CFLAGS=-g -O0 --coverage -DWE_ARE_PROFILING -DUSE_GCOV_FLUSH
  
  
! # Uncomment one of the next two lines to compile Vim with the
! # address sanitizer (asan) or with the undefined sanitizer.  Works with gcc.
  # May make Vim twice as slow.  Errors are reported on stderr.
  # More at: https://code.google.com/p/address-sanitizer/
  # Useful environment variables:
  # $ export ASAN_OPTIONS="print_stacktrace=1 log_path=asan"
  # $ export LSAN_OPTIONS="suppressions=`pwd`/testdir/lsan-suppress.txt"
  # When running tests output can be found in testdir/asan.*
! #SANITIZER_CFLAGS = -g -O0 -fsanitize=address -fno-omit-frame-pointer
! #SANITIZER_CFLAGS = -g -O0 -fsanitize=undefined -fno-omit-frame-pointer
  
  # Similarly when compiling with clang and using ubsan.
  # $ export UBSAN_OPTIONS="print_stacktrace=1 log_path=ubsan"
--- 693,710 ----
  # PROFILE_CFLAGS=-g -O0 --coverage -DWE_ARE_PROFILING -DUSE_GCOV_FLUSH
  
  
! # Uncomment the next lines to compile Vim with the address sanitizer (asan) 
and
! # with the undefined sanitizer.  Works with gcc.
! # You should also use -DEXITFREE to avoid false reports.
  # May make Vim twice as slow.  Errors are reported on stderr.
  # More at: https://code.google.com/p/address-sanitizer/
  # Useful environment variables:
  # $ export ASAN_OPTIONS="print_stacktrace=1 log_path=asan"
  # $ export LSAN_OPTIONS="suppressions=`pwd`/testdir/lsan-suppress.txt"
  # When running tests output can be found in testdir/asan.*
! #SANITIZER_CFLAGS = -g -O0 -fsanitize-recover=all \
! #                -fsanitize=address -fsanitize=undefined \
! #                -fno-omit-frame-pointer
  
  # Similarly when compiling with clang and using ubsan.
  # $ export UBSAN_OPTIONS="print_stacktrace=1 log_path=ubsan"
***************
*** 979,985 ****
  
  # The value of QUOTESED comes from auto/config.mk.
  # Uncomment the next line to use the default value.
! # QUOTESED = sed -e 's/[\\"]/\\&/g' -e 's/\\"/"/' -e 's/\\";$$/";/'
  
  ##################### end of system specific lines ################### }}}
  
--- 984,990 ----
  
  # The value of QUOTESED comes from auto/config.mk.
  # Uncomment the next line to use the default value.
! # QUOTESED = sed -e 's/[\\"]/\\&/g' -e 's/\\"/"/' -e 's/\\";$$/";/' -e 's/  
*/ /g'
  
  ##################### end of system specific lines ################### }}}
  
***************
*** 1621,1626 ****
--- 1626,1632 ----
        fileio.c \
        filepath.c \
        findfile.c \
+       float.c \
        fold.c \
        getchar.c \
        gui_xim.c \
***************
*** 1775,1780 ****
--- 1781,1787 ----
        objects/fileio.o \
        objects/filepath.o \
        objects/findfile.o \
+       objects/float.o \
        objects/fold.o \
        objects/getchar.o \
        objects/gui_xim.o \
***************
*** 1945,1950 ****
--- 1952,1958 ----
        fileio.pro \
        filepath.pro \
        findfile.pro \
+       float.pro \
        fold.pro \
        getchar.pro \
        gui_xim.pro \
***************
*** 3247,3252 ****
--- 3255,3263 ----
  objects/findfile.o: findfile.c
        $(CCC) -o $@ findfile.c
  
+ objects/float.o: float.c
+       $(CCC) -o $@ float.c
+ 
  objects/fold.o: fold.c
        $(CCC) -o $@ fold.c
  
***************
*** 3838,3843 ****
--- 3849,3858 ----
   auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
   proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
   proto.h errors.h globals.h
+ objects/float.o: float.c vim.h protodef.h auto/config.h feature.h \
+  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
+  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
+  proto.h errors.h globals.h
  objects/fold.o: fold.c vim.h protodef.h auto/config.h feature.h os_unix.h \
   auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
   proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
*** ../vim-8.2.2927/src/README.md       2020-07-22 19:10:59.877072059 +0200
--- src/README.md       2021-06-02 16:53:34.790373298 +0200
***************
*** 56,61 ****
--- 56,62 ----
  map.c         | mapping and abbreviations
  mark.c                | marks
  match.c               | highlight matching
+ float.c               | floating point functions
  mbyte.c               | multi-byte character handling
  memfile.c     | storing lines for buffers in a swapfile
  memline.c     | storing lines for buffers in memory
*** ../vim-8.2.2927/src/eval.c  2021-06-02 14:56:35.819997074 +0200
--- src/eval.c  2021-06-02 16:53:34.794373287 +0200
***************
*** 5155,5197 ****
      return s;
  }
  
- #if defined(FEAT_FLOAT) || defined(PROTO)
- /*
-  * Convert the string "text" to a floating point number.
-  * This uses strtod().  setlocale(LC_NUMERIC, "C") has been used to make sure
-  * this always uses a decimal point.
-  * Returns the length of the text that was consumed.
-  */
-     int
- string2float(
-     char_u    *text,
-     float_T   *value)     // result stored here
- {
-     char      *s = (char *)text;
-     float_T   f;
- 
-     // MS-Windows does not deal with "inf" and "nan" properly.
-     if (STRNICMP(text, "inf", 3) == 0)
-     {
-       *value = INFINITY;
-       return 3;
-     }
-     if (STRNICMP(text, "-inf", 3) == 0)
-     {
-       *value = -INFINITY;
-       return 4;
-     }
-     if (STRNICMP(text, "nan", 3) == 0)
-     {
-       *value = NAN;
-       return 3;
-     }
-     f = strtod(s, &s);
-     *value = f;
-     return (int)((char_u *)s - text);
- }
- #endif
- 
  /*
   * Convert the specified byte index of line 'lnum' in buffer 'buf' to a
   * character index.  Works only for loaded buffers. Returns -1 on failure.
--- 5155,5160 ----
*** ../vim-8.2.2927/src/evalfunc.c      2021-06-02 14:56:35.823997065 +0200
--- src/evalfunc.c      2021-06-02 16:53:34.794373287 +0200
***************
*** 20,35 ****
  # include <float.h>
  #endif
  
- #ifdef FEAT_FLOAT
- static void f_abs(typval_T *argvars, typval_T *rettv);
- static void f_acos(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_and(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_FLOAT
- static void f_asin(typval_T *argvars, typval_T *rettv);
- static void f_atan(typval_T *argvars, typval_T *rettv);
- static void f_atan2(typval_T *argvars, typval_T *rettv);
- #endif
  #ifdef FEAT_BEVAL
  static void f_balloon_gettext(typval_T *argvars, typval_T *rettv);
  static void f_balloon_show(typval_T *argvars, typval_T *rettv);
--- 20,26 ----
***************
*** 42,50 ****
  static void f_byteidx(typval_T *argvars, typval_T *rettv);
  static void f_byteidxcomp(typval_T *argvars, typval_T *rettv);
  static void f_call(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_FLOAT
- static void f_ceil(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_changenr(typval_T *argvars, typval_T *rettv);
  static void f_char2nr(typval_T *argvars, typval_T *rettv);
  static void f_charcol(typval_T *argvars, typval_T *rettv);
--- 33,38 ----
***************
*** 52,61 ****
  static void f_col(typval_T *argvars, typval_T *rettv);
  static void f_confirm(typval_T *argvars, typval_T *rettv);
  static void f_copy(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_FLOAT
- static void f_cos(typval_T *argvars, typval_T *rettv);
- static void f_cosh(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_cursor(typval_T *argsvars, typval_T *rettv);
  #ifdef MSWIN
  static void f_debugbreak(typval_T *argvars, typval_T *rettv);
--- 40,45 ----
***************
*** 70,86 ****
  static void f_eventhandler(typval_T *argvars, typval_T *rettv);
  static void f_execute(typval_T *argvars, typval_T *rettv);
  static void f_exists(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_FLOAT
- static void f_exp(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_expand(typval_T *argvars, typval_T *rettv);
  static void f_expandcmd(typval_T *argvars, typval_T *rettv);
  static void f_feedkeys(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_FLOAT
- static void f_float2nr(typval_T *argvars, typval_T *rettv);
- static void f_floor(typval_T *argvars, typval_T *rettv);
- static void f_fmod(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_fnameescape(typval_T *argvars, typval_T *rettv);
  static void f_foreground(typval_T *argvars, typval_T *rettv);
  static void f_funcref(typval_T *argvars, typval_T *rettv);
--- 54,62 ----
***************
*** 118,137 ****
  static void f_interrupt(typval_T *argvars, typval_T *rettv);
  static void f_invert(typval_T *argvars, typval_T *rettv);
  static void f_islocked(typval_T *argvars, typval_T *rettv);
- #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H)
- static void f_isinf(typval_T *argvars, typval_T *rettv);
- static void f_isnan(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_last_buffer_nr(typval_T *argvars, typval_T *rettv);
  static void f_len(typval_T *argvars, typval_T *rettv);
  static void f_libcall(typval_T *argvars, typval_T *rettv);
  static void f_libcallnr(typval_T *argvars, typval_T *rettv);
  static void f_line(typval_T *argvars, typval_T *rettv);
  static void f_line2byte(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_FLOAT
- static void f_log(typval_T *argvars, typval_T *rettv);
- static void f_log10(typval_T *argvars, typval_T *rettv);
- #endif
  #ifdef FEAT_LUA
  static void f_luaeval(typval_T *argvars, typval_T *rettv);
  #endif
--- 94,105 ----
***************
*** 153,161 ****
  #ifdef FEAT_PERL
  static void f_perleval(typval_T *argvars, typval_T *rettv);
  #endif
- #ifdef FEAT_FLOAT
- static void f_pow(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_prevnonblank(typval_T *argvars, typval_T *rettv);
  static void f_printf(typval_T *argvars, typval_T *rettv);
  static void f_pum_getpos(typval_T *argvars, typval_T *rettv);
--- 121,126 ----
***************
*** 176,184 ****
  static void f_reg_recording(typval_T *argvars, typval_T *rettv);
  static void f_rename(typval_T *argvars, typval_T *rettv);
  static void f_repeat(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_FLOAT
- static void f_round(typval_T *argvars, typval_T *rettv);
- #endif
  #ifdef FEAT_RUBY
  static void f_rubyeval(typval_T *argvars, typval_T *rettv);
  #endif
--- 141,146 ----
***************
*** 206,226 ****
  #endif
  static void f_shellescape(typval_T *argvars, typval_T *rettv);
  static void f_shiftwidth(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_FLOAT
- static void f_sin(typval_T *argvars, typval_T *rettv);
- static void f_sinh(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_soundfold(typval_T *argvars, typval_T *rettv);
  static void f_spellbadword(typval_T *argvars, typval_T *rettv);
  static void f_spellsuggest(typval_T *argvars, typval_T *rettv);
  static void f_split(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_FLOAT
- static void f_sqrt(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_srand(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_FLOAT
- static void f_str2float(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_str2list(typval_T *argvars, typval_T *rettv);
  static void f_str2nr(typval_T *argvars, typval_T *rettv);
  static void f_strcharlen(typval_T *argvars, typval_T *rettv);
--- 168,178 ----
***************
*** 246,262 ****
  static void f_tabpagebuflist(typval_T *argvars, typval_T *rettv);
  static void f_taglist(typval_T *argvars, typval_T *rettv);
  static void f_tagfiles(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_FLOAT
- static void f_tan(typval_T *argvars, typval_T *rettv);
- static void f_tanh(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_tolower(typval_T *argvars, typval_T *rettv);
  static void f_toupper(typval_T *argvars, typval_T *rettv);
  static void f_tr(typval_T *argvars, typval_T *rettv);
  static void f_trim(typval_T *argvars, typval_T *rettv);
- #ifdef FEAT_FLOAT
- static void f_trunc(typval_T *argvars, typval_T *rettv);
- #endif
  static void f_type(typval_T *argvars, typval_T *rettv);
  static void f_virtcol(typval_T *argvars, typval_T *rettv);
  static void f_visualmode(typval_T *argvars, typval_T *rettv);
--- 198,207 ----
***************
*** 2194,2263 ****
                && *argvars[0].vval.v_string != NUL));
  }
  
- #ifdef FEAT_FLOAT
- /*
-  * Get the float value of "argvars[0]" into "f".
-  * Returns FAIL when the argument is not a Number or Float.
-  */
-     static int
- get_float_arg(typval_T *argvars, float_T *f)
- {
-     if (argvars[0].v_type == VAR_FLOAT)
-     {
-       *f = argvars[0].vval.v_float;
-       return OK;
-     }
-     if (argvars[0].v_type == VAR_NUMBER)
-     {
-       *f = (float_T)argvars[0].vval.v_number;
-       return OK;
-     }
-     emsg(_("E808: Number or Float required"));
-     return FAIL;
- }
- 
- /*
-  * "abs(expr)" function
-  */
-     static void
- f_abs(typval_T *argvars, typval_T *rettv)
- {
-     if (argvars[0].v_type == VAR_FLOAT)
-     {
-       rettv->v_type = VAR_FLOAT;
-       rettv->vval.v_float = fabs(argvars[0].vval.v_float);
-     }
-     else
-     {
-       varnumber_T     n;
-       int             error = FALSE;
- 
-       n = tv_get_number_chk(&argvars[0], &error);
-       if (error)
-           rettv->vval.v_number = -1;
-       else if (n > 0)
-           rettv->vval.v_number = n;
-       else
-           rettv->vval.v_number = -n;
-     }
- }
- 
- /*
-  * "acos()" function
-  */
-     static void
- f_acos(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = acos(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
  /*
   * "and(expr, expr)" function
   */
--- 2139,2144 ----
***************
*** 2268,2321 ****
                                        & tv_get_number_chk(&argvars[1], NULL);
  }
  
- #ifdef FEAT_FLOAT
- /*
-  * "asin()" function
-  */
-     static void
- f_asin(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = asin(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- 
- /*
-  * "atan()" function
-  */
-     static void
- f_atan(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = atan(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- 
- /*
-  * "atan2()" function
-  */
-     static void
- f_atan2(typval_T *argvars, typval_T *rettv)
- {
-     float_T   fx = 0.0, fy = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &fx) == OK
-                                    && get_float_arg(&argvars[1], &fy) == OK)
-       rettv->vval.v_float = atan2(fx, fy);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
  /*
   * "balloon_show()" function
   */
--- 2149,2154 ----
***************
*** 2518,2540 ****
      (void)func_call(func, &argvars[1], partial, selfdict, rettv);
  }
  
- #ifdef FEAT_FLOAT
- /*
-  * "ceil({float})" function
-  */
-     static void
- f_ceil(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = ceil(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
  /*
   * "changenr()" function
   */
--- 2351,2356 ----
***************
*** 2772,2809 ****
      item_copy(&argvars[0], rettv, FALSE, 0);
  }
  
- #ifdef FEAT_FLOAT
- /*
-  * "cos()" function
-  */
-     static void
- f_cos(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = cos(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- 
- /*
-  * "cosh()" function
-  */
-     static void
- f_cosh(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = cosh(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
  /*
   * Set the cursor position.
   * If 'charcol' is TRUE, then use the column number as a character offset.
--- 2588,2593 ----
***************
*** 3351,3373 ****
      rettv->vval.v_number = n;
  }
  
- #ifdef FEAT_FLOAT
- /*
-  * "exp()" function
-  */
-     static void
- f_exp(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = exp(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
  /*
   * "expand()" function
   */
--- 3135,3140 ----
***************
*** 3578,3635 ****
      }
  }
  
- #ifdef FEAT_FLOAT
- /*
-  * "float2nr({float})" function
-  */
-     static void
- f_float2nr(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     if (get_float_arg(argvars, &f) == OK)
-     {
-       if (f <= (float_T)-VARNUM_MAX + DBL_EPSILON)
-           rettv->vval.v_number = -VARNUM_MAX;
-       else if (f >= (float_T)VARNUM_MAX - DBL_EPSILON)
-           rettv->vval.v_number = VARNUM_MAX;
-       else
-           rettv->vval.v_number = (varnumber_T)f;
-     }
- }
- 
- /*
-  * "floor({float})" function
-  */
-     static void
- f_floor(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = floor(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- 
- /*
-  * "fmod()" function
-  */
-     static void
- f_fmod(typval_T *argvars, typval_T *rettv)
- {
-     float_T   fx = 0.0, fy = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &fx) == OK
-                                    && get_float_arg(&argvars[1], &fy) == OK)
-       rettv->vval.v_float = fmod(fx, fy);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
  /*
   * "fnameescape({string})" function
   */
--- 3345,3350 ----
***************
*** 6262,6289 ****
      clear_lval(&lv);
  }
  
- #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H)
- /*
-  * "isinf()" function
-  */
-     static void
- f_isinf(typval_T *argvars, typval_T *rettv)
- {
-     if (argvars[0].v_type == VAR_FLOAT && isinf(argvars[0].vval.v_float))
-       rettv->vval.v_number = argvars[0].vval.v_float > 0.0 ? 1 : -1;
- }
- 
- /*
-  * "isnan()" function
-  */
-     static void
- f_isnan(typval_T *argvars, typval_T *rettv)
- {
-     rettv->vval.v_number = argvars[0].v_type == VAR_FLOAT
-                                           && isnan(argvars[0].vval.v_float);
- }
- #endif
- 
  /*
   * "last_buffer_nr()" function.
   */
--- 5977,5982 ----
***************
*** 6456,6493 ****
  #endif
  }
  
- #ifdef FEAT_FLOAT
- /*
-  * "log()" function
-  */
-     static void
- f_log(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = log(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- 
- /*
-  * "log10()" function
-  */
-     static void
- f_log10(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = log10(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
  #ifdef FEAT_LUA
  /*
   * "luaeval()" function
--- 6149,6154 ----
***************
*** 7008,7031 ****
  }
  #endif
  
- #ifdef FEAT_FLOAT
- /*
-  * "pow()" function
-  */
-     static void
- f_pow(typval_T *argvars, typval_T *rettv)
- {
-     float_T   fx = 0.0, fy = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &fx) == OK
-                                    && get_float_arg(&argvars[1], &fy) == OK)
-       rettv->vval.v_float = pow(fx, fy);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
  /*
   * "prevnonblank()" function
   */
--- 6669,6674 ----
***************
*** 7780,7812 ****
      return retval;
  }
  
- #ifdef FEAT_FLOAT
- 
- /*
-  * round() is not in C90, use ceil() or floor() instead.
-  */
-     float_T
- vim_round(float_T f)
- {
-     return f > 0 ? floor(f + 0.5) : ceil(f - 0.5);
- }
- 
- /*
-  * "round({float})" function
-  */
-     static void
- f_round(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = vim_round(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
  #ifdef FEAT_RUBY
  /*
   * "rubyeval()" function
--- 7423,7428 ----
***************
*** 8790,8827 ****
      rettv->vval.v_number = get_sw_value(curbuf);
  }
  
- #ifdef FEAT_FLOAT
- /*
-  * "sin()" function
-  */
-     static void
- f_sin(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = sin(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- 
- /*
-  * "sinh()" function
-  */
-     static void
- f_sinh(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = sinh(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
  /*
   * "soundfold({word})" function
   */
--- 8406,8411 ----
***************
*** 9072,9113 ****
      p_cpo = save_cpo;
  }
  
- #ifdef FEAT_FLOAT
- /*
-  * "sqrt()" function
-  */
-     static void
- f_sqrt(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = sqrt(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
- #ifdef FEAT_FLOAT
- /*
-  * "str2float()" function
-  */
-     static void
- f_str2float(typval_T *argvars, typval_T *rettv)
- {
-     char_u *p = skipwhite(tv_get_string(&argvars[0]));
-     int     isneg = (*p == '-');
- 
-     if (*p == '+' || *p == '-')
-       p = skipwhite(p + 1);
-     (void)string2float(p, &rettv->vval.v_float);
-     if (isneg)
-       rettv->vval.v_float *= -1;
-     rettv->v_type = VAR_FLOAT;
- }
- #endif
- 
  /*
   * "str2list()" function
   */
--- 8656,8661 ----
***************
*** 9949,9986 ****
        (void)get_tags(rettv->vval.v_list, tag_pattern, fname);
  }
  
- #ifdef FEAT_FLOAT
- /*
-  * "tan()" function
-  */
-     static void
- f_tan(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = tan(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- 
- /*
-  * "tanh()" function
-  */
-     static void
- f_tanh(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       rettv->vval.v_float = tanh(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
  /*
   * "tolower(string)" function
   */
--- 9497,9502 ----
***************
*** 10205,10228 ****
      rettv->vval.v_string = vim_strnsave(head, tail - head);
  }
  
- #ifdef FEAT_FLOAT
- /*
-  * "trunc({float})" function
-  */
-     static void
- f_trunc(typval_T *argvars, typval_T *rettv)
- {
-     float_T   f = 0.0;
- 
-     rettv->v_type = VAR_FLOAT;
-     if (get_float_arg(argvars, &f) == OK)
-       // trunc() is not in C90, use floor() or ceil() instead.
-       rettv->vval.v_float = f > 0 ? floor(f) : ceil(f);
-     else
-       rettv->vval.v_float = 0.0;
- }
- #endif
- 
  /*
   * "type(expr)" function
   */
--- 9721,9726 ----
*** ../vim-8.2.2927/src/float.c 2021-06-02 17:06:48.632431131 +0200
--- src/float.c 2021-06-02 17:01:02.225271317 +0200
***************
*** 0 ****
--- 1,477 ----
+ /* vi:set ts=8 sts=4 sw=4 noet:
+  *
+  * VIM - Vi IMproved  by Bram Moolenaar
+  *
+  * Do ":help uganda"  in Vim to read copying and usage conditions.
+  * Do ":help credits" in Vim to see a list of people who contributed.
+  * See README.txt for an overview of the Vim source code.
+  */
+ 
+ /*
+  * float.c: Floating point functions
+  */
+ #define USING_FLOAT_STUFF
+ 
+ #include "vim.h"
+ 
+ #if (defined(FEAT_EVAL) && defined(FEAT_FLOAT)) || defined(PROTO)
+ 
+ #ifdef VMS
+ # include <float.h>
+ #endif
+ 
+ /*
+  * Convert the string "text" to a floating point number.
+  * This uses strtod().  setlocale(LC_NUMERIC, "C") has been used to make sure
+  * this always uses a decimal point.
+  * Returns the length of the text that was consumed.
+  */
+     int
+ string2float(
+     char_u    *text,
+     float_T   *value)     // result stored here
+ {
+     char      *s = (char *)text;
+     float_T   f;
+ 
+     // MS-Windows does not deal with "inf" and "nan" properly.
+     if (STRNICMP(text, "inf", 3) == 0)
+     {
+       *value = INFINITY;
+       return 3;
+     }
+     if (STRNICMP(text, "-inf", 3) == 0)
+     {
+       *value = -INFINITY;
+       return 4;
+     }
+     if (STRNICMP(text, "nan", 3) == 0)
+     {
+       *value = NAN;
+       return 3;
+     }
+     f = strtod(s, &s);
+     *value = f;
+     return (int)((char_u *)s - text);
+ }
+ 
+ /*
+  * Get the float value of "argvars[0]" into "f".
+  * Returns FAIL when the argument is not a Number or Float.
+  */
+     static int
+ get_float_arg(typval_T *argvars, float_T *f)
+ {
+     if (argvars[0].v_type == VAR_FLOAT)
+     {
+       *f = argvars[0].vval.v_float;
+       return OK;
+     }
+     if (argvars[0].v_type == VAR_NUMBER)
+     {
+       *f = (float_T)argvars[0].vval.v_number;
+       return OK;
+     }
+     emsg(_("E808: Number or Float required"));
+     return FAIL;
+ }
+ 
+ /*
+  * "abs(expr)" function
+  */
+     void
+ f_abs(typval_T *argvars, typval_T *rettv)
+ {
+     if (argvars[0].v_type == VAR_FLOAT)
+     {
+       rettv->v_type = VAR_FLOAT;
+       rettv->vval.v_float = fabs(argvars[0].vval.v_float);
+     }
+     else
+     {
+       varnumber_T     n;
+       int             error = FALSE;
+ 
+       n = tv_get_number_chk(&argvars[0], &error);
+       if (error)
+           rettv->vval.v_number = -1;
+       else if (n > 0)
+           rettv->vval.v_number = n;
+       else
+           rettv->vval.v_number = -n;
+     }
+ }
+ 
+ /*
+  * "acos()" function
+  */
+     void
+ f_acos(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = acos(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "asin()" function
+  */
+     void
+ f_asin(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = asin(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "atan()" function
+  */
+     void
+ f_atan(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = atan(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "atan2()" function
+  */
+     void
+ f_atan2(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   fx = 0.0, fy = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &fx) == OK
+                                    && get_float_arg(&argvars[1], &fy) == OK)
+       rettv->vval.v_float = atan2(fx, fy);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "ceil({float})" function
+  */
+     void
+ f_ceil(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = ceil(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "cos()" function
+  */
+     void
+ f_cos(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = cos(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "cosh()" function
+  */
+     void
+ f_cosh(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = cosh(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "exp()" function
+  */
+     void
+ f_exp(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = exp(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "float2nr({float})" function
+  */
+     void
+ f_float2nr(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     if (get_float_arg(argvars, &f) == OK)
+     {
+       if (f <= (float_T)-VARNUM_MAX + DBL_EPSILON)
+           rettv->vval.v_number = -VARNUM_MAX;
+       else if (f >= (float_T)VARNUM_MAX - DBL_EPSILON)
+           rettv->vval.v_number = VARNUM_MAX;
+       else
+           rettv->vval.v_number = (varnumber_T)f;
+     }
+ }
+ 
+ /*
+  * "floor({float})" function
+  */
+     void
+ f_floor(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = floor(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "fmod()" function
+  */
+     void
+ f_fmod(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   fx = 0.0, fy = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &fx) == OK
+                                    && get_float_arg(&argvars[1], &fy) == OK)
+       rettv->vval.v_float = fmod(fx, fy);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ # if defined(HAVE_MATH_H) || defined(PROTO)
+ /*
+  * "isinf()" function
+  */
+     void
+ f_isinf(typval_T *argvars, typval_T *rettv)
+ {
+     if (argvars[0].v_type == VAR_FLOAT && isinf(argvars[0].vval.v_float))
+       rettv->vval.v_number = argvars[0].vval.v_float > 0.0 ? 1 : -1;
+ }
+ 
+ /*
+  * "isnan()" function
+  */
+     void
+ f_isnan(typval_T *argvars, typval_T *rettv)
+ {
+     rettv->vval.v_number = argvars[0].v_type == VAR_FLOAT
+                                           && isnan(argvars[0].vval.v_float);
+ }
+ # endif
+ 
+ /*
+  * "log()" function
+  */
+     void
+ f_log(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = log(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "log10()" function
+  */
+     void
+ f_log10(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = log10(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "pow()" function
+  */
+     void
+ f_pow(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   fx = 0.0, fy = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &fx) == OK
+                                    && get_float_arg(&argvars[1], &fy) == OK)
+       rettv->vval.v_float = pow(fx, fy);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ 
+ /*
+  * round() is not in C90, use ceil() or floor() instead.
+  */
+     float_T
+ vim_round(float_T f)
+ {
+     return f > 0 ? floor(f + 0.5) : ceil(f - 0.5);
+ }
+ 
+ /*
+  * "round({float})" function
+  */
+     void
+ f_round(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = vim_round(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "sin()" function
+  */
+     void
+ f_sin(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = sin(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "sinh()" function
+  */
+     void
+ f_sinh(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = sinh(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "sqrt()" function
+  */
+     void
+ f_sqrt(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = sqrt(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "str2float()" function
+  */
+     void
+ f_str2float(typval_T *argvars, typval_T *rettv)
+ {
+     char_u *p = skipwhite(tv_get_string(&argvars[0]));
+     int     isneg = (*p == '-');
+ 
+     if (*p == '+' || *p == '-')
+       p = skipwhite(p + 1);
+     (void)string2float(p, &rettv->vval.v_float);
+     if (isneg)
+       rettv->vval.v_float *= -1;
+     rettv->v_type = VAR_FLOAT;
+ }
+ 
+ /*
+  * "tan()" function
+  */
+     void
+ f_tan(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = tan(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "tanh()" function
+  */
+     void
+ f_tanh(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       rettv->vval.v_float = tanh(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ /*
+  * "trunc({float})" function
+  */
+     void
+ f_trunc(typval_T *argvars, typval_T *rettv)
+ {
+     float_T   f = 0.0;
+ 
+     rettv->v_type = VAR_FLOAT;
+     if (get_float_arg(argvars, &f) == OK)
+       // trunc() is not in C90, use floor() or ceil() instead.
+       rettv->vval.v_float = f > 0 ? floor(f) : ceil(f);
+     else
+       rettv->vval.v_float = 0.0;
+ }
+ 
+ #endif
*** ../vim-8.2.2927/src/proto.h 2020-12-28 18:25:56.800886000 +0100
--- src/proto.h 2021-06-02 16:53:34.794373287 +0200
***************
*** 90,95 ****
--- 90,96 ----
  # include "fileio.pro"
  # include "filepath.pro"
  # include "findfile.pro"
+ # include "float.pro"
  # include "fold.pro"
  # include "getchar.pro"
  # include "gui_xim.pro"
*** ../vim-8.2.2927/src/proto/eval.pro  2021-02-11 21:19:30.522147936 +0100
--- src/proto/eval.pro  2021-06-02 16:53:34.794373287 +0200
***************
*** 56,62 ****
  char_u *echo_string_core(typval_T *tv, char_u **tofree, char_u *numbuf, int 
copyID, int echo_style, int restore_copyID, int composite_val);
  char_u *echo_string(typval_T *tv, char_u **tofree, char_u *numbuf, int 
copyID);
  char_u *string_quote(char_u *str, int function);
- int string2float(char_u *text, float_T *value);
  int buf_byteidx_to_charidx(buf_T *buf, int lnum, int byteidx);
  int buf_charidx_to_byteidx(buf_T *buf, int lnum, int charidx);
  pos_T *var2fpos(typval_T *varp, int dollar_lnum, int *fnum, int charcol);
--- 56,61 ----
*** ../vim-8.2.2927/src/proto/float.pro 2021-06-02 17:06:48.644431104 +0200
--- src/proto/float.pro 2021-06-02 16:53:34.794373287 +0200
***************
*** 0 ****
--- 1,28 ----
+ /* math.c */
+ int string2float(char_u *text, float_T *value);
+ void f_abs(typval_T *argvars, typval_T *rettv);
+ void f_acos(typval_T *argvars, typval_T *rettv);
+ void f_asin(typval_T *argvars, typval_T *rettv);
+ void f_atan(typval_T *argvars, typval_T *rettv);
+ void f_atan2(typval_T *argvars, typval_T *rettv);
+ void f_ceil(typval_T *argvars, typval_T *rettv);
+ void f_cos(typval_T *argvars, typval_T *rettv);
+ void f_cosh(typval_T *argvars, typval_T *rettv);
+ void f_exp(typval_T *argvars, typval_T *rettv);
+ void f_float2nr(typval_T *argvars, typval_T *rettv);
+ void f_floor(typval_T *argvars, typval_T *rettv);
+ void f_fmod(typval_T *argvars, typval_T *rettv);
+ void f_isinf(typval_T *argvars, typval_T *rettv);
+ void f_isnan(typval_T *argvars, typval_T *rettv);
+ void f_log(typval_T *argvars, typval_T *rettv);
+ void f_log10(typval_T *argvars, typval_T *rettv);
+ void f_pow(typval_T *argvars, typval_T *rettv);
+ void f_round(typval_T *argvars, typval_T *rettv);
+ void f_sin(typval_T *argvars, typval_T *rettv);
+ void f_sinh(typval_T *argvars, typval_T *rettv);
+ void f_sqrt(typval_T *argvars, typval_T *rettv);
+ void f_str2float(typval_T *argvars, typval_T *rettv);
+ void f_tan(typval_T *argvars, typval_T *rettv);
+ void f_tanh(typval_T *argvars, typval_T *rettv);
+ void f_trunc(typval_T *argvars, typval_T *rettv);
+ /* vim: set ft=c : */
*** ../vim-8.2.2927/src/version.c       2021-06-02 16:49:27.758997408 +0200
--- src/version.c       2021-06-02 16:53:21.738405905 +0200
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     2928,
  /**/

-- 
Any sufficiently advanced technology is indistinguishable from magic.
                                        Arthur C. Clarke
Any sufficiently advanced bug is indistinguishable from a feature.
                                        Rich Kulawiec

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202106021507.152F7rje2602995%40masaka.moolenaar.net.

Raspunde prin e-mail lui