]> granicus.if.org Git - neomutt/commitdiff
Roland's sort_keys patch.
authorThomas Roessler <roessler@does-not-exist.org>
Thu, 25 Mar 1999 19:46:47 +0000 (19:46 +0000)
committerThomas Roessler <roessler@does-not-exist.org>
Thu, 25 Mar 1999 19:46:47 +0000 (19:46 +0000)
Muttrc.in
doc/manual.sgml.in
init.c
init.h
pgpkey.c
sort.h

index 00f868bbde0b7be09b636411c00b55e47309fa5d..4a6c0ebedcd3924b47fca40e4935d7e6538c1544 100644 (file)
--- a/Muttrc.in
+++ b/Muttrc.in
@@ -187,11 +187,13 @@ macro pager   <f1> "!less @docdir@/manual.txt\n" "Show Mutt documentation"
 # unset pgp_autosign
 # unset pgp_autoencrypt
 # set pgp_encryptself
+# set pgp_entry_format="%4n %t%f %4l/0x%k %-4a %2c %u"
 # unset pgp_long_ids
 # unset pgp_replyencrypt
 # unset pgp_replysign
 # set pgp_sign_as=""
 # set pgp_sign_micalg="pgp-md5"
+# set pgp_sort_keys=address
 # set pgp_strict_enc
 # set pgp_timeout=300
 # set pgp_verify_sig=yes
index c041cbc1ea766dd7481abf03d9d656a003f58536..f6bac4d5725ab9af9c177317ed794592d0029ccf 100644 (file)
@@ -4148,6 +4148,24 @@ are sorted alphabetically.  Valid values:
 You may optionally use the <tt/reverse-/ prefix to specify reverse sorting
 order (example: <tt/set sort_browser=reverse-date/).
 
+<sect2>pgp&lowbar;sort&lowbar;keys<label id="pgp_sort_keys">
+<p>
+Type: string<newline>
+Default: address
+
+Specifies how the entries in the `pgp keys' menu are sorted. The
+following are legal values:
+
+<itemize>
+<item>address (sort alphabetically by user id)
+<item>keyid (sort alphabetically by key id)
+<item>date (sort by key creation date)
+<item>trust (sort by the trust of the key).
+</itemize>
+
+If you prefer reverse order of the above values, prefix it with
+`reverse-'.
+
 <sect2>spoolfile<label id="spoolfile">
 <p>
 Type: string<newline>
diff --git a/init.c b/init.c
index 6f4b03af2b5179c4d9c9b41dcee5930f10e33152..4e365e7cdb290652a78ff766eedd39f897093604 100644 (file)
--- a/init.c
+++ b/init.c
@@ -1030,6 +1030,11 @@ static int parse_set (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err)
        case DT_SORT_BROWSER:
          map = SortBrowserMethods;
          break;
+#ifdef _PGPPATH
+       case DT_SORT_KEYS:
+         map = SortKeyMethods;
+         break;
+#endif
        default:
          map = SortMethods;
          break;
@@ -1432,6 +1437,11 @@ int mutt_var_value_complete (char *buffer, size_t len, int pos)
          case DT_SORT_BROWSER:
            map = SortBrowserMethods;
            break;
+#ifdef _PGPPATH
+         case DT_SORT_KEYS:
+           map = SortKeyMethods;
+           break;
+#endif
          default:
            map = SortMethods;
            break;
diff --git a/init.h b/init.h
index fa434eef68a331a680341140af74e8df1ee0c124..47afd71f35bdfb65ecf214a05dd61f579bac8b39 100644 (file)
--- a/init.h
+++ b/init.h
@@ -36,6 +36,7 @@
 #define DT_SUBTYPE_MASK        0xf0
 #define DT_SORT_ALIAS  0x10
 #define DT_SORT_BROWSER 0x20
+#define DT_SORT_KEYS   0x40
 
 /* flags to parse_set() */
 #define M_SET_INV      (1<<0)  /* default is to invert all vars */
@@ -224,6 +225,7 @@ struct option_t MuttVars[] = {
 # endif
   { "pgp_receive_version",     DT_STR, R_NONE, UL &PgpReceiveVersion, UL "default" },
   { "pgp_send_version",                DT_STR, R_NONE, UL &PgpSendVersion, UL "default" },
+  { "pgp_sort_keys",   DT_SORT|DT_SORT_KEYS, R_NONE, UL &PgpSortKeys, SORT_ADDRESS },
   { "pgp_key_version",         DT_STR, R_NONE, UL &PgpKeyVersion, UL "default" },
 
   { "forward_decrypt", DT_BOOL, R_NONE, OPTFORWDECRYPT, 1 },
@@ -332,6 +334,17 @@ const struct mapping_t SortAliasMethods[] = {
   { NULL }
 };
 
+#ifdef _PGPPATH
+const struct mapping_t SortKeyMethods[] = {
+  { "address", SORT_ADDRESS },
+  { "date",    SORT_DATE },
+  { "keyid",   SORT_KEYID },
+  { "trust",   SORT_TRUST },
+  { NULL }
+};
+#endif /* _PGPPATH */
+
+
 /* functions used to parse commands in a rc file */
 
 static int parse_list (BUFFER *, BUFFER *, unsigned long, BUFFER *);
index 1d847423444c361dd848545a16ae8860da1ae811..a672e80bb863e02cdb6c7c0a38810eb16857f040 100644 (file)
--- 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);
diff --git a/sort.h b/sort.h
index 7e7c41e24479a94724aabc7e728009ae4071af55..5a83c94121f5e4fcfac22ecbdb4d192955c490f2 100644 (file)
--- a/sort.h
+++ b/sort.h
@@ -27,6 +27,8 @@
 #define SORT_SCORE     9
 #define SORT_ALIAS     10
 #define SORT_ADDRESS   11
+#define SORT_KEYID     12
+#define SORT_TRUST     13
 #define SORT_MASK      0xf
 #define SORT_REVERSE   (1<<4)
 #define SORT_LAST      (1<<5)
@@ -44,5 +46,8 @@ WHERE short BrowserSort INITVAL (SORT_SUBJECT);
 WHERE short Sort INITVAL (SORT_DATE);
 WHERE short SortAux INITVAL (SORT_DATE); /* auxiallary sorting method */
 WHERE short SortAlias INITVAL (SORT_ALIAS);
+#ifdef _PGPPATH
+WHERE short PgpSortKeys INITVAL (SORT_ADDRESS);
+#endif
 
 extern const struct mapping_t SortMethods[];