]> diplodocus.org Git - nmh/blobdiff - uip/mhparse.c
Started revising m_getfld() code to replace direct buffer
[nmh] / uip / mhparse.c
index 8cfa89980ee9e37d8fee9a61104ab107124f5aaa..f5a5983adadc3b56d341c9efbc5ee0709f4143a2 100644 (file)
@@ -262,6 +262,7 @@ get_content (FILE *in, char *file, int toplevel)
     char *np, *vp;
     CT ct;
     HF hp;
+    long filepos;
 
     /* allocate the content structure */
     if (!(ct = (CT) calloc (1, sizeof(*ct))))
@@ -269,18 +270,20 @@ get_content (FILE *in, char *file, int toplevel)
 
     ct->c_fp = in;
     ct->c_file = add (file, NULL);
-    ct->c_begin = ftell (ct->c_fp) + 1;
+    ct->c_begin = (filepos = ftell (ct->c_fp)) + 1;
 
     /*
      * Parse the header fields for this
      * content into a linked list.
      */
     for (compnum = 1, state = FLD;;) {
-       switch (state = m_getfld (state, name, buf, sizeof(buf), in)) {
+       int bufsz = sizeof buf;
+       switch (state = m_getfld (state, name, buf, &bufsz, in)) {
        case FLD:
        case FLDPLUS:
        case FLDEOF:
            compnum++;
+           filepos += bufsz;
 
            /* get copies of the buffers */
            np = add (name, NULL);
@@ -288,7 +291,8 @@ get_content (FILE *in, char *file, int toplevel)
 
            /* if necessary, get rest of field */
            while (state == FLDPLUS) {
-               state = m_getfld (state, name, buf, sizeof(buf), in);
+               bufsz = sizeof buf;
+               state = m_getfld (state, name, buf, &bufsz, in);
                vp = add (buf, vp);     /* add to previous value */
            }
 
@@ -297,18 +301,20 @@ get_content (FILE *in, char *file, int toplevel)
 
            /* continue, if this isn't the last header field */
            if (state != FLDEOF) {
-               ct->c_begin = ftell (in) + 1;
+               ct->c_begin = filepos + 1;
                continue;
            }
            /* else fall... */
 
        case BODY:
        case BODYEOF:
-           ct->c_begin = ftell (in) - strlen (buf);
+           filepos += bufsz;
+           ct->c_begin = filepos - strlen (buf);
            break;
 
        case FILEEOF:
-           ct->c_begin = ftell (in);
+           filepos += bufsz;
+           ct->c_begin = filepos;
            break;
 
        case LENERR: