NeoMutt  2023-05-17-16-g61469c
Teaching an old dog new tricks
DOXYGEN
sort.c
Go to the documentation of this file.
1
29#include "config.h"
30#include <stddef.h>
31#include "mutt/lib.h"
32#include "address/lib.h"
33#include "config/lib.h"
34#include "sort.h"
35#include "alias.h"
36#include "gui.h"
37
38#define RSORT(num) ((SortAlias & SORT_REVERSE) ? -num : num)
39
41static short SortAlias = 0;
42
48static int alias_sort_name(const void *a, const void *b)
49{
50 const struct AliasView *av_a = a;
51 const struct AliasView *av_b = b;
52
53 if (av_a->is_visible != av_b->is_visible)
54 return av_a->is_visible ? -1 : 1;
55
56 if (!av_a->is_visible)
57 return 0;
58
59 int r = mutt_str_coll(av_a->alias->name, av_b->alias->name);
60
61 return RSORT(r);
62}
63
69static int alias_sort_address(const void *a, const void *b)
70{
71 const struct AliasView *av_a = a;
72 const struct AliasView *av_b = b;
73
74 const struct AddressList *al_a = &av_a->alias->addr;
75 const struct AddressList *al_b = &av_b->alias->addr;
76
77 if (av_a->is_visible != av_b->is_visible)
78 return av_a->is_visible ? -1 : 1;
79
80 if (!av_a->is_visible)
81 return 0;
82
83 int r;
84 if (al_a == al_b)
85 {
86 r = 0;
87 }
88 else if (!al_a)
89 {
90 r = -1;
91 }
92 else if (!al_b)
93 {
94 r = 1;
95 }
96 else
97 {
98 const struct Address *addr_a = TAILQ_FIRST(al_a);
99 const struct Address *addr_b = TAILQ_FIRST(al_b);
100 if (addr_a && addr_a->personal)
101 {
102 if (addr_b && addr_b->personal)
103 r = mutt_str_coll(addr_a->personal, addr_b->personal);
104 else
105 r = 1;
106 }
107 else if (addr_b && addr_b->personal)
108 {
109 r = -1;
110 }
111 else if (addr_a && addr_b)
112 {
113 r = mutt_str_coll(addr_a->mailbox, addr_b->mailbox);
114 }
115 else
116 {
117 r = 0;
118 }
119 }
120
121 return RSORT(r);
122}
123
129static int alias_sort_unsort(const void *a, const void *b)
130{
131 const struct AliasView *av_a = a;
132 const struct AliasView *av_b = b;
133
134 if (av_a->is_visible != av_b->is_visible)
135 return av_a->is_visible ? -1 : 1;
136
137 if (!av_a->is_visible)
138 return 0;
139
140 int r = (av_a->orig_seq - av_b->orig_seq);
141
142 return RSORT(r);
143}
144
150{
151 switch ((sort & SORT_MASK))
152 {
153 case SORT_ALIAS:
154 return alias_sort_name;
155 case SORT_ADDRESS:
156 return alias_sort_address;
157 case SORT_ORDER:
158 return alias_sort_unsort;
159 default:
160 return alias_sort_name;
161 }
162}
163
169void alias_array_sort(struct AliasViewArray *ava, const struct ConfigSubset *sub)
170{
171 if (!ava || ARRAY_EMPTY(ava))
172 return;
173
174 SortAlias = cs_subset_sort(sub, "sort_alias");
176
177 struct AliasView *avp = NULL;
178 ARRAY_FOREACH(avp, ava)
179 {
180 avp->num = ARRAY_FOREACH_IDX;
181 }
182}
Email Address Handling.
static short SortAlias
Current value of $sort_alias used by the sorting functions.
Definition: sort.c:41
#define RSORT(num)
Definition: sort.c:38
void alias_array_sort(struct AliasViewArray *ava, const struct ConfigSubset *sub)
Sort and reindex an AliasViewArray.
Definition: sort.c:169
static sort_t alias_get_sort_function(short sort)
Sorting function decision logic.
Definition: sort.c:149
Representation of a single alias to an email address.
#define ARRAY_SORT(head, fn)
Sort an array.
Definition: array.h:277
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition: array.h:211
#define ARRAY_EMPTY(head)
Check if an array is empty.
Definition: array.h:73
short cs_subset_sort(const struct ConfigSubset *sub, const char *name)
Get a sort config item by name.
Definition: helpers.c:292
Convenience wrapper for the config headers.
static int alias_sort_unsort(const void *a, const void *b)
Compare two Aliases by their original configuration position - Implements sort_t -.
Definition: sort.c:129
static int alias_sort_name(const void *a, const void *b)
Compare two Aliases by their short names - Implements sort_t -.
Definition: sort.c:48
static int alias_sort_address(const void *a, const void *b)
Compare two Aliases by their Addresses - Implements sort_t -.
Definition: sort.c:69
Shared code for the Alias and Query Dialogs.
Convenience wrapper for the library headers.
int mutt_str_coll(const char *a, const char *b)
Collate two strings (compare using locale), safely.
Definition: string.c:581
#define TAILQ_FIRST(head)
Definition: queue.h:723
#define SORT_MASK
Mask for the sort id.
Definition: sort2.h:74
@ SORT_ORDER
Sort by the order the messages appear in the mailbox.
Definition: sort2.h:44
@ SORT_ALIAS
Sort by email alias.
Definition: sort2.h:49
@ SORT_ADDRESS
Sort by email address.
Definition: sort2.h:50
Assorted sorting methods.
int(* sort_t)(const void *a, const void *b)
Definition: sort.h:47
An email address.
Definition: address.h:36
char * mailbox
Mailbox and host address.
Definition: address.h:38
char * personal
Real name of address.
Definition: address.h:37
GUI data wrapping an Alias.
Definition: gui.h:36
bool is_visible
Is visible?
Definition: gui.h:43
struct Alias * alias
Alias.
Definition: gui.h:44
int num
Index number in list.
Definition: gui.h:37
int orig_seq
Sequence in alias config file.
Definition: gui.h:38
char * name
Short name.
Definition: alias.h:35
struct AddressList addr
List of Addresses the Alias expands to.
Definition: alias.h:36
A set of inherited config items.
Definition: subset.h:47