|
9 | 9 | typedef struct { |
10 | 10 | char *str; |
11 | 11 | int32_t score; |
| 12 | + size_t len; |
12 | 13 | } fzf_tuple_t; |
13 | 14 |
|
14 | 15 | typedef struct { |
@@ -50,12 +51,14 @@ void swap(fzf_tuple_t *x, fzf_tuple_t *y) { |
50 | 51 |
|
51 | 52 | // take strlen in consideration if lhs == rhs |
52 | 53 | static bool smaller(fzf_tuple_t *lhs, fzf_tuple_t *rhs) { |
53 | | - return lhs->score < rhs->score; |
| 54 | + return (lhs->score == rhs->score && lhs->len > rhs->len) || |
| 55 | + lhs->score < rhs->score; |
54 | 56 | } |
55 | 57 |
|
56 | 58 | // take strlen in consideration if lhs == rhs |
57 | 59 | bool greater(fzf_tuple_t *lhs, fzf_tuple_t *rhs) { |
58 | | - return lhs->score > rhs->score; |
| 60 | + return (lhs->score == rhs->score && lhs->len < rhs->len) || |
| 61 | + lhs->score > rhs->score; |
59 | 62 | } |
60 | 63 |
|
61 | 64 | static void insert(heap_t *heap, fzf_tuple_t data) { |
@@ -111,19 +114,19 @@ int main(int argc, char **argv) { |
111 | 114 | size_t len = 0; |
112 | 115 | ssize_t read; |
113 | 116 | while ((read = getline(&line, &len, stdin)) != -1) { |
114 | | - char *copy = (char *)malloc(sizeof(char) * read); |
115 | | - strncpy(copy, line, read - 1); |
116 | | - copy[read - 1] = '\0'; |
117 | | - |
118 | | - int32_t score = fzf_get_score(copy, pattern, slab); |
| 117 | + line[read - 1] = '\0'; |
| 118 | + int32_t score = fzf_get_score(line, pattern, slab); |
119 | 119 | if (score > 0) { |
120 | | - insert(heap, (fzf_tuple_t){.str = copy, .score = score}); |
| 120 | + char *copy = (char *)malloc(sizeof(char) * read); |
| 121 | + strncpy(copy, line, read - 1); |
| 122 | + copy[read - 1] = '\0'; |
| 123 | + insert(heap, (fzf_tuple_t){.str = copy, .score = score, .len = read - 1}); |
121 | 124 | } |
122 | 125 | } |
123 | 126 |
|
124 | 127 | while (heap->len > 0) { |
125 | 128 | fzf_tuple_t el = extract_max(heap); |
126 | | - printf("%s (%d)\n", el.str, el.score); |
| 129 | + printf("%s\n", el.str); |
127 | 130 | free(el.str); |
128 | 131 | } |
129 | 132 | free_heap(heap); |
|
0 commit comments