+
+/*
+ * Structures for mapping types to their internal flags
+ */
+struct k2v {
+ char *kv_key;
+ int kv_value;
+};
+extern struct k2v SubText[];
+extern struct k2v Charset[];
+extern struct k2v SubMultiPart[];
+extern struct k2v SubMessage[];
+extern struct k2v SubApplication[];
+
+/*
+ * Structures for mapping (content) types to
+ * the functions to handle them.
+ */
+struct str2init {
+ char *si_key;
+ int si_val;
+ InitFunc si_init;
+};
+extern struct str2init str2cts[];
+extern struct str2init str2ces[];
+extern struct str2init str2methods[];
+
+/*
+ * prototypes
+ */
+int pidcheck (int);
+CT parse_mime (char *);
+
+/*
+ * Translate a composition file into a MIME data structure. Arguments are:
+ *
+ * infile - Name of input filename
+ * autobuild - A flag to indicate if the composition file parser is
+ * being run in automatic mode or not. In auto mode,
+ * if a MIME-Version header is encountered it is assumed
+ * that the composition file is already in MIME format
+ * and will not be processed further. Otherwise, an
+ * error is generated.
+ * dist - A flag to indicate if we are being run by "dist". In
+ * that case, add no MIME headers to the message. Existing
+ * headers will still be encoded by RFC 2047.
+ * directives - A flag to control whether or not build directives are
+ * processed by default.
+ * encoding - The default encoding to use when doing RFC 2047 header
+ * encoding. Must be one of CE_UNKNOWN, CE_BASE64, or
+ * CE_QUOTED.
+ * maxunencoded - The maximum line length before the default encoding for
+ * text parts is quoted-printable.
+ *
+ * Returns a CT structure describing the resulting MIME message. If the
+ * -auto flag is set and a MIME-Version header is encountered, the return
+ * value is NULL.
+ */
+CT build_mime (char *infile, int autobuild, int dist, int directives,
+ int encoding, size_t maxunencoded);
+
+int add_header (CT, char *, char *);
+int get_ctinfo (char *, CT, int);
+int params_external (CT, int);
+int open7Bit (CT, char **);
+void close_encoding (CT);
+void free_content (CT);
+char *ct_type_str (int);
+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 *);
+
+/*
+ * 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 */