/*
** static prototypes
*/
-static int is_nontext(char *);
+static int is_mime(char *);
#define SHOW 0
#define NEXT 1
/* check if any messages are non-text MIME messages */
if (checkmime) {
if (file) {
- /* check the file for MIME */
- if (is_nontext(vec[vecp - 1])) {
+ if (is_mime(vec[vecp - 1])) {
mime = 1;
}
} else {
- /*
- ** loop through selected messages
- ** and check for MIME
- */
for (msgnum = mp->lowsel; msgnum <= mp->hghsel;
- msgnum++)
- if (is_selected(mp, msgnum) &&
- is_nontext(m_name(msgnum))) {
+ msgnum++) {
+ if (!is_selected(mp, msgnum)) {
+ continue;
+ }
+ snprintf(buf, sizeof buf, "%s/%d",
+ toabsdir(folder), msgnum);
+ if (is_mime(buf)) {
mime = 1;
break;
}
+ }
}
}
}
/*
-** Check if a message or file contains any non-text parts
+** Check if a message or file contains MIME.
*/
static int
-is_nontext(char *msgnam)
+is_mime(char *msgnam)
{
- int result, state;
- unsigned char *bp, *dp;
- char *cp;
+ int state = FLD;
char buf[BUFSIZ], name[NAMESZ];
FILE *fp;
if ((fp = fopen(msgnam, "r")) == NULL)
return 0;
- for (state = FLD;;) {
+ while (1) {
switch (state = m_getfld(state, name, buf, sizeof(buf), fp)) {
case FLD:
case FLDPLUS:
case FLDEOF:
- /*
- ** Check Content-Type field
- */
- if (!mh_strcasecmp(name, TYPE_FIELD)) {
- int passno = 1;
- char c;
-
- cp = getcpy(buf);
- while (state == FLDPLUS) {
- state = m_getfld(state, name, buf,
- sizeof(buf), fp);
- cp = add(buf, cp);
- }
- bp = cp;
-
-again:
- for (; isspace(*bp); bp++)
- continue;
- if (*bp == '(') {
- int i;
-
- for (bp++, i = 0;;) {
- switch (*bp++) {
- case '\0':
-invalid:
- result = 0;
- goto out;
- case '\\':
- if (*bp++ == '\0')
- goto invalid;
- continue;
- case '(':
- i++;
- /* and fall... */
- default:
- continue;
- case ')':
- if (--i < 0)
- break;
- continue;
- }
- break;
- }
- }
- if (passno == 2) {
- if (*bp != '/')
- goto invalid;
- bp++;
- passno = 3;
- goto again;
- }
- for (dp = bp; istoken(*dp); dp++)
- continue;
- c = *dp;
- *dp = '\0';
- if (!*bp)
- goto invalid;
- if (passno == 1) {
- if (!(result = (mh_strcasecmp(bp, "text") != 0))) {
- *dp = c;
- bp = dp;
- passno = 2;
- goto again;
- }
- } else {
- if ((result = (mh_strcasecmp(bp,
- "plain") != 0)))
- goto out;
- *dp = c;
- for (dp++; isspace(*dp); dp++)
- continue;
- if (*dp) {
- if ((result = !uprf(dp,
- "charset")))
- goto out;
- dp += sizeof("charset") - 1;
- while (isspace(*dp))
- dp++;
- if (*dp++ != '=')
- goto invalid;
- while (isspace(*dp))
- dp++;
- if (*dp == '"') {
- if ((bp = strchr(++dp, '"')))
- *bp = '\0';
- } else {
- for (bp = dp; *bp; bp++)
- if (!istoken(*bp)) {
- *bp = '\0';
- break;
- }
- }
- } else {
- /* Default character set */
- dp = "US-ASCII";
- }
- /* Check the character set */
- result = !check_charset(dp, strlen(dp));
- }
-out:
- free(cp);
- if (result) {
- fclose(fp);
- return result;
- }
- break;
+ /* Does it have a Mime-Version header? */
+ if (mh_strcasecmp(name, VRSN_FIELD)==0) {
+ fclose(fp);
+ return 1;
}
- /*
- ** Check Content-Transfer-Encoding field
- */
- if (!mh_strcasecmp(name, ENCODING_FIELD)) {
- cp = getcpy(buf);
- while (state == FLDPLUS) {
- state = m_getfld(state, name, buf,
- sizeof(buf), fp);
- cp = add(buf, cp);
- }
- for (bp = cp; isspace(*bp); bp++)
- continue;
- for (dp = bp; istoken(*dp); dp++)
- continue;
- *dp = '\0';
- result = (mh_strcasecmp(bp, "7bit")
- && mh_strcasecmp(bp, "8bit")
- && mh_strcasecmp(bp, "binary"));
-
- free(cp);
- if (result) {
- fclose(fp);
- return result;
- }
- break;
- }
-
- /*
- ** Just skip the rest of this header
- ** field and go to next one.
- */
- while (state == FLDPLUS)
+ /* else skip the rest of this header field and go on */
+ while (state == FLDPLUS) {
state = m_getfld(state, name, buf, sizeof(buf),
fp);
+ }
break;
- /*
- ** We've passed the message header,
- ** so message is just text.
- */
default:
+ /* We've passed the header, so message is just text */
fclose(fp);
return 0;
}