* static prototypes
*/
static int seq_init (struct msgs *, char *, char *);
-static void seq_public (struct msgs *);
+static void seq_public (struct msgs *, int);
static void seq_private (struct msgs *);
*/
void
-seq_read (struct msgs *mp)
+seq_read (struct msgs *mp, int lockflag)
{
/*
* Initialize the list of sequence names. Go ahead and
return;
/* Initialize the public sequences */
- seq_public (mp);
+ seq_public (mp, lockflag);
/* Initialize the private sequences */
seq_private (mp);
*/
static void
-seq_public (struct msgs *mp)
+seq_public (struct msgs *mp, int lockflag)
{
int state;
char *cp, seqfile[PATH_MAX];
char name[NAMESZ], field[BUFSIZ];
FILE *fp;
+ m_getfld_state_t gstate = 0;
/*
* If mh_seq == NULL (such as if nmh been compiled with
/* get filename of sequence file */
snprintf (seqfile, sizeof(seqfile), "%s/%s", mp->foldpath, mh_seq);
- if ((fp = lkfopen (seqfile, "r")) == NULL)
+ if ((fp = lkfopendata (seqfile, lockflag ? "r+" : "r")) == NULL)
return;
/* Use m_getfld to scan sequence file */
- for (state = FLD;;) {
+ for (;;) {
int fieldsz = sizeof field;
- switch (state = m_getfld (state, name, field, &fieldsz, fp)) {
+ switch (state = m_getfld (&gstate, name, field, &fieldsz, fp)) {
case FLD:
case FLDPLUS:
if (state == FLDPLUS) {
cp = getcpy (field);
while (state == FLDPLUS) {
fieldsz = sizeof field;
- state = m_getfld (state, name, field, &fieldsz, fp);
+ state = m_getfld (&gstate, name, field, &fieldsz, fp);
cp = add (field, cp);
}
seq_init (mp, getcpy (name), trimcpy (cp));
}
continue;
- case BODY:
+ case BODY:
+ lkfclosedata (fp, seqfile);
adios (NULL, "no blank lines are permitted in %s", seqfile);
/* fall */
break;
default:
+ lkfclosedata (fp, seqfile);
adios (NULL, "%s is poorly formatted", seqfile);
}
break; /* break from for loop */
}
+ m_getfld_state_destroy (&gstate);
- lkfclose (fp, seqfile);
+ if (lockflag) {
+ mp->seqhandle = fp;
+ mp->seqname = getcpy(seqfile);
+ } else {
+ lkfclosedata (fp, seqfile);
+ }
}