X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/4165ce30f81bc078f3635a2a198f3a2ab5fc9b75..29a1ada5b960fbf29d52e0f44911370a6c0c7c5f:/sbr/m_getfld.c diff --git a/sbr/m_getfld.c b/sbr/m_getfld.c index 9e017090..2b585541 100644 --- a/sbr/m_getfld.c +++ b/sbr/m_getfld.c @@ -60,10 +60,13 @@ Usage ===== - m_getfld_state_t gstate = 0; - ... - int state = m_getfld (&gstate, ...); - ... + m_getfld_state_t gstate; + + gstate = m_getfld_state_init(mailfp); + Perhaps m_getfld_track_filepos2(&gstate); + ... + state = m_getfld2(&gstate, ...); + ...Repeat until finished with mailfp. m_getfld_state_destroy (&gstate); The state is retained internally by gstate. To reset its state to FLD: @@ -91,7 +94,7 @@ To speed things up considerably, the routine Eom() was made an auxiliary function called by the macro eom(). Unless we are bursting a maildrop, - the eom() macro returns FALSE saying we aren't at the end of the + the eom() macro returns false saying we aren't at the end of the message. The next thing to do is to read the mts.conf file and initialize @@ -346,6 +349,15 @@ m_getfld_track_filepos (m_getfld_state_t *gstate, FILE *iob) { (*gstate)->track_filepos = 1; } +/* m_getfld_track_filepos() with the existing iob. */ +void m_getfld_track_filepos2(m_getfld_state_t *gstate) +{ + if (!*gstate) + die("m_getfld_track_filepos2 without gstate"); + + m_getfld_track_filepos(gstate, (*gstate)->iob); +} + void m_getfld_state_destroy (m_getfld_state_t *gstate) { m_getfld_state_t s = *gstate; @@ -535,7 +547,7 @@ static void Ungetc(m_getfld_state_t s) { if (s->readpos == s->msg_buf) - adios(NULL, "Ungetc() at start of message buffer."); + die("Ungetc() at start of message buffer."); s->readpos--; s->bytes_read--; @@ -679,12 +691,10 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz, * characters up to the end of this field (newline * followed by non-blank) or bufsz-1 characters. */ - int finished; - cp = buf; max = *bufsz-1; n = 0; - for (finished = 0; ! finished; ) { + for (bool finished = false; !finished; ) { while (c != '\n' && c != EOF && n++ < max) { if ((c = Getc (s)) != EOF) *cp++ = c; @@ -704,14 +714,14 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz, --s->bytes_read; } s->state = FLDPLUS; - finished = 1; + finished = true; } else if (c != ' ' && c != '\t') { /* The next character is not folded whitespace, so prepare to move on to the next field. It's OK if c is EOF, it will be handled on the next call to m_getfld (). */ s->state = FLD; - finished = 1; + finished = true; } else { /* Folded header field, continues on the next line. */ } @@ -821,7 +831,7 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz, } default: - adios (NULL, "m_getfld() called with bogus state of %d", s->state); + die("m_getfld() called with bogus state of %d", s->state); } *cp = 0; @@ -831,6 +841,16 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz, } +/* m_getfld() with the existing iob. */ +int m_getfld2(m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz) +{ + if (!*gstate) + die("m_getfld2 without gstate"); + + return m_getfld(gstate, name, buf, bufsz, (*gstate)->iob); +} + + void m_unknown(m_getfld_state_t *gstate, FILE *iob) { @@ -896,7 +916,7 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob) s->edelimlen = c - 1; s->delimend = s->msg_delim + s->edelimlen; if (s->edelimlen <= 1) - adios (NULL, "maildrop delimiter must be at least 2 bytes"); + die("maildrop delimiter must be at least 2 bytes"); /* * build a Boyer-Moore end-position map for the matcher in m_getfld. @@ -904,7 +924,7 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob) * separator) or the last char (since the matchc would have found it * if it was a real delim). */ - s->pat_map = (char **) mh_xcalloc (256, sizeof(char *)); + s->pat_map = mh_xcalloc (256, sizeof(char *)); for (cp = s->fdelim + 1; cp < s->delimend; cp++ ) s->pat_map[(unsigned char)*cp] = cp; @@ -921,6 +941,16 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob) } +/* m_unknown() with the existing iob. */ +void m_unknown2(m_getfld_state_t *gstate) +{ + if (!*gstate) + die("m_unknown2 without gstate"); + + m_unknown(gstate, (*gstate)->iob); +} + + /* * test for msg delimiter string */