/* The arrays are too large for the xstormy16 - won't fit in 16 bits. */
/* { dg-xfail-if "The array too big" { "h8300-*-*" } { "-mno-h" "-mn" } { "" } } */
/* { dg-do assemble { xfail xstormy16-*-* m6811-*-* m6812-*-* } } */

unsigned char	TIFFFax2DMode[20][256];
unsigned char	TIFFFax2DNextState[20][256];
unsigned char	TIFFFaxUncompAction[20][256];
unsigned char	TIFFFaxUncompNextState[20][256];
unsigned char	TIFFFax1DAction[230][256];
unsigned char	TIFFFax1DNextState[230][256];

typedef struct tableentry {
    unsigned short length;
    unsigned short code;
    short       runlen;
} tableentry;

extern tableentry TIFFFaxWhiteCodes[];
extern tableentry TIFFFaxBlackCodes[];

static short sp_data, sp_bit;

static unsigned char
fetchByte (inbuf)

unsigned char **inbuf;

{
    unsigned char byte = **inbuf;
    (*inbuf)++;
    return (byte);
}

static int
decode_white_run (inbuf)

unsigned char **inbuf;

{
    short state = sp_bit;
    short action;
    int runlen = 0;

    for (;;)
    {
	if (sp_bit == 0)
	{
	nextbyte:
	    sp_data = fetchByte (inbuf);
	}

	action = TIFFFax1DAction[state][sp_data];
	state = TIFFFax1DNextState[state][sp_data];
	if (action == 0 )
	    goto nextbyte;
	if (action == 1 )
	    return (-1 );
	if (action == 210 )
	    return (-3 );
	sp_bit = state;
	action = (TIFFFaxWhiteCodes[ action - 2  ].runlen) ;
	runlen += action;
	if (action < 64)
	    return (runlen);
    }
}

