struct maildir *next;
};
-struct mh_sequences {
- int max;
- short *flags;
-};
+typedef struct mh_sequences {
+ int size;
+ char flags[];
+} mh_sequences;
/* mh_sequences support */
-
#define MH_SEQ_UNSEEN (1 << 0)
#define MH_SEQ_REPLIED (1 << 1)
#define MH_SEQ_FLAGGED (1 << 2)
static int maildir_check_mailbox (CONTEXT*, int*, int);
static int mh_check_mailbox (CONTEXT*, int*, int);
-static void mhs_alloc (struct mh_sequences *mhs, int i)
+static mh_sequences *mhs_new(void)
{
- int j;
- int newmax;
-
- if (i > mhs->max || !mhs->flags) {
- newmax = i + 128;
- p_realloc(&mhs->flags, newmax + 1);
- for (j = mhs->max + 1; j <= newmax; j++)
- mhs->flags[j] = 0;
+ mh_sequences *res = xmalloc(sizeof(mh_sequences) + 128);
+ res->size = 128;
+ return res;
+}
- mhs->max = newmax;
- }
+static void mhs_ensure(mh_sequences *mhs, int i)
+{
+ if (i > mhs->size) {
+ xrealloc((void *)&mhs, sizeof(mh_sequences) + mhs->size + 128);
+ p_clear(mhs->flags + mhs->size, 128);
+ mhs->size += 128;
+ }
}
-static void mhs_free_sequences (struct mh_sequences *mhs)
+static void mhs_delete(mh_sequences **mhs)
{
- p_delete(&mhs->flags);
+ p_delete(mhs);
}
static short mhs_check (struct mh_sequences *mhs, int i)
{
- if (!mhs->flags || i > mhs->max)
- return 0;
- else
- return mhs->flags[i];
+ return i > mhs->size ? 0 : mhs->flags[i];
}
static short mhs_set (struct mh_sequences *mhs, int i, short f)
{
- mhs_alloc (mhs, i);
- mhs->flags[i] |= f;
- return mhs->flags[i];
+ mhs_ensure(mhs, i);
+ mhs->flags[i] |= f;
+ return mhs->flags[i];
}
static void mh_read_token (char *t, int *first, int *last)
int mh_buffy (const char *path)
{
- int i, r = 0;
- struct mh_sequences mhs;
-
- p_clear(&mhs, 1);
+ mh_sequences *mhs = mhs_new();
+ int i;
+
+ mh_read_sequences(mhs, path);
+ for (i = 0; i <= mhs->size; i++) {
+ if (mhs_check(mhs, i) & MH_SEQ_UNSEEN) {
+ mhs_delete(&mhs);
+ return 1;
+ }
+ }
- mh_read_sequences (&mhs, path);
- for (i = 0; !r && i <= mhs.max; i++)
- if (mhs_check (&mhs, i) & MH_SEQ_UNSEEN)
- r = 1;
- mhs_free_sequences (&mhs);
- return r;
+ mhs_delete(&mhs);
+ return 0;
}
static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt)
return 0;
}
-static void mhs_write_one_sequence (FILE * fp, struct mh_sequences *mhs,
- short f, const char *tag)
+static void mhs_write_one_sequence(FILE * fp, struct mh_sequences *mhs,
+ short f, const char *tag)
{
int i;
int first, last;
first = -1;
last = -1;
- for (i = 0; i <= mhs->max; i++) {
+ for (i = 0; i <= mhs->size; i++) {
if ((mhs_check (mhs, i) & f)) {
if (first < 0)
first = i;
char seq_unseen[STRING];
char seq_replied[STRING];
char seq_flagged[STRING];
+ mh_sequences *mhs = mhs_new();
-
- struct mh_sequences mhs;
-
- p_clear(&mhs, 1);
-
- snprintf (seq_unseen, sizeof (seq_unseen), "%s:", NONULL (MhUnseen));
- snprintf (seq_replied, sizeof (seq_replied), "%s:", NONULL (MhReplied));
- snprintf (seq_flagged, sizeof (seq_flagged), "%s:", NONULL (MhFlagged));
+ snprintf(seq_unseen, sizeof(seq_unseen), "%s:", NONULL(MhUnseen));
+ snprintf(seq_replied, sizeof(seq_replied), "%s:", NONULL(MhReplied));
+ snprintf(seq_flagged, sizeof(seq_flagged), "%s:", NONULL(MhFlagged));
if (mh_mkstemp (ctx, &nfp, &tmpfname) != 0) {
/* error message? */
i = atoi (p);
if (!ctx->hdrs[l]->read) {
- mhs_set (&mhs, i, MH_SEQ_UNSEEN);
+ mhs_set(mhs, i, MH_SEQ_UNSEEN);
unseen++;
}
if (ctx->hdrs[l]->flagged) {
- mhs_set (&mhs, i, MH_SEQ_FLAGGED);
+ mhs_set(mhs, i, MH_SEQ_FLAGGED);
flagged++;
}
if (ctx->hdrs[l]->replied) {
- mhs_set (&mhs, i, MH_SEQ_REPLIED);
+ mhs_set(mhs, i, MH_SEQ_REPLIED);
replied++;
}
}
/* write out the new sequences */
if (unseen)
- mhs_write_one_sequence (nfp, &mhs, MH_SEQ_UNSEEN, NONULL (MhUnseen));
+ mhs_write_one_sequence(nfp, mhs, MH_SEQ_UNSEEN, NONULL (MhUnseen));
if (flagged)
- mhs_write_one_sequence (nfp, &mhs, MH_SEQ_FLAGGED, NONULL (MhFlagged));
+ mhs_write_one_sequence(nfp, mhs, MH_SEQ_FLAGGED, NONULL (MhFlagged));
if (replied)
- mhs_write_one_sequence (nfp, &mhs, MH_SEQ_REPLIED, NONULL (MhReplied));
-
- mhs_free_sequences (&mhs);
+ mhs_write_one_sequence(nfp, mhs, MH_SEQ_REPLIED, NONULL (MhReplied));
+ mhs_delete(&mhs);
/* try to commit the changes - no guarantee here */
m_fclose(&nfp);
*/
static int _mh_read_dir (CONTEXT * ctx, const char *subdir)
{
- struct maildir *md;
- struct mh_sequences mhs;
- struct maildir **last;
- int count;
-
-
- p_clear(&mhs, 1);
+ struct maildir *md = NULL, **last = &md;
+ int count = 0;
maildir_update_mtime (ctx);
- md = NULL;
- last = &md;
- count = 0;
if (maildir_parse_dir (ctx, &last, subdir, &count) == -1)
return -1;
if (ctx->magic == M_MH) {
- mh_read_sequences (&mhs, ctx->path);
- mh_update_maildir (md, &mhs);
- mhs_free_sequences (&mhs);
+ mh_sequences *mhs = mhs_new();
+ mh_read_sequences(mhs, ctx->path);
+ mh_update_maildir(md, mhs);
+ mhs_delete(&mhs);
}
if (ctx->magic == M_MAILDIR)
char buf[_POSIX_PATH_MAX];
struct stat st, st_cur;
short modified = 0, have_new = 0, occult = 0;
- struct maildir *md, *p;
- struct maildir **last = NULL;
- struct mh_sequences mhs;
+ struct maildir *md = NULL, **last = &md, *p;
+ mh_sequences *mhs;
hash_t *fnames;
int i;
ctx->mtime_cur = st_cur.st_mtime;
ctx->mtime = st.st_mtime;
- p_clear(&mhs, 1);
-
- md = NULL;
- last = &md;
maildir_parse_dir (ctx, &last, NULL, NULL);
- mh_read_sequences (&mhs, ctx->path);
- mh_update_maildir (md, &mhs);
- mhs_free_sequences (&mhs);
+ mhs = mhs_new();
+ mh_read_sequences(mhs, ctx->path);
+ mh_update_maildir(md, mhs);
+ mhs_delete(&mhs);
/* check for modifications and adjust flags */
fnames = hash_new (1031, 0);
}
-
-
/*
* These functions try to find a message in a maildir folder when it
* has moved under our feet. Note that this code is rather expensive, but
* then again, it's called rarely.
*/
-
-static FILE *_maildir_open_find_message (const char *folder, const char *unique,
- const char *subfolder)
+static FILE *_maildir_open_find_message(const char *folder, const char *unique,
+ const char *subfolder)
{
char dir[_POSIX_PATH_MAX];
char tunique[_POSIX_PATH_MAX];