mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge pull request #27418 from zeertzjq/vim-9.1.0089
vim-patch:9.1.{0089,0093}: qsort() comparison function fixes
This commit is contained in:
commit
470c450fd2
@ -962,10 +962,11 @@ Dictionary channel_info(uint64_t id)
|
||||
}
|
||||
|
||||
/// Simple int64_t comparison function for use with qsort()
|
||||
static int int64_t_cmp(const void *a, const void *b)
|
||||
static int int64_t_cmp(const void *pa, const void *pb)
|
||||
{
|
||||
int64_t diff = *(int64_t *)a - *(int64_t *)b;
|
||||
return (diff < 0) ? -1 : (diff > 0);
|
||||
const int64_t a = *(const int64_t *)pa;
|
||||
const int64_t b = *(const int64_t *)pb;
|
||||
return a == b ? 0 : a > b ? 1 : -1;
|
||||
}
|
||||
|
||||
Array channel_all_info(void)
|
||||
|
@ -673,10 +673,20 @@ int sign_item_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
const SignItem *s1 = (SignItem *)p1;
|
||||
const SignItem *s2 = (SignItem *)p2;
|
||||
int n = s2->sh->priority - s1->sh->priority;
|
||||
|
||||
return n ? n : (n = (int)(s2->id - s1->id))
|
||||
? n : (s2->sh->sign_add_id - s1->sh->sign_add_id);
|
||||
if (s1->sh->priority != s2->sh->priority) {
|
||||
return s1->sh->priority < s2->sh->priority ? 1 : -1;
|
||||
}
|
||||
|
||||
if (s1->id != s2->id) {
|
||||
return s1->id < s2->id ? 1 : -1;
|
||||
}
|
||||
|
||||
if (s1->sh->sign_add_id != s2->sh->sign_add_id) {
|
||||
return s1->sh->sign_add_id > s2->sh->sign_add_id ? 1 : -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const uint32_t sign_filter[4] = {[kMTMetaSignText] = kMTFilterSelect,
|
||||
|
@ -406,18 +406,16 @@ static int sort_compare(const void *s1, const void *s2)
|
||||
// number.
|
||||
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;
|
||||
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;
|
||||
: l1.st_u.num.value > l2.st_u.num.value ? 1 : -1;
|
||||
}
|
||||
} else if (sort_flt) {
|
||||
result = l1.st_u.value_flt == l2.st_u.value_flt
|
||||
? 0 : l1.st_u.value_flt > l2.st_u.value_flt
|
||||
? 1 : -1;
|
||||
? 0
|
||||
: l1.st_u.value_flt > l2.st_u.value_flt ? 1 : -1;
|
||||
} else {
|
||||
// We need to copy one line into "sortbuf1", because there is no
|
||||
// guarantee that the first pointer becomes invalid when obtaining the
|
||||
|
@ -2792,8 +2792,10 @@ static int tv_nr_compare(const void *a1, const void *a2)
|
||||
{
|
||||
const listitem_T *const li1 = tv_list_first(*(const list_T **)a1);
|
||||
const listitem_T *const li2 = tv_list_first(*(const list_T **)a2);
|
||||
const varnumber_T n1 = TV_LIST_ITEM_TV(li1)->vval.v_number;
|
||||
const varnumber_T n2 = TV_LIST_ITEM_TV(li2)->vval.v_number;
|
||||
|
||||
return (int)(TV_LIST_ITEM_TV(li1)->vval.v_number - TV_LIST_ITEM_TV(li2)->vval.v_number);
|
||||
return n1 == n2 ? 0 : n1 > n2 ? 1 : -1;
|
||||
}
|
||||
|
||||
/// "setcellwidths()" function
|
||||
|
@ -375,7 +375,7 @@ static int nv_compare(const void *s1, const void *s2)
|
||||
if (c2 < 0) {
|
||||
c2 = -c2;
|
||||
}
|
||||
return c1 - c2;
|
||||
return c1 == c2 ? 0 : c1 > c2 ? 1 : -1;
|
||||
}
|
||||
|
||||
/// Initialize the nv_cmd_idx[] table.
|
||||
|
@ -3197,7 +3197,11 @@ static int fuzzy_match_item_compare(const void *const s1, const void *const s2)
|
||||
const int idx1 = ((const fuzzyItem_T *)s1)->idx;
|
||||
const int idx2 = ((const fuzzyItem_T *)s2)->idx;
|
||||
|
||||
return v1 == v2 ? (idx1 - idx2) : v1 > v2 ? -1 : 1;
|
||||
if (v1 == v2) {
|
||||
return idx1 == idx2 ? 0 : idx1 > idx2 ? 1 : -1;
|
||||
} else {
|
||||
return v1 > v2 ? -1 : 1;
|
||||
}
|
||||
}
|
||||
|
||||
/// Fuzzy search the string "str" in a list of "items" and return the matching
|
||||
@ -3436,7 +3440,11 @@ static int fuzzy_match_str_compare(const void *const s1, const void *const s2)
|
||||
const int idx1 = ((fuzmatch_str_T *)s1)->idx;
|
||||
const int idx2 = ((fuzmatch_str_T *)s2)->idx;
|
||||
|
||||
return v1 == v2 ? (idx1 - idx2) : v1 > v2 ? -1 : 1;
|
||||
if (v1 == v2) {
|
||||
return idx1 == idx2 ? 0 : idx1 > idx2 ? 1 : -1;
|
||||
} else {
|
||||
return v1 > v2 ? -1 : 1;
|
||||
}
|
||||
}
|
||||
|
||||
/// Sort fuzzy matches by score
|
||||
@ -3465,7 +3473,11 @@ static int fuzzy_match_func_compare(const void *const s1, const void *const s2)
|
||||
if (*str1 == '<' && *str2 != '<') {
|
||||
return 1;
|
||||
}
|
||||
return v1 == v2 ? (idx1 - idx2) : v1 > v2 ? -1 : 1;
|
||||
if (v1 == v2) {
|
||||
return idx1 == idx2 ? 0 : idx1 > idx2 ? 1 : -1;
|
||||
} else {
|
||||
return v1 > v2 ? -1 : 1;
|
||||
}
|
||||
}
|
||||
|
||||
/// Sort fuzzy matches of function names by score.
|
||||
|
@ -1875,9 +1875,7 @@ static int compare_file_marks(const void *a, const void *b)
|
||||
const FileMarks *const *const b_fms = b;
|
||||
return ((*a_fms)->greatest_timestamp == (*b_fms)->greatest_timestamp
|
||||
? 0
|
||||
: ((*a_fms)->greatest_timestamp > (*b_fms)->greatest_timestamp
|
||||
? -1
|
||||
: 1));
|
||||
: ((*a_fms)->greatest_timestamp > (*b_fms)->greatest_timestamp ? -1 : 1));
|
||||
}
|
||||
|
||||
/// Parse msgpack object that has given length
|
||||
|
@ -172,20 +172,28 @@ int sign_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
const MTKey *s1 = (MTKey *)p1;
|
||||
const MTKey *s2 = (MTKey *)p2;
|
||||
int n = s1->pos.row - s2->pos.row;
|
||||
|
||||
if (n) {
|
||||
return n;
|
||||
if (s1->pos.row != s2->pos.row) {
|
||||
return s1->pos.row > s2->pos.row ? 1 : -1;
|
||||
}
|
||||
|
||||
DecorSignHighlight *sh1 = decor_find_sign(mt_decor(*s1));
|
||||
DecorSignHighlight *sh2 = decor_find_sign(mt_decor(*s2));
|
||||
assert(sh1 && sh2);
|
||||
|
||||
n = sh2->priority - sh1->priority;
|
||||
if (sh1->priority != sh2->priority) {
|
||||
return sh1->priority < sh2->priority ? 1 : -1;
|
||||
}
|
||||
|
||||
return n ? n : (n = (int)(s2->id - s1->id))
|
||||
? n : (sh2->sign_add_id - sh1->sign_add_id);
|
||||
if (s1->id != s2->id) {
|
||||
return s1->id < s2->id ? 1 : -1;
|
||||
}
|
||||
|
||||
if (sh1->sign_add_id != sh2->sign_add_id) {
|
||||
return sh1->sign_add_id < sh2->sign_add_id ? 1 : -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Delete the specified sign(s)
|
||||
|
@ -3221,10 +3221,10 @@ static int sug_compare(const void *s1, const void *s2)
|
||||
{
|
||||
suggest_T *p1 = (suggest_T *)s1;
|
||||
suggest_T *p2 = (suggest_T *)s2;
|
||||
int n = p1->st_score - p2->st_score;
|
||||
int n = p1->st_score == p2->st_score ? 0 : p1->st_score > p2->st_score ? 1 : -1;
|
||||
|
||||
if (n == 0) {
|
||||
n = p1->st_altscore - p2->st_altscore;
|
||||
n = p1->st_altscore == p2->st_altscore ? 0 : p1->st_altscore > p2->st_altscore ? 1 : -1;
|
||||
if (n == 0) {
|
||||
n = STRICMP(p1->st_word, p2->st_word);
|
||||
}
|
||||
|
@ -7359,9 +7359,17 @@ static bool frame_check_width(const frame_T *topfrp, int width)
|
||||
}
|
||||
|
||||
/// Simple int comparison function for use with qsort()
|
||||
static int int_cmp(const void *a, const void *b)
|
||||
static int int_cmp(const void *pa, const void *pb)
|
||||
{
|
||||
return *(const int *)a - *(const int *)b;
|
||||
const int a = *(const int *)pa;
|
||||
const int b = *(const int *)pb;
|
||||
if (a > b) {
|
||||
return 1;
|
||||
}
|
||||
if (a < b) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Handle setting 'colorcolumn' or 'textwidth' in window "wp".
|
||||
|
@ -233,7 +233,9 @@ void win_config_float(win_T *wp, WinConfig fconfig)
|
||||
|
||||
static int float_zindex_cmp(const void *a, const void *b)
|
||||
{
|
||||
return (*(win_T **)b)->w_float_config.zindex - (*(win_T **)a)->w_float_config.zindex;
|
||||
int za = (*(win_T **)a)->w_float_config.zindex;
|
||||
int zb = (*(win_T **)b)->w_float_config.zindex;
|
||||
return za == zb ? 0 : za < zb ? 1 : -1;
|
||||
}
|
||||
|
||||
void win_float_remove(bool bang, int count)
|
||||
|
Loading…
Reference in New Issue
Block a user