Patch 8.1.0959
Problem:    Sorting large numbers is not tested and does not work properly.
Solution:   Add test.  Fix comparing lines with and without a number.
            (Dominique Pelle, closes #4017)
Files:      src/ex_cmds.c, src/testdir/test_sort.vim

*** ../vim-8.1.0958/src/ex_cmds.c       2019-02-17 17:44:36.203875545 +0100
--- src/ex_cmds.c       2019-02-20 22:15:27.631399246 +0100
***************
*** 303,309 ****
            varnumber_T start_col_nr;           /* starting column number */
            varnumber_T end_col_nr;             /* ending column number */
        } line;
!       varnumber_T     value;          /* value if sorting by integer */
  #ifdef FEAT_FLOAT
        float_T value_flt;      /* value if sorting by float */
  #endif
--- 303,313 ----
            varnumber_T start_col_nr;           /* starting column number */
            varnumber_T end_col_nr;             /* ending column number */
        } line;
!       struct
!       {
!           varnumber_T value;          /* value if sorting by integer */
!           int is_number;              /* TRUE when line contains a number */
!       } num;
  #ifdef FEAT_FLOAT
        float_T value_flt;      /* value if sorting by float */
  #endif
***************
*** 335,345 ****
      if (got_int)
        sort_abort = TRUE;
  
-     /* When sorting numbers "start_col_nr" is the number, not the column
-      * number. */
      if (sort_nr)
!       result = l1.st_u.value == l2.st_u.value ? 0
!                                : l1.st_u.value > l2.st_u.value ? 1 : -1;
  #ifdef FEAT_FLOAT
      else if (sort_flt)
        result = l1.st_u.value_flt == l2.st_u.value_flt ? 0
--- 339,352 ----
      if (got_int)
        sort_abort = TRUE;
  
      if (sort_nr)
!     {
!       if (l1.st_u.num.is_number != l2.st_u.num.is_number)
!           result = l1.st_u.num.is_number - l2.st_u.num.is_number;
!       else
!           result = l1.st_u.num.value == l2.st_u.num.value ? 0
!                            : l1.st_u.num.value > l2.st_u.num.value ? 1 : -1;
!     }
  #ifdef FEAT_FLOAT
      else if (sort_flt)
        result = l1.st_u.value_flt == l2.st_u.value_flt ? 0
***************
*** 553,563 ****
                if (s > p && s[-1] == '-')
                    --s;  /* include preceding negative sign */
                if (*s == NUL)
!                   /* empty line should sort before any number */
!                   nrs[lnum - eap->line1].st_u.value = -MAXLNUM;
                else
                    vim_str2nr(s, NULL, NULL, sort_what,
!                              &nrs[lnum - eap->line1].st_u.value, NULL, 0);
            }
  #ifdef FEAT_FLOAT
            else
--- 560,576 ----
                if (s > p && s[-1] == '-')
                    --s;  /* include preceding negative sign */
                if (*s == NUL)
!               {
!                   /* line without number should sort before any number */
!                   nrs[lnum - eap->line1].st_u.num.is_number = FALSE;
!                   nrs[lnum - eap->line1].st_u.num.value = 0;
!               }
                else
+               {
+                   nrs[lnum - eap->line1].st_u.num.is_number = TRUE;
                    vim_str2nr(s, NULL, NULL, sort_what,
!                              &nrs[lnum - eap->line1].st_u.num.value, NULL, 0);
!               }
            }
  #ifdef FEAT_FLOAT
            else
*** ../vim-8.1.0958/src/testdir/test_sort.vim   2018-09-21 12:46:16.341772938 
+0200
--- src/testdir/test_sort.vim   2019-02-20 22:15:27.631399246 +0100
***************
*** 1222,1227 ****
--- 1222,1298 ----
    enew!
  endfunc
  
+ func Test_sort_large_num()
+   new
+   a
+ -2147483648
+ -2147483647
+ 
+ -1
+ 0
+ 1
+ -2147483646
+ 2147483646
+ 2147483647
+ 2147483647
+ -2147483648
+ abc
+ 
+ .
+   " Numerical sort. Non-numeric lines are ordered before numerical lines.
+   " Ordering of non-numerical is stable.
+   sort n
+   call assert_equal(['',
+   \                  'abc',
+   \                  '',
+   \                  '-2147483648',
+   \                  '-2147483648',
+   \                  '-2147483647',
+   \                  '-2147483646',
+   \                  '-1',
+   \                  '0',
+   \                  '1',
+   \                  '2147483646',
+   \                  '2147483647',
+   \                  '2147483647'], getline(1, '$'))
+   bwipe!
+ 
+   if has('num64')
+     new
+     a
+ -9223372036854775808
+ -9223372036854775807
+ 
+ -1
+ 0
+ 1
+ -9223372036854775806
+ 9223372036854775806
+ 9223372036854775807
+ 9223372036854775807
+ -9223372036854775808
+ abc
+ 
+ .
+     sort n
+     call assert_equal(['',
+     \                  'abc',
+     \                  '',
+     \                  '-9223372036854775808',
+     \                  '-9223372036854775808',
+     \                  '-9223372036854775807',
+     \                  '-9223372036854775806',
+     \                  '-1',
+     \                  '0',
+     \                  '1',
+     \                  '9223372036854775806',
+     \                  '9223372036854775807',
+     \                  '9223372036854775807'], getline(1, '$'))
+     bwipe!
+   endif
+ endfunc
+ 
+ 
  func Test_sort_cmd_report()
      enew!
      call append(0, repeat([1], 3) + repeat([2], 3) + repeat([3], 3))
*** ../vim-8.1.0958/src/version.c       2019-02-20 22:04:28.823721308 +0100
--- src/version.c       2019-02-20 22:17:16.762701596 +0100
***************
*** 781,782 ****
--- 781,784 ----
  {   /* Add new patch number below this line */
+ /**/
+     959,
  /**/


-- 
A consultant is a person who takes your money and annoys your employees while
tirelessly searching for the best way to extend the consulting contract.
                                (Scott Adams - The Dilbert principle)

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            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].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui