static int mbfl_filt_ident_gb18030()

in libmbfl/filters/mbfilter_gb18030.c [421:471]


static int mbfl_filt_ident_gb18030(int c, mbfl_identify_filter *filter)
{
	int c1;
	
	c1 = (filter->status >> 8) & 0xff;
	filter->status &= 0xff;

	if (filter->status == 0) {
		if (c <= 0x80 || c == 0xff) {
			filter->status = 0;
		} else {
			filter->status = 1;
			filter->status |= (c << 8);
		}
	} else if (filter->status == 1) { /* dbcs/qbcs 2nd byte */
		if (((c1 >= 0x81 && c1 <= 0x84) || (c1 >= 0x90 && c1 <= 0xe3)) && c >= 0x30 && c <= 0x39) { /* qbcs */
			filter->status = 2;
		} else if (((c1 >= 0xaa && c1 <= 0xaf) || (c1 >= 0xf8 && c1 <= 0xfe)) && (c >= 0xa1 && c <= 0xfe)) {
			filter->status = 0; /* UDA part 1,2 */
		} else if (c1 >= 0xa1 && c1 <= 0xa7 && c >= 0x40 && c < 0xa1 && c != 0x7f) {
			filter->status = 0; /* UDA part 3 */
		} else if ((c1 >= 0xa1 && c1 <= 0xa9 && c >= 0xa1 && c <= 0xfe) ||
				   (c1 >= 0xb0 && c1 <= 0xf7 && c >= 0xa1 && c <= 0xfe) ||
				   (c1 >= 0x81 && c1 <= 0xa0 && c >= 0x40 && c <= 0xfe && c != 0x7f) ||
				   (c1 >= 0xaa && c1 <= 0xfe && c >= 0x40 && c <= 0xa0 && c != 0x7f) ||
				   (c1 >= 0xa8 && c1 <= 0xa9 && c >= 0x40 && c <= 0xa0 && c != 0x7f)) {
			filter->status = 0; /* DBCS */
		} else {
			filter->flag = 1; /* bad */
			filter->status = 0;			
		}
	} else if (filter->status == 2) { /* qbcs 3rd byte */
		if (c > 0x80 && c < 0xff) {
			filter->status = 3;
		} else {
			filter->flag = 1; /* bad */
			filter->status = 0;
		}
	} else if (filter->status == 3) { /* qbcs 4th byte */
		if (c >= 0x30 && c < 0x40) {
			filter->status = 0;
		} else {
			filter->flag = 1; /* bad */
			filter->status = 0;
		}		
	} else {							/* bad */
		filter->flag = 1;
	}

	return c;
}