俺と ttaenc と InnoTek GCC と _BIG_ENDIAN の罠
何の脈絡もなく OS/2 用 ttaenc を更新してみたヨ(もちろん本家のバージョンが上がったわけではなく、また勝手にちょろちょろいじっただけ)。
こんどは Watcom やめて GCC にしてみた(Duron-700 ぐらいだと -mcpu=pentium4 とかやってもむなしいだけか?)。
例によっておまけで Win32 版と DOS (djgpp) 版もついてます。
ちなみに変更点は「実用上問題ない程度に経過表示をはしょってみた」だけだったりします。おそろしいことに OS/2 の日本語コンソールだとこれだけでスピードがヘタすると4割近くアップしてしまう(CHCP 437 で英語コンソールにすると少しマシになるが)。DOS 版もそこそこ効果がある。しかし Windows だと間引いても間引かなくても速度にほとんど差がない! もしかして Windows のコンソールってメチャ速いのか?(MSVCRT のファイルまわりが高速、というのもあるのかもしれない。いやマイクロソフトは侮れないですよ…)
ところで今回 OS/2 バイナリは InnoTek GCC で作成してみたのですが、なぜかうまく動かなくてしばらくはまっておりました。emx の gcc 2.8.1 だとぜんぜん問題ないのに……と思ってたら ttaenc.h の中に
#ifdef _BIG_ENDIAN #define ENDSWAP_INT16(x) (((((x)>>8)&0xFF)|(((x)&0xFF)<<8))) #define ENDSWAP_INT32(x) (((((x)>>24)&0xFF)|(((x)>>8)&0xFF00)|(((x)&0xFF00)<<8)|(((x)&0xFF)<<24))) #else #define ENDSWAP_INT16(x) (x) #define ENDSWAP_INT32(x) (x) #endif
こんなのがあったりするわけで、InnoTek GCC だと _BIG_ENDIAN も _LITTLE_ENDIAN も定義されちゃってるからスワッピングで寝取られ上等になってしまったのでした。これよく考えたら BSD 系でもダメな気がするのですがどうなんでしょうか。