in libmbfl/filters/mbfilter_jis.c [489:585]
static int mbfl_filt_ident_jis(int c, mbfl_identify_filter *filter)
{
retry:
switch (filter->status & 0xf) {
/* case 0x00: ASCII */
/* case 0x10: X 0201 latin */
/* case 0x20: X 0201 kana */
/* case 0x80: X 0208 */
/* case 0x90: X 0212 */
case 0:
if (c == 0x1b) {
filter->status += 2;
} else if (c == 0x0e) { /* "kana in" */
filter->status = 0x20;
} else if (c == 0x0f) { /* "kana out" */
filter->status = 0;
} else if ((filter->status == 0x80 || filter->status == 0x90) && c > 0x20 && c < 0x7f) { /* kanji first char */
filter->status += 1;
} else if (c >= 0 && c < 0x80) { /* latin, CTLs */
;
} else {
filter->flag = 1; /* bad */
}
break;
/* case 0x81: X 0208 second char */
/* case 0x91: X 0212 second char */
case 1:
filter->status &= ~0xf;
if (c == 0x1b) {
goto retry;
} else if (c < 0x21 || c > 0x7e) { /* bad */
filter->flag = 1;
}
break;
/* ESC */
case 2:
if (c == 0x24) { /* '$' */
filter->status++;
} else if (c == 0x28) { /* '(' */
filter->status += 3;
} else {
filter->flag = 1; /* bad */
filter->status &= ~0xf;
goto retry;
}
break;
/* ESC $ */
case 3:
if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
filter->status = 0x80;
} else if (c == 0x28) { /* '(' */
filter->status++;
} else {
filter->flag = 1; /* bad */
filter->status &= ~0xf;
goto retry;
}
break;
/* ESC $ ( */
case 4:
if (c == 0x40 || c == 0x42) { /* '@' or 'B' */
filter->status = 0x80;
} else if (c == 0x44) { /* 'D' */
filter->status = 0x90;
} else {
filter->flag = 1; /* bad */
filter->status &= ~0xf;
goto retry;
}
break;
/* ESC ( */
case 5:
if (c == 0x42 || c == 0x48) { /* 'B' or 'H' */
filter->status = 0;
} else if (c == 0x4a) { /* 'J' */
filter->status = 0x10;
} else if (c == 0x49) { /* 'I' */
filter->status = 0x20;
} else {
filter->flag = 1; /* bad */
filter->status &= ~0xf;
goto retry;
}
break;
default:
filter->status = 0;
break;
}
return c;
}