+#define EXISTS (0) /* exists */
+#define SELECTED (1) /* selected for use */
+#define SELECT_EMPTY (2) /* "new" message */
+#define SELECT_UNSEEN (3) /* inc/show "unseen" */
+
+#define MBITS "\020\01EXISTS\02SELECTED\03NEW\04UNSEEN"
+
+/* A vector of bits for tracking the sequence membership of a single
+ * message. Do not access the struct members; use vector.c.
+ * Do not move or copy this struct as it may contain a pointer to
+ * itself; use bvector_copy(). */
+struct bvector {
+ unsigned long *bits;
+ size_t maxsize;
+ unsigned long tiny[2]; /* Default fixed-size storage for bits. */
+};
+typedef struct bvector *bvector_t;
+
+bvector_t bvector_create (void);
+void bvector_init(struct bvector *bv);
+void bvector_copy (bvector_t, bvector_t);
+void bvector_free (bvector_t);
+void bvector_fini(struct bvector *bv);
+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);
+unsigned long bvector_first_bits (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);