X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/f93ce652c5d1361b00a28db7bbb9e638197a6676..947be815882dfaa03916be0e7fb6b8721807829e:/h/mhparse.h?ds=sidebyside diff --git a/h/mhparse.h b/h/mhparse.h index bb55153f..0d4ef467 100644 --- a/h/mhparse.h +++ b/h/mhparse.h @@ -16,9 +16,10 @@ typedef struct hfield *HF; /* * Abstract types for MIME parsing/building */ -typedef struct cefile *CE; -typedef struct CTinfo *CI; -typedef struct Content *CT; +typedef struct cefile *CE; +typedef struct CTinfo *CI; +typedef struct Content *CT; +typedef struct Parameter *PM; /* * type for Init function (both type and transfer encoding) @@ -43,6 +44,17 @@ struct hfield { HF next; /* link to next header field */ }; +/* + * Structure for holding MIME parameter elements. + */ +struct Parameter { + char *pm_name; /* Parameter name */ + char *pm_value; /* Parameter value */ + char *pm_charset; /* Parameter character set (optional) */ + char *pm_lang; /* Parameter language tag (optional) */ + PM pm_next; /* Pointer to next element */ +}; + /* * Structure for storing parsed elements * of the Content-Type component. @@ -50,8 +62,8 @@ struct hfield { struct CTinfo { char *ci_type; /* content type */ char *ci_subtype; /* content subtype */ - char *ci_attrs[NPARMS + 2]; /* attribute names */ - char *ci_values[NPARMS]; /* attribute values */ + PM ci_first_pm; /* Pointer to first MIME parameter */ + PM ci_last_pm; /* Pointer to last MIME parameter */ char *ci_comment; /* RFC-822 comments */ char *ci_magic; }; @@ -99,6 +111,9 @@ struct Content { char *c_id; /* Content-ID: */ char *c_descr; /* Content-Description: */ char *c_dispo; /* Content-Disposition: */ + char *c_dispo_type; /* Type of Content-Disposition */ + PM c_dispo_first; /* Pointer to first disposition parm */ + PM c_dispo_last; /* Pointer to last disposition parm */ char *c_partno; /* within multipart content */ /* Content-Type info */ @@ -326,6 +341,59 @@ char *ct_subtype_str (int, int); const struct str2init *get_ct_init (int); const char *ce_str (int); const struct str2init *get_ce_method (const char *); -int parse_header_attrs (const char *, int, char **, CI, int *); + +/* + * Parse a series of MIME attributes (or parameters) given a header as + * input. + * + * Arguments include: + * + * filename - Name of input file (for error messages) + * fieldname - Name of field being processed + * headerp - Pointer to pointer of the beginning of the MIME attributes. + * Updated to point to end of attributes when finished. + * param_head - Pointer to head of parameter list + * param_tail - Pointer to tail of parameter list + * commentp - Pointer to header comment pointer (may be NULL) + * + * Returns OK if parsing was successful, NOTOK if parsing failed, and + * DONE to indicate a benign error (minor parsing error, but the program + * should continue). + */ +int parse_header_attrs (const char *filename, const char *fieldname, + char **headerp, PM *param_head, PM *param_tail, + char **commentp); + +/* + * Given a linked list of parameters, build an output string for them. This + * string is designed to be concatenated on an already-built header. + * + * Arguments are: + * + * initialwidth - Current width of the header. Used to compute when to wrap + * parameters on the first line. The following lines will + * be prefixed by a tab (\t) character. + * params - Pointer to head of linked list of parameters. + * offsetout - The final line offset after all the parameters have been + * output. May be NULL. + * + * Returns a pointer to the resulting parameter string. This string must + * be free()'d by the caller. Returns NULL on error. + */ +char *output_params(size_t initialwidth, PM params, int *offsetout); + +/* + * Add a parameter to the parameter linked list. + * + * Arguments are: + * + * first - Pointer to head of linked list + * last - Pointer to tail of linked list + * name - Name of parameter + * value - Value of parameter + * + * Returned allocated parameter element + */ +PM add_param(PM *first, PM *last, const char *name, const char *value); extern int checksw; /* Add Content-MD5 field */