mots quotidiens. | |
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp | by hns, version 2.10-pl1. |
|
||||||||||||||||||||||||||||||||||||||||||||||
この内容はサークルKの今度の第4回でも話す予定ですが, 内輪向けの内容を削除したもの を置いておきます。
42 30 0 0となっている模様。 正統的には, ロケールに従って元の文字コードに戻して文字クラスを判別するのかも しれないが, そんなの遅くてやっていられないので, 以下のようなコードを地道に 書くことに。
#include <endian.h> #if __BYTE_ORDER == __LITTLE_ENDIAN #define ubyte(w) (*((char *)&(w)+1)) #define lbyte(w) (*((char *)&(w))) #else #define ubyte(w) (*((char *)&(w))) #define lbyte(w) (*((char *)&(w)+1)) #endif wtype_t wtype (wchar_t w) { unsigned char c1 = ubyte(w), c2 = lbyte(w); if (0x4E <= c1 && c1 <= 0x9F) return ZEN_KANJI; .. }wstring の中身が(普通の方法では)UTF-16というのはあまり聞かない話 なので, (専門の人には知られた話かもしれませんが)ちょっと書いてみました。 というか iswctype(3) が荒っぽすぎるので, 自分で文字クラスの関数を書かないと いけないというのはどうよ, みたいな気が少ししたりして。。
if (t == LATIN_CNTL) return "LATIN_CNTL"; if (t == LATIN_SPACE) return "LATIN_SPACE"; ....のようなコードを延々と書く必要があって, 何とかならないものかと思っていた。 (今回に限った話ではなく, 前にも同じように思ったことがあった。)
#define inspect_type(t,type) { if (t == type) return #type; } inspect_type(t, LATIN_CNTL); inspect_type(t, LATIN_SPACE); ...と書いておくと, cppが置換して上と同じコードにしてくれる。(g++ -E で見ると わかる。) ブラボー。初めて使った機能でした。
ちなみに, これは「変数の名前」を"文字列"=データに変換できるということなので, かなり面白い。たとえば,
#define varexec(v) ((void(*)(void))#v)()のようなマクロを定義しておくと, 変数vの名前を文字列にして, それを関数だと 思って実行することができるはず。だから例えば, 原理的には ASCIIで hello world のような感じで
#define varexec(v) ((void(*)(void))#v)() int main (int argc, char *argv[]) { int PTXHHHH0Z_18RVX75ow = -1; /* 中身は何でもよい */ varexec(PTXHHHH0Z_18RVX75ow); /* = ((void(*)(void))"PTXHHHH0Z_18RVX75ow")(); が実行される */ }とできるということ(!)。 *1
タイトル一覧 |