X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fmhparse.c;h=8e8b3605cb1134d8fbbbd939c81fc9f01fb693e6;hp=71c1e8e2933a9fbf00d35656c74fcd33fcd25d61;hb=79cbafe7268202d5b9c231b2d25472c152caa709;hpb=9cf6132a6ea29968131a000bc2fb6860affac45e diff --git a/uip/mhparse.c b/uip/mhparse.c index 71c1e8e..8e8b360 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -231,9 +231,9 @@ parse_mime(char *file) static CT get_content(FILE *in, char *file, int toplevel) { - int compnum, state; - char buf[BUFSIZ], name[NAMESZ]; - char *np, *vp; + enum state state; + struct field f = {{0}}; + int compnum; CT ct; HF hp; @@ -248,47 +248,39 @@ get_content(FILE *in, char *file, int toplevel) ** 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)) { - case FLD: - case FLDPLUS: + for (compnum = 1, state = FLD2;;) { + switch (state = m_getfld2(state, &f, in)) { + case LENERR2: + state = FLD2; + /* FALL */ + case FLD2: compnum++; - /* get copies of the buffers */ - np = mh_xstrdup(name); - vp = mh_xstrdup(buf); - - /* if necessary, get rest of field */ - while (state == FLDPLUS) { - state = m_getfld(state, name, buf, - sizeof(buf), in); - vp = add(buf, vp); /* add to previous value */ - } - - /* Now add the header data to the list */ - add_header(ct, np, vp); + /* add the header data to the list */ + add_header(ct, mh_xstrdup(f.name), mh_xstrdup(f.value)); ct->c_begin = ftell(in) + 1; continue; - case BODY: - ct->c_begin = ftell(in) - strlen(buf); + case BODY2: + ct->c_begin = ftell(in) - strlen(f.value); break; - case FILEEOF: + case FILEEOF2: ct->c_begin = ftell(in); break; - case LENERR: - case FMTERR: - adios(EX_DATAERR, NULL, "message format error in component #%d", - compnum); + case FMTERR2: + advise(NULL, "message format error in component #%d", compnum); + state = FLD2; + continue; + + case IOERR2: + adios(EX_IOERR, "m_getfld2", "io error"); default: adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); } - - /* break out of the loop */ break; } @@ -558,13 +550,19 @@ incl_name_value(unsigned char *buf, char *name, char *value) { ** one, return the entire value. Note that, for example, a name_suffix ** of name will match filename="foo", and return foo. */ -static char * +char * extract_name_value(char *name_suffix, char *value) { - char *extracted_name_value = value; - char *name_suffix_plus_quote = concat(name_suffix, "=\"", NULL); - char *name_suffix_equals = strstr(value, name_suffix_plus_quote); + char *extracted_name_value; + char *name_suffix_plus_quote; + char *name_suffix_equals; char *cp; + if (!value) { + return value; + } + extracted_name_value = value; + name_suffix_plus_quote = concat(name_suffix, "=\"", NULL); + name_suffix_equals = strstr(value, name_suffix_plus_quote); mh_free0(&name_suffix_plus_quote); if (name_suffix_equals) { char *name_suffix_begin; @@ -1027,7 +1025,7 @@ InitMultiPart(CT ct) */ if (ct->c_encoding != CE_7BIT && ct->c_encoding != CE_8BIT && ct->c_encoding != CE_BINARY) { - admonish(NULL, "\"%s/%s\" type in message %s must be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); + admonish(NULL, "\"%s/%s\" type in message %s should be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); ct->c_encoding = CE_7BIT; } @@ -1245,9 +1243,9 @@ InitMessage(CT ct) struct k2v *kv; CI ci = &ct->c_ctinfo; - if ((ct->c_encoding != CE_7BIT) && (ct->c_encoding != CE_8BIT)) { - admonish(NULL, "\"%s/%s\" type in message %s should be encoded in 7bit or 8bit", ci->ci_type, ci->ci_subtype, ct->c_file); - return NOTOK; + if ((ct->c_encoding != CE_7BIT) && (ct->c_encoding != CE_8BIT) && (ct->c_encoding != CE_BINARY)) { + admonish(NULL, "\"%s/%s\" type in message %s should be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); + ct->c_encoding = CE_7BIT; } /* check for missing subtype */