Chris Wellons さんのモールス符号のデコード関数の実装を参考に同じことをする別関数を書いてみたけれどもあんまり筋が良くありません。やっぱり本家のほうが魅力的。もと実装を見ていたら、もう少しだけ小さく実装できそうだったのでやってみました。
int morse_decode(int state, int c) {
static const unsigned char table[] = {
0x03, 0x5b, 0x97, 0x6b, 0x4b, 0x7f, 0x7b, 0x93, 0x9b, 0x8d,
0xa3, 0x57, 0x73, 0x63, 0x83, 0x67, 0x9e, 0x5c, 0x02, 0x74,
0x00, 0x84, 0x6e, 0x4d, 0xa4, 0x50, 0xa8, 0xad, 0x88, 0x01,
0x03, 0x18, 0x14, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x24,
0x00, 0x28, 0x04,
};
int value = table[-state];
switch (c) {
case '\0': return value >= 0x4 ? (value >> 2) + '/' : 0;
case '.': return value & 0x1 ? state * 2 - 1 : 0;
case '-': return value & 0x2 ? state * 2 - 2 : 0;
default: return 0;
}
}
CChris さんの公開しているテストに全件通ったので動作は大丈夫そうです。もとはテーブルに 100 エントリあったのが 63 にまで減らせました。解説はやっぱり後日で。