T_MIME

#define nkf_toupper(c)  (('a'<=c && c<='z')?(c-('a'-'A')):c)
/* I don't trust portablity of toupper */

static int
mime_begin(f)
    FILE *f;
{
    int c1;
    int i,j,k;
    unsigned char *p,*q;
    int r[MAXRECOVER];    /* recovery buffer, max mime pattern lenght */

    mime_mode = FALSE;
    /* =? has been checked   */
    j = 0;
    p = mime_pattern[j];
    r[0]='='; r[1]='?';

    for(i=2;p[i]>' ';i++) {                   /* start at =? */
        if( ((((r[i] = c1 = getc(f))==EOF) || nkf_toupper(c1) != p[i] ) {
            /* pattern fails, try next one */
            q = p;
            while (p = mime_pattern[++j]) {
                for(k=2;k<i;k++)              /* assume length(p) > i */
                    if(p[k]!=q[k]) break;
                if(k==i && nkf_toupper(c1)==p[k]) break;
            }
            if(p) continue;  /* found next one, continue */
            /* all fails, output from recovery buffer */
            ungetc(c1,f);
            for(j=0;j<i;j++) {
                (*oconv)(0,r[j]);
            }
            return c1;
        }
    }
    mime_mode = mime_encode[j];
    iso8859_f_save = iso8859_f;
    if(j==0) {
        iso8859_f = TRUE;
    }
    if(mime_mode=='B') {
        mimebuf_f = unbuf_f;
        if(!unbuf_f) {
            /* do MIME integrity check */
            return mime_integrity(f,mime_pattern[j]);
        } 
    }
    mimebuf_f = TRUE;
    return c1;
}

#define mime_getc0(f)   (mimebuf_f?getc(f):Fifo(mime_input++))
#define mime_ungetc0(c,f) (mimebuf_f?ungetc(c,f):mime_input--)

#else
static int
mime_begin(f)
FILE *f;
{
    int c1;
    int i,j;
    int r[MAXRECOVER];    /* recovery buffer, max mime pattern lenght */

    mime_mode = FALSE;
    /* =? has been checked   */
    j = 0;
    r[0]='='; r[1]='?';
    for(i=2;i<MAXRECOVER;i++) {                   /* start at =? */
	/* We accept any charcter type even if it is breaked by new lines */
        if( (r[i] = c1 = getc(f))==EOF) break;
	if(c1=='=') break;
	if(c1<' '&& c1!='\r' && c1!='\n') break;
	if(c1=='?') {
	    i++;
	    if(!(i<MAXRECOVER) || (r[i] = c1 = getc(f))==EOF) break;
	    if(c1=='b'||c1=='B') {
		mime_mode = 'B';
	    } else if(c1=='q'||c1=='Q') {
		mime_mode = 'Q';
	    } else {
		break;
	    }
	    i++;
	    if(!(i<MAXRECOVER) || (r[i] = c1 = getc(f))==EOF) break;
	    if(c1=='?') {
		break;
	    } else {
		mime_mode = FALSE;
	    }
	    break;
	}
    }
    if(!mime_mode || c1==EOF || i==MAXRECOVER) {
	ungetc(c1,f);
	if (i == MAXRECOVER)
	    i--;
	for(j=0;j<i;j++) {
	    (*oconv)(0,r[j]);
	}
	return c1;
    }
    iso8859_f_save = iso8859_f;
    /* do no MIME integrity check */
    return c1;   /* used only for checking EOF */
}

#define mime_getc0(f)   getc(f)
#define mime_ungetc0(c,f) ungetc(c,f)

#endif

static int 
mime_getc(f)
    FILE *f;
{
    int c1, c2, c3, c4, cc;
    int t1, t2, t3, t4, mode, exit_mode;

    if(mime_top != mime_last) {  /* Something is in FIFO */
        return  Fifo(mime_top++);
    }

    if(mimebuf_f == FIXED_MIME)
        exit_mode = mime_mode;
    else
        exit_mode = FALSE;
    if(mime_mode == 'Q') {
        if((c1 = mime_getc0(f)) == EOF) return (EOF);
        if(c1=='_') return ' ';
        if(c1!='=' && c1!='?') 
            return c1;
        mime_mode = exit_mode; /* prepare for quit */
        if(c1<=' ') return c1;
        if((c2 = mime_getc0(f)) == EOF) return (EOF);
        if(c2<=' ') return c2;
        if(c1=='?'&&c2=='=') {
            /* end Q encoding */
            input_mode = exit_mode;
            iso8859_f = iso8859_f_save;
            return g