X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/b5f46f4ba364af010a7ef5afb20b667fcbe9b136..683e0fb1a14da5b9ce7bc5db6e76951d14d79348:/uip/mhparse.c diff --git a/uip/mhparse.c b/uip/mhparse.c index 8cfa8998..f5a5983a 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -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: