mirror of
https://github.com/neovim/neovim.git
synced 2025-09-27 21:48:35 +00:00
vim-patch:8.1.0959: sorting large numbers is not tested (#9641)
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 vim/vim#4017)
a25e3d0695
This commit is contained in:

committed by
Justin M. Keyes

parent
246408621c
commit
9327ea3e5a
@@ -366,7 +366,10 @@ typedef struct {
|
|||||||
varnumber_T start_col_nr; ///< starting column number
|
varnumber_T start_col_nr; ///< starting column number
|
||||||
varnumber_T end_col_nr; ///< ending column number
|
varnumber_T end_col_nr; ///< ending column number
|
||||||
} line;
|
} line;
|
||||||
varnumber_T value; ///< value if sorting by integer
|
struct {
|
||||||
|
varnumber_T value; ///< value if sorting by integer
|
||||||
|
bool is_number; ///< true when line contains a number
|
||||||
|
} num;
|
||||||
float_T value_flt; ///< value if sorting by float
|
float_T value_flt; ///< value if sorting by float
|
||||||
} st_u;
|
} st_u;
|
||||||
} sorti_T;
|
} sorti_T;
|
||||||
@@ -390,9 +393,15 @@ static int sort_compare(const void *s1, const void *s2)
|
|||||||
// When sorting numbers "start_col_nr" is the number, not the column
|
// When sorting numbers "start_col_nr" is the number, not the column
|
||||||
// number.
|
// number.
|
||||||
if (sort_nr) {
|
if (sort_nr) {
|
||||||
result = l1.st_u.value == l2.st_u.value
|
if (l1.st_u.num.is_number != l2.st_u.num.is_number) {
|
||||||
? 0 : l1.st_u.value > l2.st_u.value
|
result = l1.st_u.num.is_number - l2.st_u.num.is_number;
|
||||||
? 1 : -1;
|
} 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;
|
||||||
|
}
|
||||||
} else if (sort_flt) {
|
} else if (sort_flt) {
|
||||||
result = l1.st_u.value_flt == l2.st_u.value_flt
|
result = l1.st_u.value_flt == l2.st_u.value_flt
|
||||||
? 0 : l1.st_u.value_flt > l2.st_u.value_flt
|
? 0 : l1.st_u.value_flt > l2.st_u.value_flt
|
||||||
@@ -567,11 +576,13 @@ void ex_sort(exarg_T *eap)
|
|||||||
s--; // include preceding negative sign
|
s--; // include preceding negative sign
|
||||||
}
|
}
|
||||||
if (*s == NUL) {
|
if (*s == NUL) {
|
||||||
// empty line should sort before any number
|
// line without number should sort before any number
|
||||||
nrs[lnum - eap->line1].st_u.value = -MAXLNUM;
|
nrs[lnum - eap->line1].st_u.num.is_number = false;
|
||||||
|
nrs[lnum - eap->line1].st_u.num.value = 0;
|
||||||
} else {
|
} else {
|
||||||
|
nrs[lnum - eap->line1].st_u.num.is_number = true;
|
||||||
vim_str2nr(s, NULL, NULL, sort_what,
|
vim_str2nr(s, NULL, NULL, sort_what,
|
||||||
&nrs[lnum - eap->line1].st_u.value, NULL, 0);
|
&nrs[lnum - eap->line1].st_u.num.value, NULL, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
s = skipwhite(p);
|
s = skipwhite(p);
|
||||||
|
@@ -1222,6 +1222,77 @@ func Test_sort_cmd()
|
|||||||
enew!
|
enew!
|
||||||
endfunc
|
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()
|
func Test_sort_cmd_report()
|
||||||
enew!
|
enew!
|
||||||
call append(0, repeat([1], 3) + repeat([2], 3) + repeat([3], 3))
|
call append(0, repeat([1], 3) + repeat([2], 3) + repeat([3], 3))
|
||||||
|
Reference in New Issue
Block a user