if (ct->c_dispo_type &&
!get_param(ct->c_dispo_first, "filename", '_', 1)) {
add_param(&ct->c_dispo_first, &ct->c_dispo_last, "filename",
- r1bindex(ci->ci_magic, '/'));
+ r1bindex(ci->ci_magic, '/'), 0);
}
}
else
*/
if (index == 0) {
vp = dp;
- while (*vp != '\'' && !isspace((unsigned char) *vp))
+ while (*vp != '\'' && !isspace((unsigned char) *vp) &&
+ *vp != '\0')
vp++;
if (*vp == '\'') {
if (vp != dp) {
free(nameptr);
return NOTOK;
}
- }
+ dp = vp;
- vp = (dp = vp);
- while (*vp != '\'' && !isspace((unsigned char) *vp))
- vp++;
+ while (*vp != '\'' && !isspace((unsigned char) *vp) &&
+ *vp != '\0')
+ vp++;
- if (*vp == '\'') {
- if (vp != dp) {
- len = vp - dp;
- lang = mh_xmalloc(len + 1);
- strncpy(lang, dp, len);
- lang[len] = '\0';
+ if (*vp == '\'') {
+ if (vp != dp) {
+ len = vp - dp;
+ lang = mh_xmalloc(len + 1);
+ strncpy(lang, dp, len);
+ lang[len] = '\0';
+ } else {
+ lang = NULL;
+ }
+ vp++;
} else {
- lang = NULL;
+ advise(NULL, "missing language tag in message %s's %s: "
+ "field\n%*s(parameter %s)", filename, fieldname,
+ strlen(invo_name) + 2, "", nameptr);
+ free(nameptr);
+ if (charset)
+ free(charset);
+ return NOTOK;
}
- vp++;
- } else {
- advise(NULL, "missing language tag in message %s's %s: "
- "field\n%*s(parameter %s)", filename, fieldname,
- strlen(invo_name) + 2, "", nameptr);
- free(nameptr);
- if (charset)
- free(charset);
- return NOTOK;
+
+ dp = vp;
}
/*
* length so we can allocate the correct buffer size.
*/
- for (dp = vp, len = 0; *vp != '\0' && !isspace((unsigned char) *vp);
- vp++) {
+ for (vp = dp, len = 0; istoken(*vp); vp++) {
if (*vp == '%') {
if (*(vp + 1) == '\0' ||
!isxdigit((unsigned char) *(vp + 1)) ||
up = valptr = mh_xmalloc(len + 1);
- for (vp = dp; *vp != '\0' && !isspace((unsigned char) *vp); vp++) {
+ for (vp = dp; istoken(*vp); vp++) {
if (*vp == '%') {
*up++ = decode_qp(*(vp + 1), *(vp + 2));
vp += 2;
pp->lang = lang;
}
} else {
- pm = add_param(param_head, param_tail, nameptr, valptr);
- free(nameptr);
- free(valptr);
+ pm = add_param(param_head, param_tail, nameptr, valptr, 1);
pm->pm_charset = charset;
pm->pm_lang = lang;
}
p[tlen] = '\0';
- pm = add_param(param_head, param_tail, pp->name, p);
+ pm = add_param(param_head, param_tail, pp->name, p, 1);
pm->pm_charset = pp->charset;
pm->pm_lang = pp->lang;
- free(pp->name);
- free(p);
pp2 = pp->next;
free(pp);
pp = pp2;
return OK;
}
+/*
+ * Return the charset for a particular content type. Return pointer is
+ * only valid until the next call to content_charset().
+ */
+
+char *
+content_charset (CT ct) {
+ static char *ret_charset = NULL;
+
+ if (ret_charset != NULL) {
+ free(ret_charset);
+ }
+
+ ret_charset = get_param(ct->c_ctinfo.ci_first_pm, "charset", '?', 0);
+
+ return ret_charset ? ret_charset : "US-ASCII";
+}
+
+
/*
* Create a string based on a list of output parameters. Assume that this
* parameter string will be appended to an existing header, so start out
*/
PM
-add_param(PM *first, PM *last, const char *name, const char *value)
+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_name = getcpy(name);
- pm->pm_value = getcpy(value);
+ pm->pm_name = nocopy ? name : getcpy(name);
+ pm->pm_value = nocopy ? value : getcpy(value);
if (*first) {
(*last)->pm_next = pm;
return pm;
}
+/*
+ * Either replace a current parameter with a new value, or add the parameter
+ * to the parameter linked list.
+ */
+
+PM
+replace_param(PM *first, PM *last, char *name, char *value, int nocopy)
+{
+ PM pm;
+
+ for (pm = *first; pm != NULL; pm = pm->pm_next) {
+ if (strcasecmp(name, pm->pm_name) == 0) {
+ /*
+ * If nocopy is set, it's assumed that we own both name
+ * and value. We don't need name, so we discard it now.
+ */
+ if (nocopy)
+ free(name);
+ free(pm->pm_value);
+ pm->pm_value = nocopy ? value : getcpy(value);
+ return pm;
+ }
+ }
+
+ return add_param(first, last, name, value, nocopy);
+}
+
/*
* Retrieve a parameter value from a parameter linked list. If the parameter
* value needs converted to the local character set, do that now.
int utf8;
iconv_t cd;
ICONV_CONST char *p;
+#else /* HAVE_ICONV */
+ char *p;
#endif /* HAVE_ICONV */
+
char *q;
/*
*q = '\0';
return buffer;
-#endif /* HAVE_ICONV */
noiconv:
+#endif /* HAVE_ICONV */
+
/*
* Take everything non-ASCII and substituite the replacement character
*/