char *np, *vp;
CT ct;
HF hp;
+ long filepos;
/* allocate the content structure */
if (!(ct = (CT) calloc (1, sizeof(*ct))))
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);
/* 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 */
}
/* 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: