I know I believe in nothing but it is my sweet nothing.:2008年07月28日分

2008/07/28(Mon)

にちようび!

時々emacs(PKG_OPTION.emacs=motif)が固まるのはxsrc/39209のせいと、めもめも。

install/39193 うーんlibhackリンクしてるのにwcwidth(0xE4)が0を返すんか。
ありえなーい、ちょっと調べる。

関係無いけどiswctype_sb.cのwcwidth()ちとひどいな。
常に1を返しよるのだけどこれcursesとか困ると思われ。
ちゅうかまだCITRUS=NOでbuildって通るのだろか。

[NetBSD] tech-repositoryとか

Mercurialは2年ほど前に小一時間くらい弄ってすぐ捨てたな。

ここで書いたように、NetBSDのように巨大なソースツリーを扱うには不向きだとゆーのが個人的な感想。
ツマミ喰いとか部分アップデートとかよくやるしなぁ、俺。

じゃレイアウト変更して細かく機能ごとに分割し、それぞれ別repositoryにすれば
とかいう人がいるかもしれないけど、repositoryを分割した時点で
MercurialのメリットとされるcommitのAtomicityは保証されない罠。
じ ゃ ぁ C V S で い い ぢ ゃ ん
という結論でてしまい以後弄る気ゼロという、最近はなんか変わったんだろか。

まぁCVSやSubversionでlocalにrepository切ってimportして
vendor branche管理するのめんどくさい=push/pull便利~ちゅうのは判らんでもないけど。

[NetBSD] i18n fold(1)

foldでググったら真っ先にScottish Foldがヒットし、ぬこ例外で落ちた。

結局

149                 if (col > width + 1) {
                                    ^^^

177                                 wprintf(L"%.*ls\n", indx - 1, buf);
                                                             ^^^

あたりが原因で折り返しが変になっとる。

それと

156                                         if (iswblank(buf[i]) &&
157                                             buf[i + 1] != L'\b' &&
158                                             buf[i + 1] != L'\r') {

i + 1ってこれout of index boundsだな。
'\b' or '\r'かのチェックはその前のnew_column_position()ですんどるから不要なはず。
でなきゃ今のfold(1)自体の実装がバグっとる、あとiswblank(buf[i])はL'\t'も含むのでダメ。

更にこいつ

186                         /* Increase buffer by 2048 to fit */
187                         if ((nbuf = realloc (buf, buf_max + 2048)) == NULL) {

sizeof(wchar_t)を忘れとるがな、まぁ無くてもいいけどrealloc呼ばれる頻度が増える罠。
ただこれなんかLINE_MAXで制限喰らうっけ?仕様よく読んでない。

ちゅうわけで書き直してみる、stateful encodingを無視すれば こんな感じかね。
stateful encodingの場合だと

168                                 wmemmove (buf, buf+last_space, indx-last_space);
169
170                                 indx -= last_space;
171                                 col = 0;
172                                 for (i = 0; i < indx; i++) {
173                                         col = new_column_position (col, buf[i]);
174                                 }

wmemmoveしてnew_column_position()をやり直す際に、mbstate_tを巻き戻さんとならんので
もうちょいゴニョゴニョしなければならん、ちゅーか元々のfoldの実装がイマイチ。

[NetBSD] systinst + umlaut

install/39193
char -> wchar_tのキャストでunsigned charにキャストするか & 0xFFしてな
といういつものパターンとみた、ありがち。
src/distrib/util/libhack/multibyte.cが犯人っぽいのだが、libhackをlinkしなくても発生?
これはそもそもsysinstがsetlocale(3)呼んでない罠。