]> diplodocus.org Git - nmh/blobdiff - sbr/m_getfld.c
repl.c, replsbr.c: Move shared data into header file.
[nmh] / sbr / m_getfld.c
index 2458c3e5704e418b8fc93dceeb5f9d8548229800..2b5855419f52c295655338cfb41c6a00e94c7eca 100644 (file)
@@ -8,6 +8,7 @@
 #include <h/mh.h>
 #include <h/mts.h>
 #include <h/utils.h>
 #include <h/mh.h>
 #include <h/mts.h>
 #include <h/utils.h>
+#include <inttypes.h>
 
 /*
    Purpose
 
 /*
    Purpose
 
    Usage
    =====
 
    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:
    m_getfld_state_destroy (&gstate);
 
    The state is retained internally by gstate.  To reset its state to FLD:
@@ -90,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,
 
    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
    message.
 
    The next thing to do is to read the mts.conf file and initialize
 /*
  * static prototypes
  */
 /*
  * static prototypes
  */
+static void Ungetc(m_getfld_state_t s);
 static int m_Eom (m_getfld_state_t);
 
 #define eom(c,s)       (s->msg_style != MS_DEFAULT && \
 static int m_Eom (m_getfld_state_t);
 
 #define eom(c,s)       (s->msg_style != MS_DEFAULT && \
@@ -304,13 +309,11 @@ struct m_getfld_state {
     int state;
 };
 
     int state;
 };
 
-static
-void
-m_getfld_state_init (m_getfld_state_t *gstate, FILE *iob) {
+m_getfld_state_t m_getfld_state_init(FILE *iob)
+{
     m_getfld_state_t s;
 
     NEW(s);
     m_getfld_state_t s;
 
     NEW(s);
-    *gstate = s;
     s->readpos = s->end = s->msg_buf;
     s->bytes_read = s->total_bytes_read = 0;
     s->last_caller_pos = s->last_internal_pos = 0;
     s->readpos = s->end = s->msg_buf;
     s->bytes_read = s->total_bytes_read = 0;
     s->last_caller_pos = s->last_internal_pos = 0;
@@ -322,6 +325,8 @@ m_getfld_state_init (m_getfld_state_t *gstate, FILE *iob) {
     s->fdelimlen = s->edelimlen = 0;
     s->state = FLD;
     s->track_filepos = 0;
     s->fdelimlen = s->edelimlen = 0;
     s->state = FLD;
     s->track_filepos = 0;
+
+    return s;
 }
 
 /* scan() needs to force an initial state of FLD for each message. */
 }
 
 /* scan() needs to force an initial state of FLD for each message. */
@@ -338,12 +343,21 @@ m_getfld_state_reset (m_getfld_state_t *gstate) {
 void
 m_getfld_track_filepos (m_getfld_state_t *gstate, FILE *iob) {
     if (! *gstate) {
 void
 m_getfld_track_filepos (m_getfld_state_t *gstate, FILE *iob) {
     if (! *gstate) {
-       m_getfld_state_init (gstate, iob);
+       *gstate = m_getfld_state_init(iob);
     }
 
     (*gstate)->track_filepos = 1;
 }
 
     }
 
     (*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;
 
 void m_getfld_state_destroy (m_getfld_state_t *gstate) {
     m_getfld_state_t s = *gstate;
 
@@ -393,7 +407,7 @@ enter_getfld (m_getfld_state_t *gstate, FILE *iob) {
     off_t pos_movement;
 
     if (! *gstate) {
     off_t pos_movement;
 
     if (! *gstate) {
-       m_getfld_state_init (gstate, iob);
+       *gstate = m_getfld_state_init(iob);
     }
     s = *gstate;
     s->bytes_read = 0;
     }
     s = *gstate;
     s->bytes_read = 0;
@@ -446,8 +460,8 @@ enter_getfld (m_getfld_state_t *gstate, FILE *iob) {
                chunks of size MSG_INPUT_SIZE. */
             off = pos / MSG_INPUT_SIZE * MSG_INPUT_SIZE;
             if (fseeko(iob, off, SEEK_SET) == -1)
                chunks of size MSG_INPUT_SIZE. */
             off = pos / MSG_INPUT_SIZE * MSG_INPUT_SIZE;
             if (fseeko(iob, off, SEEK_SET) == -1)
-                adios("getfld's iob", "failed to set offset to skip: %ld",
-                    off);
+                adios("getfld's iob", "failed to set offset to skip: "
+                    "%" PRIdMAX, (intmax_t)off);
             num_read = fread (s->msg_buf, 1, MSG_INPUT_SIZE, iob);
             s->readpos = s->msg_buf  +  pos % MSG_INPUT_SIZE;
             s->end = s->msg_buf + num_read;
             num_read = fread (s->msg_buf, 1, MSG_INPUT_SIZE, iob);
             s->readpos = s->msg_buf  +  pos % MSG_INPUT_SIZE;
             s->end = s->msg_buf + num_read;
@@ -456,7 +470,8 @@ enter_getfld (m_getfld_state_t *gstate, FILE *iob) {
     }
 
     if (fseeko(iob, pos, SEEK_SET) == -1)
     }
 
     if (fseeko(iob, pos, SEEK_SET) == -1)
-        adios("getfld's iob", "failed to set offset on entry: %ld", pos);
+        adios("getfld's iob", "failed to set offset on entry: %" PRIdMAX,
+            (intmax_t)pos);
 }
 
 static void
 }
 
 static void
@@ -470,10 +485,10 @@ leave_getfld (m_getfld_state_t s) {
 
        /* Set file stream position so that callers can use ftell(). */
         if (fseeko(s->iob, s->total_bytes_read, SEEK_SET) == -1)
 
        /* Set file stream position so that callers can use ftell(). */
         if (fseeko(s->iob, s->total_bytes_read, SEEK_SET) == -1)
-            adios("getfld's iob", "failed to set offset: %ld",
-                s->total_bytes_read);
-        if ((s->last_caller_pos = ftello(s->iob)) == -1)
-            adios("getfld's iob", "failed to get offset after seek");
+            adios("getfld's iob", "failed to set offset: %" PRIdMAX,
+                (intmax_t)s->total_bytes_read);
+
+        s->last_caller_pos = s->total_bytes_read;
     }
 }
 
     }
 }
 
@@ -513,29 +528,29 @@ Getc (m_getfld_state_t s) {
     return (unsigned char)*s->readpos++;
 }
 
     return (unsigned char)*s->readpos++;
 }
 
-/* Return the next character that would be read by Getc() without
- * consuming it, fetching more of the input for the buffer if required,
- * or EOF on end of file. */
+/* Return the next character that Getc() would return, which may be EOF. */
 static int
 static int
-Peek (m_getfld_state_t s) {
-    if (s->end - s->readpos < 1  &&  read_more (s) == 0) {
-        return EOF;
-    }
-    return s->readpos < s->end  ?  (unsigned char) *s->readpos  :  EOF;
+Peek (m_getfld_state_t s)
+{
+    int c;
+
+    c = Getc(s);
+    if (c != EOF)
+        Ungetc(s);
+
+    return c;
 }
 
 /* If there's room, undo the consumption of one character from msg_buf,
 }
 
 /* If there's room, undo the consumption of one character from msg_buf,
- * rewinding so it's read next.  If the previous character isn't
- * available because we're at the start of msg_buf then return EOF, else
- * return the character that will be read next, a la Peek(). */
-static int
+ * rewinding so it's read next, else die. */
+static void
 Ungetc(m_getfld_state_t s)
 {
 Ungetc(m_getfld_state_t s)
 {
-    if (s->readpos == s->msg_buf) {
-       return EOF;
-    }
-    --s->bytes_read;
-    return *--s->readpos;
+    if (s->readpos == s->msg_buf)
+        die("Ungetc() at start of message buffer.");
+
+    s->readpos--;
+    s->bytes_read--;
 }
 
 
 }
 
 
@@ -676,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.
             */
             * 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;
            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;
                while (c != '\n'  &&  c != EOF  &&  n++ < max) {
                    if ((c = Getc (s)) != EOF)
                         *cp++ = c;
@@ -701,14 +714,14 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz,
                        --s->bytes_read;
                    }
                    s->state = FLDPLUS;
                        --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;
                } 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. */
                }
                } else {
                    /* Folded header field, continues on the next line. */
                }
@@ -818,7 +831,7 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz,
         }
 
        default:
         }
 
        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;
     }
 
     *cp = 0;
@@ -828,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)
 {
 void
 m_unknown(m_getfld_state_t *gstate, FILE *iob)
 {
@@ -893,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)
     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.
 
     /*
      * build a Boyer-Moore end-position map for the matcher in m_getfld.
@@ -901,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).
      */
      * 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;
 
     for (cp = s->fdelim + 1; cp < s->delimend; cp++ )
        s->pat_map[(unsigned char)*cp] = cp;
@@ -918,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
  */
 /*
  * test for msg delimiter string
  */