*/
#define MSGSTATSIZE(mp,lo,hi) ((size_t) (((hi) - (lo) + 1) * sizeof(*(mp)->msgstats)))
-/*
-** 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_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 in_sequence(mp,seqnum,msgnum) \
- ((mp)->msgstats[(msgnum) - mp->lowoff] & (1 << (FFATTRSLOT + seqnum)))
-#define clear_sequence(mp,seqnum,msgnum) \
- ((mp)->msgstats[(msgnum) - mp->lowoff] &= ~(1 << (FFATTRSLOT + seqnum)))
-#define add_sequence(mp,seqnum,msgnum) \
- ((mp)->msgstats[(msgnum) - mp->lowoff] |= (1 << (FFATTRSLOT + seqnum)))
-
-#define is_seq_private(mp,seqnum) \
- ((mp)->attrstats & (1 << (FFATTRSLOT + seqnum)))
-#define make_seq_public(mp,seqnum) \
- ((mp)->attrstats &= ~(1 << (FFATTRSLOT + seqnum)))
-#define make_seq_private(mp,seqnum) \
- ((mp)->attrstats |= (1 << (FFATTRSLOT + seqnum)))
-#define make_all_public(mp) \
- ((mp)->attrstats = 0)
-
-/*
-** macros for folder attributes
-*/
-#define clear_folder_flags(mp) ((mp)->msgflags = 0)
-
-#define is_readonly(mp) ((mp)->msgflags & READONLY)
-#define set_readonly(mp) ((mp)->msgflags |= READONLY)
-
-#define other_files(mp) ((mp)->msgflags & OTHERS)
-#define set_other_files(mp) ((mp)->msgflags |= OTHERS)
-
#define NULLMP ((struct msgs *) 0)
/*
char *LocalName(void); /* hostname */
char *getusername(void);
char *getfullname(void);
+
+
+/*
+** prototypes for message and sequence manipulation
+*/
+void clear_msg_flags(struct msgs *, int);
+void copy_msg_flags(struct msgs *, int, int);
+void get_msg_flags(struct msgs *, seqset_t *, int);
+void set_msg_flags(struct msgs *, seqset_t *, int);
+seqset_t does_exist(struct msgs *, int);
+void unset_exists(struct msgs *, int);
+void set_exists(struct msgs *, int);
+seqset_t is_selected(struct msgs *, int);
+void unset_selected(struct msgs *, int);
+void set_selected(struct msgs *, int);
+seqset_t is_unseen(struct msgs *, int);
+void unset_unseen(struct msgs *, int);
+void set_unseen(struct msgs *, int);
+seqset_t in_sequence(struct msgs *, int, int);
+void clear_sequence(struct msgs *, int, int);
+void add_sequence(struct msgs *, int, int);
+
+int is_seq_private(struct msgs *, int);
+void make_seq_public(struct msgs *, int);
+void make_seq_private(struct msgs *, int);
+void make_all_public(struct msgs *);
+
+void clear_folder_flags(struct msgs *);
+int is_readonly(struct msgs *);
+void set_readonly(struct msgs *);
+int other_files(struct msgs *);
+void set_other_files(struct msgs *);
seq_setprev.c seq_setunseen.c signals.c \
smatch.c snprintb.c strcasecmp.c \
strindex.c trim.c trimcpy.c uprf.c vfgets.c fmt_def.c \
- mf.c utils.c m_mktemp.c
+ mf.c utils.c m_mktemp.c seq_msgstats.c
OBJS = $(SRCS:.c=.o)
--- /dev/null
+/*
+** seq_msgstats -- message and sequence manipulation and folder attributes
+**
+** (These functions had once been macros in h/mh.h)
+*/
+
+#include <h/mh.h>
+
+static void
+assert_msg_range(struct msgs *mp, int msgnum)
+{
+ if (msgnum < mp->lowoff || msgnum > mp->hghoff) {
+ adios(NULL, "Bug: message out of bounds");
+ }
+}
+
+
+void
+add_sequence(struct msgs *mp, int seqnum, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ mp->msgstats[msgnum - mp->lowoff] |= (1 << (FFATTRSLOT + seqnum));
+}
+
+void
+clear_msg_flags(struct msgs *mp, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ mp->msgstats[msgnum - mp->lowoff] = 0;
+}
+
+void
+clear_sequence(struct msgs *mp, int seqnum, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ mp->msgstats[msgnum - mp->lowoff] &= ~(1 << (FFATTRSLOT + seqnum));
+}
+
+void
+copy_msg_flags(struct msgs *mp, int dstmsg, int srcmsg)
+{
+ assert_msg_range(mp, srcmsg);
+ assert_msg_range(mp, dstmsg);
+ mp->msgstats[dstmsg - mp->lowoff] = mp->msgstats[srcmsg - mp->lowoff];
+}
+
+seqset_t
+does_exist(struct msgs *mp, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ return mp->msgstats[msgnum - mp->lowoff] & EXISTS;
+}
+
+void
+get_msg_flags(struct msgs *mp, seqset_t *dst, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ *dst = mp->msgstats[msgnum - mp->lowoff];
+}
+
+seqset_t
+in_sequence(struct msgs *mp, int seqnum, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ return mp->msgstats[msgnum - mp->lowoff] & (1 << (FFATTRSLOT + seqnum));
+}
+
+seqset_t
+is_selected(struct msgs *mp, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ return mp->msgstats[msgnum - mp->lowoff] & SELECTED;
+}
+
+seqset_t
+is_unseen(struct msgs *mp, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ return mp->msgstats[msgnum - mp->lowoff] & SELECT_UNSEEN;
+}
+
+void
+set_exists(struct msgs *mp, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ mp->msgstats[msgnum - mp->lowoff] |= EXISTS;
+}
+
+void
+set_msg_flags(struct msgs *mp, seqset_t *src, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ mp->msgstats[msgnum - mp->lowoff] = *src;
+}
+
+void
+set_selected(struct msgs *mp, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ mp->msgstats[msgnum - mp->lowoff] |= SELECTED;
+}
+
+void
+set_unseen(struct msgs *mp, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ mp->msgstats[msgnum - mp->lowoff] |= SELECT_UNSEEN;
+}
+
+void
+unset_exists(struct msgs *mp, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ mp->msgstats[msgnum - mp->lowoff] &= ~EXISTS;
+}
+
+void
+unset_selected(struct msgs *mp, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ mp->msgstats[msgnum - mp->lowoff] &= ~SELECTED;
+}
+
+void
+unset_unseen(struct msgs *mp, int msgnum)
+{
+ assert_msg_range(mp, msgnum);
+ mp->msgstats[msgnum - mp->lowoff] &= ~SELECT_UNSEEN;
+}
+
+
+/*
+** private/public sequences
+*/
+
+int
+is_seq_private(struct msgs *mp, int seqnum)
+{
+ return mp->attrstats & (1 << (FFATTRSLOT + seqnum));
+}
+
+void
+make_seq_public(struct msgs *mp, int seqnum)
+{
+ mp->attrstats &= ~(1 << (FFATTRSLOT + seqnum));
+}
+void
+make_seq_private(struct msgs *mp, int seqnum)
+{
+ mp->attrstats |= (1 << (FFATTRSLOT + seqnum));
+}
+void
+make_all_public(struct msgs *mp)
+{
+ mp->attrstats = 0;
+}
+
+
+/*
+** folder attributes
+*/
+
+void
+clear_folder_flags(struct msgs *mp)
+{
+ mp->msgflags = 0;
+}
+
+int
+is_readonly(struct msgs *mp)
+{
+ return mp->msgflags & READONLY;
+}
+void
+set_readonly(struct msgs *mp)
+{
+ mp->msgflags |= READONLY;
+}
+
+int
+other_files(struct msgs *mp)
+{
+ return mp->msgflags & OTHERS;
+}
+void
+set_other_files(struct msgs *mp)
+{
+ mp->msgflags |= OTHERS;
+}