モールス符号のデコード関数・改

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;
    }
}
C

Chris さんの公開しているテストに全件通ったので動作は大丈夫そうです。もとはテーブルに 100 エントリあったのが 63 にまで減らせました。解説はやっぱり後日で。

Comments

No comments yet. Why don’t you start the discussion?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください