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.