summaryrefslogtreecommitdiffstats
path: root/pgpkey.c
diff options
context:
space:
mode:
authorThomas Roessler <roessler@does-not-exist.org>1999-03-25 19:46:47 +0000
committerThomas Roessler <roessler@does-not-exist.org>1999-03-25 19:46:47 +0000
commitc79acba09979eb337535fccf7f5b396d170f2500 (patch)
treec868126709bbaec68f5dd5c41248627bb370c1d6 /pgpkey.c
parent27a6ffef72dea842785e909c0274b9551b1dc6ce (diff)
Roland's sort_keys patch.
Diffstat (limited to 'pgpkey.c')
-rw-r--r--pgpkey.c104
1 files changed, 98 insertions, 6 deletions
diff --git a/pgpkey.c b/pgpkey.c
index 1d847423..a672e80b 100644
--- a/pgpkey.c
+++ b/pgpkey.c
@@ -26,6 +26,7 @@
#include "mime.h"
#include "pgp.h"
#include "pager.h"
+#include "sort.h"
#include <string.h>
#include <ctype.h>
@@ -290,18 +291,92 @@ static void pgp_entry (char *s, size_t l, MUTTMENU * menu, int num)
mutt_FormatString (s, l, NONULL (PgpEntryFormat), pgp_entry_fmt,
(unsigned long) &entry, M_FORMAT_ARROWCURSOR);
}
-
-static int pgp_compare (const void *a, const void *b)
+
+static int _pgp_compare_address (const void *a, const void *b)
+{
+ int r;
+
+ pgp_uid_t **s = (pgp_uid_t **) a;
+ pgp_uid_t **t = (pgp_uid_t **) b;
+
+ if ((r = mutt_strcasecmp ((*s)->addr, (*t)->addr)))
+ return r > 0;
+ else
+ return (mutt_strcasecmp (pgp_keyid ((*s)->parent),
+ pgp_keyid ((*t)->parent)) > 0);
+}
+
+static int pgp_compare_address (const void *a, const void *b)
+{
+ return ((PgpSortKeys & SORT_REVERSE) ? !_pgp_compare_address (a, b)
+ : _pgp_compare_address (a, b));
+}
+
+
+
+static int _pgp_compare_keyid (const void *a, const void *b)
{
int r;
pgp_uid_t **s = (pgp_uid_t **) a;
pgp_uid_t **t = (pgp_uid_t **) b;
- if ((r = mutt_strcasecmp ((*s)->addr, (*t)->addr)) != 0)
- return r;
+ if ((r = mutt_strcasecmp (pgp_keyid ((*s)->parent),
+ pgp_keyid ((*t)->parent))))
+ return r > 0;
else
- return mutt_strcasecmp (pgp_keyid ((*s)->parent), pgp_keyid ((*t)->parent));
+ return (mutt_strcasecmp ((*s)->addr, (*t)->addr)) > 0;
+}
+
+static int pgp_compare_keyid (const void *a, const void *b)
+{
+ return ((PgpSortKeys & SORT_REVERSE) ? !_pgp_compare_keyid (a, b)
+ : _pgp_compare_keyid (a, b));
+}
+
+static int _pgp_compare_date (const void *a, const void *b)
+{
+ int r;
+ pgp_uid_t **s = (pgp_uid_t **) a;
+ pgp_uid_t **t = (pgp_uid_t **) b;
+
+ if ((r = ((*s)->parent->gen_time - (*t)->parent->gen_time)))
+ return r > 0;
+ return (mutt_strcasecmp ((*s)->addr, (*t)->addr)) > 0;
+}
+
+static int pgp_compare_date (const void *a, const void *b)
+{
+ return ((PgpSortKeys & SORT_REVERSE) ? !_pgp_compare_date (a, b)
+ : _pgp_compare_date (a, b));
+}
+
+static int _pgp_compare_trust (const void *a, const void *b)
+{
+ int r;
+
+ pgp_uid_t **s = (pgp_uid_t **) a;
+ pgp_uid_t **t = (pgp_uid_t **) b;
+
+ if ((r = (((*s)->parent->flags & (KEYFLAG_RESTRICTIONS))
+ - ((*t)->parent->flags & (KEYFLAG_RESTRICTIONS)))))
+ return r > 0;
+ if ((r = ((*s)->trust - (*t)->trust)))
+ return r < 0;
+ if ((r = ((*s)->parent->keylen - (*t)->parent->keylen)))
+ return r < 0;
+ if ((r = ((*s)->parent->gen_time - (*t)->parent->gen_time)))
+ return r < 0;
+ if ((r = mutt_strcasecmp ((*s)->addr, (*t)->addr)))
+ return r > 0;
+ return (mutt_strcasecmp (pgp_keyid ((*s)->parent),
+ pgp_keyid ((*t)->parent))) > 0;
+}
+
+static int pgp_compare_trust (const void *a, const void *b)
+{
+ return ((PgpSortKeys & SORT_REVERSE) ? !_pgp_compare_trust (a, b)
+ : _pgp_compare_trust (a, b));
}
static pgp_key_t *pgp_select_key (struct pgp_vinfo *pgp,
@@ -318,6 +393,7 @@ static pgp_key_t *pgp_select_key (struct pgp_vinfo *pgp,
pid_t thepid;
pgp_key_t *kp;
pgp_uid_t *a;
+ int (*f) (const void *, const void *);
for (i = 0, kp = keys; kp; kp = kp->next)
{
@@ -343,7 +419,23 @@ static pgp_key_t *pgp_select_key (struct pgp_vinfo *pgp,
KeyTable[i] = a;
}
- qsort (KeyTable, i, sizeof (pgp_key_t *), pgp_compare);
+ switch (PgpSortKeys & SORT_MASK)
+ {
+ case SORT_DATE:
+ f = pgp_compare_date;
+ break;
+ case SORT_KEYID:
+ f = pgp_compare_keyid;
+ break;
+ case SORT_ADDRESS:
+ f = pgp_compare_address;
+ break;
+ case SORT_TRUST:
+ default:
+ f = pgp_compare_trust;
+ break;
+ }
+ qsort (KeyTable, i, sizeof (pgp_key_t *), f);
helpstr[0] = 0;
mutt_make_help (buf, sizeof (buf), _("Exit "), MENU_PGP, OP_EXIT);