X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/d3ecbe4bae7a3f1972b553d4b1efab3079ef0bae..e9ecb46532df39b4429a086ae72c3bfa29c122ef:/uip/mhparse.c?ds=sidebyside diff --git a/uip/mhparse.c b/uip/mhparse.c index 40fe61d5..0c2c17cd 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -294,9 +294,7 @@ get_content (FILE *in, char *file, int toplevel) m_getfld_state_t gstate = 0; /* allocate the content structure */ - if (!(ct = (CT) mh_xcalloc (1, sizeof(*ct)))) - adios (NULL, "out of memory"); - + NEW0(ct); ct->c_fp = in; ct->c_file = add (file, NULL); ct->c_begin = ftell (ct->c_fp) + 1; @@ -332,7 +330,15 @@ get_content (FILE *in, char *file, int toplevel) continue; case BODY: - ct->c_begin = ftell (in) - strlen (buf); + if (name[0] == ':') { + /* Special case: no blank line between header and body. The + file position indicator is on the newline at the end of the + line, but it needs to be one prior to the beginning of the + line. So subtract the length of the line, bufsz, plus 1. */ + ct->c_begin = ftell (in) - (bufsz + 1); + } else { + ct->c_begin = ftell (in) - (bufsz - 1); + } break; case FILEEOF: @@ -583,7 +589,7 @@ add_header (CT ct, char *name, char *value) HF hp; /* allocate header field structure */ - hp = mh_xmalloc (sizeof(*hp)); + NEW(hp); /* link data into header structure */ hp->name = name; @@ -654,8 +660,7 @@ get_ctinfo (char *cp, CT ct, int magic) /* down case the content type string */ for (dp = ci->ci_type; *dp; dp++) - if (isalpha((unsigned char) *dp) && isupper ((unsigned char) *dp)) - *dp = tolower ((unsigned char) *dp); + *dp = tolower ((unsigned char) *dp); while (isspace ((unsigned char) *cp)) cp++; @@ -693,8 +698,7 @@ get_ctinfo (char *cp, CT ct, int magic) /* down case the content subtype string */ for (dp = ci->ci_subtype; *dp; dp++) - if (isalpha((unsigned char) *dp) && isupper ((unsigned char) *dp)) - *dp = tolower ((unsigned char) *dp); + *dp = tolower ((unsigned char) *dp); magic_skip: while (isspace ((unsigned char) *cp)) @@ -1029,8 +1033,7 @@ InitText (CT ct) ct->c_subtype = ct_str_subtype (CT_TEXT, ci->ci_subtype); /* allocate text character set structure */ - if ((t = (struct text *) mh_xcalloc (1, sizeof(*t))) == NULL) - adios (NULL, "out of memory"); + NEW0(t); ct->c_ctparams = (void *) t; /* scan for charset parameter */ @@ -1056,7 +1059,7 @@ InitText (CT ct) if (chset != NULL && !check_charset (chset, strlen (chset))) { snprintf (buffer, sizeof(buffer), "%s-charset-%s", invo_name, chset); if ((cp = context_find (buffer))) - ct->c_termproc = getcpy (cp); + ct->c_termproc = mh_xstrdup(cp); } return OK; @@ -1134,8 +1137,7 @@ InitMultiPart (CT ct) } /* allocate primary structure for multipart info */ - if ((m = (struct multipart *) mh_xcalloc (1, sizeof(*m))) == NULL) - adios (NULL, "out of memory"); + NEW0(m); ct->c_ctparams = (void *) m; /* check if boundary parameter contains only whitespace characters */ @@ -1179,8 +1181,7 @@ InitMultiPart (CT ct) if (strcmp (bufp + 2, m->mp_start)) continue; next_part: - if ((part = (struct part *) mh_xcalloc (1, sizeof(*part))) == NULL) - adios (NULL, "out of memory"); + NEW0(part); *next = part; next = &part->mp_next; @@ -1206,10 +1207,9 @@ end_part: if (inout) goto next_part; goto last_part; - } else { - if (strcmp (bufp + 2, m->mp_stop) == 0) - goto end_part; } + if (strcmp (bufp + 2, m->mp_stop) == 0) + goto end_part; } } @@ -1419,8 +1419,7 @@ InitMessage (CT ct) PM pm; struct partial *p; - if ((p = (struct partial *) mh_xcalloc (1, sizeof(*p))) == NULL) - adios (NULL, "out of memory"); + NEW0(p); ct->c_ctparams = (void *) p; /* scan for parameters "id", "number", and "total" */ @@ -1468,8 +1467,7 @@ invalid_param: CT p; FILE *fp; - if ((e = (struct exbody *) mh_xcalloc (1, sizeof(*e))) == NULL) - adios (NULL, "out of memory"); + NEW0(e); ct->c_ctparams = (void *) e; if (!ct->c_fp @@ -1709,8 +1707,7 @@ size_encoding (CT ct) if (ce->ce_file) { if (stat (ce->ce_file, &st) != NOTOK) return (long) st.st_size; - else - return 0L; + return 0L; } if (ct->c_encoding == CE_EXTERNAL) @@ -2329,12 +2326,11 @@ openExternal (CT ct, CT cb, CE ce, char **file, int *fd) if (find_cache (ct, rcachesw, (int *) 0, cb->c_id, cachefile, sizeof(cachefile)) != NOTOK) { if ((ce->ce_fp = fopen (cachefile, "r"))) { - ce->ce_file = getcpy (cachefile); + ce->ce_file = mh_xstrdup(cachefile); ce->ce_unlink = 0; goto ready_already; - } else { - admonish (cachefile, "unable to fopen for reading"); } + admonish (cachefile, "unable to fopen for reading"); } *fd = fileno (ce->ce_fp); @@ -2381,7 +2377,7 @@ openFile (CT ct, char **file) return NOTOK; } - ce->ce_file = getcpy (e->eb_name); + ce->ce_file = mh_xstrdup(e->eb_name); ce->ce_unlink = 0; if ((ce->ce_fp = fopen (ce->ce_file, "r")) == NULL) { @@ -2522,7 +2518,7 @@ openFTP (CT ct, char **file) LocalName (1)); pass = buffer; } else { - ruserpass (e->eb_site, &username, &password); + ruserpass (e->eb_site, &username, &password, 0); user = username; pass = password; } @@ -2926,17 +2922,16 @@ readDigest (CT ct, char *cp) } return OK; - } else { - if (debugsw) { - fprintf (stderr, "invalid MD5 digest (got %d octets)\n", - (int) strlen ((char *) digest)); - } - - return NOTOK; } - } else { + if (debugsw) { + fprintf (stderr, "invalid MD5 digest (got %d octets)\n", + (int) strlen ((char *) digest)); + } + return NOTOK; } + + return NOTOK; } @@ -3302,8 +3297,7 @@ parse_header_attrs (const char *filename, const char *fieldname, /* down case the attribute name */ for (dp = cp; istoken ((unsigned char) *dp); dp++) - if (isalpha((unsigned char) *dp) && isupper ((unsigned char) *dp)) - *dp = tolower ((unsigned char) *dp); + *dp = tolower ((unsigned char) *dp); for (up = dp; isspace ((unsigned char) *dp);) dp++; @@ -3544,8 +3538,7 @@ bad_quote: } if (pp == NULL) { - pp = mh_xmalloc(sizeof(*pp)); - memset(pp, 0, sizeof(*pp)); + NEW0(pp); pp->name = nameptr; pp->next = phead; phead = pp; @@ -3555,8 +3548,7 @@ bad_quote: * Insert this into the section linked list */ - sp = mh_xmalloc(sizeof(*sp)); - memset(sp, 0, sizeof(*sp)); + NEW0(sp); sp->value = valptr; sp->index = index; sp->len = len; @@ -3672,7 +3664,7 @@ content_charset (CT ct) { ret_charset = get_param(ct->c_ctinfo.ci_first_pm, "charset", '?', 0); - return ret_charset ? ret_charset : getcpy ("US-ASCII"); + return ret_charset ? ret_charset : mh_xstrdup("US-ASCII"); } @@ -3903,13 +3895,13 @@ param_len(PM pm, int index, size_t valueoff, int *encode, int *cont, */ if (! pm->pm_charset) { - pm->pm_charset = getcpy(write_charset_8bit()); + pm->pm_charset = mh_xstrdup(write_charset_8bit()); if (strcasecmp(pm->pm_charset, "US-ASCII") == 0) adios(NULL, "8-bit characters in parameter \"%s\", but " "local character set is US-ASCII", pm->pm_name); } if (! pm->pm_lang) - pm->pm_lang = getcpy(NULL); /* Default to a blank lang tag */ + pm->pm_lang = mh_xstrdup(""); /* Default to a blank lang tag */ len++; /* For the encoding marker */ maxfit--; @@ -4089,10 +4081,9 @@ normal_param(PM pm, char *output, size_t len, size_t valuelen, PM add_param(PM *first, PM *last, char *name, char *value, int nocopy) { - PM pm = mh_xmalloc(sizeof(*pm)); - - memset(pm, 0, sizeof(*pm)); + PM pm; + NEW0(pm); pm->pm_name = nocopy ? name : getcpy(name); pm->pm_value = nocopy ? value : getcpy(value); @@ -4146,8 +4137,7 @@ get_param(PM first, const char *name, char replace, int fetchonly) if (strcasecmp(name, first->pm_name) == 0) { if (fetchonly) return first->pm_value; - else - return getcpy(get_param_value(first, replace)); + return getcpy(get_param_value(first, replace)); } first = first->pm_next; } @@ -4258,6 +4248,10 @@ noiconv: q = buffer; bufsize = sizeof(buffer); for (p = pm->pm_value; *p != '\0' && bufsize > 1; p++, q++, bufsize--) { + /* FIXME: !iscntrl should perhaps be isprint as that allows all + * classes bar cntrl, whereas the cntrl class can include those + * in space and blank. + * http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap07.html */ if (isascii((unsigned char) *p) && !iscntrl((unsigned char) *p)) *q = *p; else