X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/3dccb685fb1b879e8910e8732e748b22e7ff8dc7..7711f3fc00259e55f630cfe6104eff3083dc9d77:/uip/mhmisc.c diff --git a/uip/mhmisc.c b/uip/mhmisc.c index 86b8ad80..8b1f0d00 100644 --- a/uip/mhmisc.c +++ b/uip/mhmisc.c @@ -8,7 +8,6 @@ */ #include -#include #include #include #include @@ -31,26 +30,54 @@ static char *errs = NULL; /* * prototypes */ -int part_ok (CT, int); +int part_ok (CT); +int part_exact(CT ct); int type_ok (CT, int); void content_error (char *, CT, char *, ...); void flush_errors (void); int -part_ok (CT ct, int sP) +part_ok (CT ct) { char **ap; int len; - if (npart == 0 || (ct->c_type == CT_MULTIPART && (sP || ct->c_subtype))) + /* a part is "ok", i.e., should be processed, if: + - there were no -part arguments + - this part is a multipart + */ + if (npart == 0 || ct->c_type == CT_MULTIPART) { return 1; + } + /* or if: + - this part is a an exact match for any -part option + - this part is a sub-part of any -part option + */ for (ap = parts; *ap; ap++) { len = strlen(*ap); if (!strncmp (*ap, ct->c_partno, len) && - (!ct->c_partno[len] || ct->c_partno[len] == '.' )) + (!ct->c_partno[len] || ct->c_partno[len] == '.' )) { return 1; + } + } + + return 0; +} + +int +part_exact(CT ct) +{ + char **ap; + + if (!ct->c_partno) + return 0; + + for (ap = parts; *ap; ap++) { + if (!strcmp (*ap, ct->c_partno)) { + return 1; + } } return 0; @@ -69,13 +96,36 @@ type_ok (CT ct, int sP) snprintf (buffer, sizeof(buffer), "%s/%s", ci->ci_type, ci->ci_subtype); for (ap = types; *ap; ap++) - if (!mh_strcasecmp (*ap, ci->ci_type) || !mh_strcasecmp (*ap, buffer)) + if (!strcasecmp (*ap, ci->ci_type) || !strcasecmp (*ap, buffer)) return 1; return 0; } +/* + * Returns true if this content is marked as "inline". + * + * Technically we should check parent content to see if they have + * disposition to use as a default, but we don't right now. Maybe + * later .... + */ + +int +is_inline(CT ct) +{ + /* + * If there isn't any disposition at all, it's "inline". Obviously + * if it's "inline", then it's inline. RFC 2183 says if it's an unknown + * disposition, treat it as 'attachment'. + */ + + if (! ct->c_dispo_type || strcasecmp(ct->c_dispo_type, "inline") == 0) + return 1; + else + return 0; +} + int make_intermediates (char *file) {