#include "hex.h"
#include "log.h"
#include "base64.h"
+#include "kvp.h"
/** @brief Match whitespace characters */
static int whitespace(int c) {
/** @brief Parse a MIME content-type field
* @param s Start of field
* @param typep Where to store type
- * @param parameternamep Where to store parameter name
- * @param parametervaluep Wher to store parameter value
+ * @param parametersp Where to store parameter list
* @return 0 on success, non-0 on error
*
* See <a href="http://tools.ietf.org/html/rfc2045#section-5">RFC 2045 s5</a>.
*/
int mime_content_type(const char *s,
char **typep,
- char **parameternamep,
- char **parametervaluep) {
+ struct kvp **parametersp) {
struct dynstr type, parametername;
+ struct kvp *parameters = 0;
+ char *parametervalue;
dynstr_init(&type);
if(!(s = skipwhite(s, 1))) return -1;
dynstr_append(&type, tolower((unsigned char)*s++));
if(!(s = skipwhite(s, 1))) return -1;
- if(*s == ';') {
+ while(*s == ';') {
dynstr_init(¶metername);
++s;
if(!(s = skipwhite(s, 1))) return -1;
if(!(s = skipwhite(s, 1))) return -1;
if(*s++ != '=') return -1;
if(!(s = skipwhite(s, 1))) return -1;
- if(!(s = parseword(s, parametervaluep, tspecial))) return -1;
+ if(!(s = parseword(s, ¶metervalue, tspecial))) return -1;
if(!(s = skipwhite(s, 1))) return -1;
dynstr_terminate(¶metername);
- *parameternamep = parametername.vec;
- } else
- *parametervaluep = *parameternamep = 0;
+ kvp_set(¶meters, parametername.vec, parametervalue);
+ }
dynstr_terminate(&type);
*typep = type.vec;
+ *parametersp = parameters;
return 0;
}