
enum states {
    IDLE,
    PROCESS,
};
for (;;) {
    switch (state) {
        case IDLE:
            if (data_available) {
                crc = 0;
                sum = 0;
                state = PROCESS:
            }
            break;
        case PROCESS:
            if (data_available) {
                ch = get_char();
                if (ch == bad_ch) {
                    state = IDLE;
                    break;
                }
                if (ch == end_char) {
                    if (crc == zero) {
                        if (sum == 0) do_alt0();
                        if (sum == 1) do_alt1();
                        if (sum % 1) do_alt_odd();
                    }
                    state = IDLE;
                    break;
                }
                sum += ch;
                crc = crc32(crc,ch);
            }
            break;
        default:
            state = IDLE;
    }
}
