]> diplodocus.org Git - nmh/blobdiff - h/mh.h
Added NMH_ADDL_CPPFLAGS macro in new m4/cppflags.m4, to remove
[nmh] / h / mh.h
diff --git a/h/mh.h b/h/mh.h
index 44fc190737938f0a65456b063ebd845c25caf8c7..d88df07f23094105f92762f13fb7fa059c9ff022 100644 (file)
--- a/h/mh.h
+++ b/h/mh.h
@@ -1,4 +1,3 @@
-
 /*
  * mh.h -- main header file for all of nmh
  */
 /*
  * mh.h -- main header file for all of nmh
  */
 #define DMAXFOLDER     4       /* typical number of digits             */
 #define MAXFOLDER   1000       /* message increment                    */
 
 #define DMAXFOLDER     4       /* typical number of digits             */
 #define MAXFOLDER   1000       /* message increment                    */
 
+/*
+ * This macro is for use by scan, for example, so that platforms with
+ * a small BUFSIZ can easily allocate larger buffers.
+ */
+#define NMH_BUFSIZ  (BUFSIZ>=8192 ? BUFSIZ : 8192)
+
 #ifndef FALSE
 #define FALSE 0
 #endif
 #ifndef FALSE
 #define FALSE 0
 #endif
@@ -38,6 +43,35 @@ typedef unsigned char  boolean;  /* not int so we can pack in a structure */
 #define NMH_UNUSED(i) i
 #endif
 
 #define NMH_UNUSED(i) i
 #endif
 
+/*
+ * char array that keeps track of size in both bytes and characters
+ * Usage note:
+ *    Don't store return value of charstring_buffer() and use later
+ *    after intervening push_back's; use charstring_buffer_copy()
+ *    instead.
+ */
+typedef struct charstring *charstring_t;
+
+charstring_t charstring_create (size_t);
+charstring_t charstring_copy (const charstring_t);
+void charstring_free (charstring_t);
+/* Append a single-byte character: */
+void charstring_push_back (charstring_t, const char);
+/* Append possibly multi-byte character(s): */
+void charstring_push_back_chars (charstring_t, const char [], size_t, size_t);
+void charstring_append (charstring_t, const charstring_t);
+void charstring_append_cstring (charstring_t, const char []);
+void charstring_clear (charstring_t);
+/* Don't store return value of charstring_buffer() and use later after
+   intervening push_back's; use charstring_buffer_copy() instead. */
+const char *charstring_buffer (const charstring_t);
+/* User is responsible for free'ing result of buffer copy. */
+char *charstring_buffer_copy (const charstring_t);
+size_t charstring_bytes (const charstring_t);
+size_t charstring_chars (const charstring_t);
+/* Length of the last character in the charstring. */
+int charstring_last_char_len (const charstring_t);
+
 /*
  * user context/profile structure
  */
 /*
  * user context/profile structure
  */
@@ -55,6 +89,11 @@ struct node {
 #define        UNKWNSW  (-1)   /* from smatch() on unknown switch   */
 
 struct swit {
 #define        UNKWNSW  (-1)   /* from smatch() on unknown switch   */
 
 struct swit {
+
+    /*
+     * Switch name
+     */
+
     char *sw;
 
     /* The minchars field is apparently used like this:
     char *sw;
 
     /* The minchars field is apparently used like this:
@@ -63,35 +102,71 @@ struct swit {
        0  : Switch can't be abbreviated;               switch shown in -help.
        #  : Switch can be abbreviated to # characters; switch shown in -help. */
     int minchars;
        0  : Switch can't be abbreviated;               switch shown in -help.
        #  : Switch can be abbreviated to # characters; switch shown in -help. */
     int minchars;
+
+    /*
+     * If we pick this switch, return this value from smatch
+     */
+
+    int swret;
 };
 
 };
 
-extern struct swit anoyes[];   /* standard yes/no switches */
+/*
+ * Macros to use when declaring struct swit arrays.
+ *
+ * These macros use a technique known as X-Macros.  In your source code you
+ * use them like this:
+ *
+ * #define FOO_SWITCHES \
+ *    X("switch1", 0, SWITCHSW) \
+ *    X("switch2", 0, SWITCH2SW) \
+ *    X("thirdswitch", 2, SWITCH3SW) \
+ *
+ * The argument to each entry in FOO_SWITCHES are the switch name (sw),
+ * the minchars field (see above) and the return value for this switch.
+ * Note that the last entry in the above definition must either omit the
+ * continuation backslash, or be followed by a blank line.  In the nmh
+ * code the style is to have every line include a backslash and follow
+ * the SWITCHES macro definition by a blank line.
+ *
+ * After you define FOO_SWITCHES, you instantiate it as follows:
+ *
+ * #define X(sw, minchars, id) id,
+ * DEFINE_SWITCH_ENUM(FOO);
+ * #undef X
+ *
+ * #define X(sw, minchars, id) { sw, minchars, id },
+ * DEFINE_SWITCH_ARRAY(FOO);
+ * #undef X
+ *
+ * DEFINE_SWITCH_ENUM defines an extra enum at the end of the list called
+ * LEN_FOO.
+ */
 
 
-#define ATTACHFORMATS 3                /* Number of send attach formats. */
+#define DEFINE_SWITCH_ENUM(name) \
+    enum { \
+       name ## _SWITCHES \
+       LEN_ ## name \
+    }
+
+#define DEFINE_SWITCH_ARRAY(name, array) \
+    static struct swit array[] = { \
+       name ## _SWITCHES \
+       { NULL, 0, 0 } \
+    }
+
+extern struct swit anoyes[];   /* standard yes/no switches */
 
 /*
  * general folder attributes
  */
 #define READONLY   (1<<0)      /* No write access to folder    */
 
 /*
  * general folder attributes
  */
 #define READONLY   (1<<0)      /* No write access to folder    */
-#define        SEQMOD     (1<<1)       /* folder's sequences modifed   */
+#define        SEQMOD     (1<<1)       /* folder's sequences modified   */
 #define        ALLOW_NEW  (1<<2)       /* allow the "new" sequence     */
 #define        OTHERS     (1<<3)       /* folder has other files       */
 #define        MODIFIED   (1<<4)       /* msh in-core folder modified  */
 
 #define        FBITS "\020\01READONLY\02SEQMOD\03ALLOW_NEW\04OTHERS\05MODIFIED"
 
 #define        ALLOW_NEW  (1<<2)       /* allow the "new" sequence     */
 #define        OTHERS     (1<<3)       /* folder has other files       */
 #define        MODIFIED   (1<<4)       /* msh in-core folder modified  */
 
 #define        FBITS "\020\01READONLY\02SEQMOD\03ALLOW_NEW\04OTHERS\05MODIFIED"
 
-/*
- * type for holding the sequence set of a message
- */
-typedef unsigned int seqset_t;
-
-/*
- * Determine the number of user defined sequences we
- * can have.  The first 5 sequence flags are for
- * internal nmh message flags.
- */
-#define        NUMATTRS  ((sizeof(seqset_t) * Nbby) - 5)
-
 /*
  * first free slot for user defined sequences
  * and attributes
 /*
  * first free slot for user defined sequences
  * and attributes
@@ -101,14 +176,48 @@ typedef unsigned int seqset_t;
 /*
  * internal messages attributes (sequences)
  */
 /*
  * internal messages attributes (sequences)
  */
-#define EXISTS        (1<<0)   /* exists            */
-#define DELETED       (1<<1)   /* deleted           */
-#define SELECTED      (1<<2)   /* selected for use  */
-#define SELECT_EMPTY  (1<<3)   /* "new" message     */
-#define        SELECT_UNSEEN (1<<4)    /* inc/show "unseen" */
+#define EXISTS        (0)      /* exists            */
+#define DELETED       (1)      /* deleted           */
+#define SELECTED      (2)      /* selected for use  */
+#define SELECT_EMPTY  (3)      /* "new" message     */
+#define        SELECT_UNSEEN (4)       /* inc/show "unseen" */
 
 #define        MBITS "\020\01EXISTS\02DELETED\03SELECTED\04NEW\05UNSEEN"
 
 
 #define        MBITS "\020\01EXISTS\02DELETED\03SELECTED\04NEW\05UNSEEN"
 
+/*
+ * type for holding the sequence set of a message
+ */
+typedef struct bvector *bvector_t;
+
+bvector_t bvector_create (size_t /* initial size in bits, can be 0 */);
+void bvector_copy (bvector_t, bvector_t);
+void bvector_free (bvector_t);
+void bvector_clear (bvector_t, size_t);
+void bvector_clear_all (bvector_t);
+void bvector_set (bvector_t, size_t);
+unsigned int bvector_at (bvector_t, size_t);
+const unsigned long *bvector_bits (bvector_t);
+size_t bvector_maxsize (bvector_t);
+
+typedef struct svector *svector_t;
+
+svector_t svector_create (size_t);
+void svector_free (svector_t);
+char *svector_push_back (svector_t, char *);
+char *svector_at (svector_t, size_t);
+char **svector_find(svector_t, const char *);
+char **svector_strs (svector_t);
+size_t svector_size (svector_t);
+
+typedef struct ivector *ivector_t;
+
+ivector_t ivector_create (size_t);
+void ivector_free (ivector_t);
+int ivector_push_back (ivector_t, int);
+int ivector_at (ivector_t, size_t);
+int *ivector_atp (ivector_t, size_t);
+size_t ivector_size (ivector_t);
+
 /*
  * Primary structure of folder/message information
  */
 /*
  * Primary structure of folder/message information
  */
@@ -127,16 +236,15 @@ struct msgs {
     char *foldpath;    /* Pathname of folder                */
 
     /*
     char *foldpath;    /* Pathname of folder                */
 
     /*
-     * Name of sequences in this folder.  We add an
-     * extra slot, so we can NULL terminate the list.
+     * Name of sequences in this folder.
      */
      */
-    char *msgattrs[NUMATTRS + 1];
+    svector_t msgattrs;
 
     /*
      * bit flags for whether sequence
      * is public (0), or private (1)
      */
 
     /*
      * bit flags for whether sequence
      * is public (0), or private (1)
      */
-    seqset_t attrstats;
+    bvector_t attrstats;
 
     /*
      * These represent the lowest and highest possible
 
     /*
      * These represent the lowest and highest possible
@@ -147,64 +255,83 @@ struct msgs {
     int        hghoff;
 
     /*
     int        hghoff;
 
     /*
-     * This is an array of seqset_t which we allocate dynamically.
-     * Each seqset_t is a set of bits flags for a particular message.
+     * This is an array of bvector_t which we allocate dynamically.
+     * Each bvector_t is a set of bits flags for a particular message.
      * These bit flags represent general attributes such as
      * EXISTS, SELECTED, etc. as well as track if message is
      * in a particular sequence.
      */
      * These bit flags represent general attributes such as
      * EXISTS, SELECTED, etc. as well as track if message is
      * in a particular sequence.
      */
-    seqset_t *msgstats;                /* msg status */
+    size_t num_msgstats;
+    bvector_t *msgstats;       /* msg status */
+
+    /*
+     * A FILE handle containing an open filehandle for the sequence file
+     * for this folder.  If non-NULL, use it when the sequence file is
+     * written.
+     */
+    FILE *seqhandle;
+
+    /*
+     * The name of the public sequence file; required by lkfclose()
+     */
+    char *seqname;
 };
 
 /*
  * Amount of space to allocate for msgstats.  Allocate
 };
 
 /*
  * Amount of space to allocate for msgstats.  Allocate
- * the array to have space for messages numbers lo to hi.
+ * the array to have space for messages numbered lo to hi.
+ * Use MSGSTATNUM to load mp->num_msgstats first.
  */
  */
-#define MSGSTATSIZE(mp,lo,hi) ((size_t) (((hi) - (lo) + 1) * sizeof(*(mp)->msgstats)))
+#define MSGSTATNUM(lo, hi) ((size_t) ((hi) - (lo) + 1))
+#define MSGSTATSIZE(mp) ((mp)->num_msgstats * sizeof *(mp)->msgstats)
 
 /*
  * macros for message and sequence manipulation
  */
 
 /*
  * macros for message and sequence manipulation
  */
-#define clear_msg_flags(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] = 0)
-#define copy_msg_flags(mp,i,j) \
-       ((mp)->msgstats[(i) - mp->lowoff] = (mp)->msgstats[(j) - mp->lowoff])
-#define get_msg_flags(mp,ptr,msgnum)  (*(ptr) = (mp)->msgstats[(msgnum) - mp->lowoff])
-#define set_msg_flags(mp,ptr,msgnum)  ((mp)->msgstats[(msgnum) - mp->lowoff] = *(ptr))
-
-#define does_exist(mp,msgnum)     ((mp)->msgstats[(msgnum) - mp->lowoff] & EXISTS)
-#define unset_exists(mp,msgnum)   ((mp)->msgstats[(msgnum) - mp->lowoff] &= ~EXISTS)
-#define set_exists(mp,msgnum)     ((mp)->msgstats[(msgnum) - mp->lowoff] |= EXISTS)
-
-#define is_selected(mp,msgnum)    ((mp)->msgstats[(msgnum) - mp->lowoff] & SELECTED)
-#define unset_selected(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] &= ~SELECTED)
-#define set_selected(mp,msgnum)   ((mp)->msgstats[(msgnum) - mp->lowoff] |= SELECTED)
-
-#define is_select_empty(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] & SELECT_EMPTY)
+#define msgstat(mp,n) (mp)->msgstats[(n) - mp->lowoff]
+#define clear_msg_flags(mp,msgnum)   bvector_clear_all (msgstat(mp, msgnum))
+#define copy_msg_flags(mp,i,j)       bvector_copy (msgstat(mp,i), msgstat(mp,j))
+#define get_msg_flags(mp,ptr,msgnum) bvector_copy (ptr, msgstat(mp, msgnum))
+#define set_msg_flags(mp,ptr,msgnum) bvector_copy (msgstat(mp, msgnum), ptr)
+
+#define does_exist(mp,msgnum)     bvector_at (msgstat(mp, msgnum), EXISTS)
+#define unset_exists(mp,msgnum)   bvector_clear (msgstat(mp, msgnum), EXISTS)
+#define set_exists(mp,msgnum)     bvector_set (msgstat(mp, msgnum), EXISTS)
+
+#define is_selected(mp,msgnum)    bvector_at (msgstat(mp, msgnum), SELECTED)
+#define unset_selected(mp,msgnum) bvector_clear (msgstat(mp, msgnum), SELECTED)
+#define set_selected(mp,msgnum)   bvector_set (msgstat(mp, msgnum), SELECTED)
+
+#define is_select_empty(mp,msgnum)  \
+        bvector_at (msgstat(mp, msgnum), SELECT_EMPTY)
 #define set_select_empty(mp,msgnum) \
 #define set_select_empty(mp,msgnum) \
-       ((mp)->msgstats[(msgnum) - mp->lowoff] |= SELECT_EMPTY)
+        bvector_set (msgstat(mp, msgnum), SELECT_EMPTY)
 
 
-#define is_unseen(mp,msgnum)      ((mp)->msgstats[(msgnum) - mp->lowoff] & SELECT_UNSEEN)
-#define unset_unseen(mp,msgnum)   ((mp)->msgstats[(msgnum) - mp->lowoff] &= ~SELECT_UNSEEN)
-#define set_unseen(mp,msgnum)     ((mp)->msgstats[(msgnum) - mp->lowoff] |= SELECT_UNSEEN)
+#define is_unseen(mp,msgnum) \
+        bvector_at (msgstat(mp, msgnum), SELECT_UNSEEN)
+#define unset_unseen(mp,msgnum) \
+        bvector_clear (msgstat(mp, msgnum), SELECT_UNSEEN)
+#define set_unseen(mp,msgnum) \
+        bvector_set (msgstat(mp, msgnum), SELECT_UNSEEN)
 
 /* for msh only */
 
 /* for msh only */
-#define set_deleted(mp,msgnum)    ((mp)->msgstats[(msgnum) - mp->lowoff] |= DELETED)
+#define set_deleted(mp,msgnum)     bvector_set (msgstat(mp, msgnum), DELETED)
 
 #define in_sequence(mp,seqnum,msgnum) \
 
 #define in_sequence(mp,seqnum,msgnum) \
-           ((mp)->msgstats[(msgnum) - mp->lowoff] & (1 << (FFATTRSLOT + seqnum)))
+        bvector_at (msgstat(mp, msgnum), FFATTRSLOT + seqnum)
 #define clear_sequence(mp,seqnum,msgnum) \
 #define clear_sequence(mp,seqnum,msgnum) \
-           ((mp)->msgstats[(msgnum) - mp->lowoff] &= ~(1 << (FFATTRSLOT + seqnum)))
+        bvector_clear (msgstat(mp, msgnum), FFATTRSLOT + seqnum)
 #define add_sequence(mp,seqnum,msgnum) \
 #define add_sequence(mp,seqnum,msgnum) \
-           ((mp)->msgstats[(msgnum) - mp->lowoff] |= (1 << (FFATTRSLOT + seqnum)))
+        bvector_set (msgstat(mp, msgnum), FFATTRSLOT + seqnum)
 
 #define is_seq_private(mp,seqnum) \
 
 #define is_seq_private(mp,seqnum) \
-           ((mp)->attrstats & (1 << (FFATTRSLOT + seqnum)))
+        bvector_at (mp->attrstats, FFATTRSLOT + seqnum)
 #define make_seq_public(mp,seqnum) \
 #define make_seq_public(mp,seqnum) \
-           ((mp)->attrstats &= ~(1 << (FFATTRSLOT + seqnum)))
+        bvector_clear (mp->attrstats, FFATTRSLOT + seqnum)
 #define make_seq_private(mp,seqnum) \
 #define make_seq_private(mp,seqnum) \
-           ((mp)->attrstats |= (1 << (FFATTRSLOT + seqnum)))
+        bvector_set (mp->attrstats, FFATTRSLOT + seqnum)
 #define make_all_public(mp) \
 #define make_all_public(mp) \
-           ((mp)->attrstats = 0)
+        mp->attrstats = bvector_create(0); bvector_clear_all (mp->attrstats)
 
 /*
  * macros for folder attributes
 
 /*
  * macros for folder attributes
@@ -250,7 +377,6 @@ typedef struct m_getfld_state *m_getfld_state_t;
 #define        MS_UNKNOWN      1       /* type not known yet         */
 #define        MS_MBOX         2       /* Unix-style "from" lines    */
 #define        MS_MMDF         3       /* string mmdlm2              */
 #define        MS_UNKNOWN      1       /* type not known yet         */
 #define        MS_MBOX         2       /* Unix-style "from" lines    */
 #define        MS_MMDF         3       /* string mmdlm2              */
-#define        MS_MSH          4       /* whacko msh                 */
 
 #define        NOUSE   0               /* draft being re-used */
 
 
 #define        NOUSE   0               /* draft being re-used */
 
@@ -263,7 +389,16 @@ typedef struct m_getfld_state *m_getfld_state_t;
 #define LINK   "@"             /* Name of link to file to which you are */
                                /* replying. */
 
 #define LINK   "@"             /* Name of link to file to which you are */
                                /* replying. */
 
-#define NMH_ATTACH_HEADER "Nmh-Attachment"  /* Default header for -attach */
+/*
+ * credentials management
+ */
+struct nmh_creds {
+    char *host;
+    char *user;
+    char *password;
+};
+
+typedef struct nmh_creds *nmh_creds_t;
 
 /*
  * miscellaneous macros
 
 /*
  * miscellaneous macros
@@ -313,7 +448,8 @@ extern char *catproc;
 extern char *components;
 extern char *context;
 extern char *current;
 extern char *components;
 extern char *context;
 extern char *current;
-extern char *defaulteditor;
+extern char *credentials_file;
+extern int credentials_no_perm_check;
 extern char *defaultfolder;
 extern char *digestcomps;
 extern char *distcomps;
 extern char *defaultfolder;
 extern char *digestcomps;
 extern char *distcomps;
@@ -324,7 +460,6 @@ extern char *formatproc;
 extern char *forwcomps;
 extern char *inbox;
 extern char *incproc;
 extern char *forwcomps;
 extern char *inbox;
 extern char *incproc;
-extern char *installproc;
 extern char *lproc;
 extern char *mailproc;
 extern char *mh_defaults;
 extern char *lproc;
 extern char *mailproc;
 extern char *mh_defaults;
@@ -336,8 +471,8 @@ extern char *mhlproc;
 extern char *mhlreply;
 extern char *moreproc;
 extern char *msgprot;
 extern char *mhlreply;
 extern char *moreproc;
 extern char *msgprot;
-extern char *mshproc;
 extern char *nmhaccessftp;
 extern char *nmhaccessftp;
+extern char *nmhaccessurl;
 extern char *nmhstorage;
 extern char *nmhcache;
 extern char *nmhprivcache;
 extern char *nmhstorage;
 extern char *nmhcache;
 extern char *nmhprivcache;
@@ -355,9 +490,9 @@ extern char *sendproc;
 extern char *showmimeproc;
 extern char *showproc;
 extern char *usequence;
 extern char *showmimeproc;
 extern char *showproc;
 extern char *usequence;
+extern char *user_agent;
 extern char *version_num;
 extern char *version_str;
 extern char *version_num;
 extern char *version_str;
-extern char *vmhproc;
 extern char *whatnowproc;
 extern char *whomproc;
 
 extern char *whatnowproc;
 extern char *whomproc;