X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/68e8c25f906e7353269502d2292c8e99aa8c6605..26c2b1ef1709cd7b34fe3e78995768a369e0f116:/sbr/m_getfld.c diff --git a/sbr/m_getfld.c b/sbr/m_getfld.c index fa651835..77dbeda1 100644 --- a/sbr/m_getfld.c +++ b/sbr/m_getfld.c @@ -58,7 +58,6 @@ int edelimlen char *msg_delim int msg_style - int (*eom_action)(int) Usage ===== @@ -204,12 +203,11 @@ * static prototypes */ struct m_getfld_state; -static int m_Eom (m_getfld_state_t, int); +static int m_Eom (m_getfld_state_t); static char *matchc(int, char *, int, char *); #define eom(c,s) (s->msg_style != MS_DEFAULT && \ - (((c) == *s->msg_delim && m_Eom(s,c)) || \ - (s->eom_action && (*s->eom_action)(c)))) + ((c) == *s->msg_delim && m_Eom(s))) /* This replaces the old approach, with its direct access to stdio * internals. It uses one fread() to load a buffer that we manage. @@ -261,7 +259,6 @@ struct m_getfld_state { int fdelimlen; char *edelim; int edelimlen; - int (*eom_action)(int); int state; int track_filepos; }; @@ -281,7 +278,6 @@ m_getfld_state_init (m_getfld_state_t *gstate, FILE *iob) { s->msg_delim = ""; s->fdelim = s->delimend = s->edelim = NULL; s->fdelimlen = s->edelimlen = 0; - s->eom_action = NULL; s->state = FLD; s->track_filepos = 0; } @@ -501,14 +497,12 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz, return s->state = FILEEOF; } if (eom (c, s)) { - if (! s->eom_action) { - /* flush null messages */ - while ((c = Getc(s)) >= 0 && eom (c, s)) - ; + /* flush null messages */ + while ((c = Getc(s)) >= 0 && eom (c, s)) + ; - if (c >= 0) - Ungetc(c, s); - } + if (c >= 0) + Ungetc(c, s); *bufsz = *buf = 0; leave_getfld (s); return s->state = FILEEOF; @@ -521,13 +515,11 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz, while (c != '\n' && (c = Getc(s)) >= 0) continue; if (c < 0 || (c = Getc(s)) < 0 || eom (c, s)) { - if (! s->eom_action) { - /* flush null messages */ - while ((c = Getc(s)) >= 0 && eom (c, s)) - ; - if (c >= 0) - Ungetc(c, s); - } + /* flush null messages */ + while ((c = Getc(s)) >= 0 && eom (c, s)) + ; + if (c >= 0) + Ungetc(c, s); *bufsz = *buf = 0; leave_getfld (s); return s->state = FILEEOF; @@ -796,8 +788,11 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob) s->msg_style = MS_UNKNOWN; for (i = 0, cp = text; i < sizeof text; ++i, ++cp) { - if ((signed char) (*cp = Getc (s)) == EOF) { + if ((c = Getc (s)) == EOF) { + *cp = '\0'; break; + } else { + *cp = c; } } @@ -852,15 +847,20 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob) */ static int -m_Eom (m_getfld_state_t s, int c) +m_Eom (m_getfld_state_t s) { register int i; char text[MAX_DELIMITER_SIZE]; char *cp; for (i = 0, cp = text; i < s->edelimlen; ++i, ++cp) { - if ((signed char) (*cp = Getc (s)) == EOF) { + int c2; + + if ((c2 = Getc (s)) == EOF) { + *cp = '\0'; break; + } else { + *cp = c2; } } @@ -881,6 +881,7 @@ m_Eom (m_getfld_state_t s, int c) } if (s->msg_style == MS_MBOX) { + int c; while ((c = Getc (s)) != '\n') if (c < 0) break;