llc.h
文字列とハッシュと正規表現とIOが欲しいという結論だったのでそのへんを書きました。方針は基本的にメモリを解放しないこと。 Ruby のメソッドをそのまま再生産するだけ。ザ・車輪。
http://shinh.skr.jp/cgi-c/llc/
例えば以下はタブ区切りのデータ読み出してリストを書いていく部分。
char** lines = st_split(io_read(fopen("bbs.dat", "r")), "\n", 0); for (; *lines; lines++) { char** nb = st_split(*lines, "\t", 0); printf("<li>%s: %s\n", nb[0], nb[1]); }
そんで C の掲示板書き直しました。
http://shinh.skr.jp/cgi-c/bbs_llc.c
こっちがソース。 #include "llca.h" だけで全部済んでるわけですけど、ただこれ、オリジナルの掲示板よりサイズが大きくなっているという説があります。なんてことだ。
http://shinh.skr.jp/cgi-c/bbs_llc.txt
掲示板書いてて思ったことは、
- reg_match してから reg_sub すると二度手間。でもクロージャとか無しで後方参照をうまく扱うのが面倒だなと思いました。
- st_* 系の関数は NULL の場合は "" と等価みたいな扱いした方が良さそう。
現状の問題点としては、
- クロージャみたいなのが無い
- 時々環境依存 (typedef unsigned int uint; したら怒られた)
- 変数宣言がめんどい
なんか割と LL っぽい悩みになってきた気がした。最後のは C99 に決め打つとだいぶマシかな。
あとなんかメモとか。思ったこととか。
- ハッシュは超適当実装。たぶん遅い。
- 配列系どうしよう。現状 NULL 終端でかつ split とかは split("a,b", ",", &size); とかすると size に返るようになっているけど (NULLで省略可能) あんまりいらない気がする。あと Array#join とか必須だけどどこに置こうか。
- st_*_i 系の関数は chomp! とかの ! が _i になってるわけだけど、なんか微妙。
- なんか DTR が非常に便利でびびった。ただしバグも見つけた。
- ここまでして、なんで C なんだっけ?