/** * mh_read_sequences - Read a set of MH sequences * @param mhs Existing sequences * @param path File to read from * @retval 0 Success * @retval -1 Error */ int mh_read_sequences(struct MhSequences *mhs, const char *path) { int line = 1; char *buf = NULL; size_t sz = 0; MhSeqFlags flags; int first, last, rc = 0; char pathname[PATH_MAX]; snprintf(pathname, sizeof(pathname), "%s/.mh_sequences", path); FILE *fp = fopen(pathname, "r"); if (!fp) return 0; /* yes, ask callers to silently ignore the error */ while ((buf = mutt_file_read_line(buf, &sz, fp, &line, 0))) { char *t = strtok(buf, " \t:"); if (!t) continue; if (mutt_str_strcmp(t, C_MhSeqUnseen) == 0) flags = MH_SEQ_UNSEEN; else if (mutt_str_strcmp(t, C_MhSeqFlagged) == 0) flags = MH_SEQ_FLAGGED; else if (mutt_str_strcmp(t, C_MhSeqReplied) == 0) flags = MH_SEQ_REPLIED; else /* unknown sequence */ continue; while ((t = strtok(NULL, " \t:"))) { if (mh_read_token(t, &first, &last) < 0) { mhs_free_sequences(mhs); rc = -1; goto out; } for (; first <= last; first++) mhs_set(mhs, first, flags); } } rc = 0; out: FREE(&buf); mutt_file_fclose(&fp); return rc; }
static void mh_read_sequences (struct mh_sequences *mhs, const char *path) { FILE *fp; int line = 1; char *buff = NULL; char *t; size_t sz = 0; short f; int first, last; char pathname[_POSIX_PATH_MAX]; snprintf (pathname, sizeof (pathname), "%s/.mh_sequences", path); if (!(fp = fopen (pathname, "r"))) return; while ((buff = mutt_read_line (buff, &sz, fp, &line))) { if (!(t = strtok (buff, " \t:"))) continue; if (!mutt_strcmp (t, MhUnseen)) f = MH_SEQ_UNSEEN; else if (!mutt_strcmp (t, MhFlagged)) f = MH_SEQ_FLAGGED; else if (!mutt_strcmp (t, MhReplied)) f = MH_SEQ_REPLIED; else /* unknown sequence */ continue; while ((t = strtok (NULL, " \t:"))) { mh_read_token (t, &first, &last); for (; first <= last; first++) mhs_set (mhs, first, f); } } safe_free ((void **) &buff); safe_fclose (&fp); }