Barbarism begins at internet:2006年03月分

2006/03/06(Mon)

bootstrap-pkgsrc/Cygwin

@

pkgsrc/mk/*を弄ったら割と簡単にmake configureくらいまでは動くようになった。

@

.exe問題についてはCygwinの挙動は以下の通り。

+---------+------------------+
|syscall  |.exeを補完するか?|
+---------+------------------+
|chmod    |する              |
|chown    |する              |
|exec     |する              |
|fopen    |しない            |
|link     |する              |
|open     |しない            |
|stat     |する              |
|symlink  |する              |
|unlink   |しない            |
+---------+------------------+

うは意味わかんね、なぜ中途半端。

拡張子の補完って↓な酷いコード書くしかないんだろうか。

#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>

int
suffixed_filename(const char *path, char *s, size_t n)
{
	const char *suffix = "";
	int fd;
	struct stat st;
	size_t siz;

	fd = open(path, O_RDONLY);
	if (fd == -1) {
		if (errno == ENOENT) {
			fd = lstat(path, &st);
			if (fd != -1)
				suffix = S_ISLNK(st.st_mode) ? ".lnk" : ".exe";
		}
	} else {
		close(fd);
	}
	siz = (size_t)snprintf(s, n, "%s%s", path, suffix);

	return siz < n;
}

sys/cygwin.hあたりに特別なAPIがあったりする様子が無いんだよね…
coreutilsあたりはどういう実装になってるかどっかに解説ないかねぇ。

@GB18030

mapper_parallelを使えば、iconv dataをUnicodeのBMP+1~16面にバラしたとしても
encoding module側でそれぞれに別charset idを割り当てる必要は無いのかぁ。
ならば後は変換表を作るだけだな。

2006/03/10(Fri)

HZ/HZ+/EHZ

wchar_tへのmappingの方法をどうしようかと思案したまま放置してたけど

wchar_t mappings:

ASCII              (~}) 00000000 00000000 00000000 0xxxxxxx
GB2312             (~{) 00000000 00000000 0xxxxxxx 0xxxxxxx
94/6xN:GL          (~M) 0mmmmmmm 0xxxxxxx 0xxxxxxx 0xxxxxxx
94/6xN:GR(8bit HZ) (~M) 0mmmmmmm 0xxxxxxx 0xxxxxxx 1xxxxxxx

for enhancing in the future.
GBK 1byte               00000000 00000000 00000000 xxxxxxxx
GBK 2byte               00000000 00000000 xxxxxxxx xxxxxxxx
GB18030 4byte           0xxxxxxx 1xxxxxxx xxxxxxxx xxxxxxxx
UCS4                    1xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx

これが一番しっくりくるかな。

以前はEHZの~g、~h、~fのように、Big5などのISO-2022準拠でない符号化文字集合を
いくつかに分割して94n charsetの領域にリニアに再割付を行っているような場合、
wchar_tへの変換時に元に戻していたのだが、実はwctocs/cstowcのまで不要な処理な上に
wchar_tに空きがなくなるから止めた。だいぶすっきりした。

んなこんなで書き直し中。

2006/03/23(Thu)

be_BY

リクエストがあったのでbe_BY(ベラルーシ) locale追加。
ベラルーシは今年チェルノブイリ原発事故20周年、そして大統領選挙の年ですな。
FreeBSDのcvs覗いてみたらkk_KZ(カザフスタン)とかもあるみたいなので
そのうち貰ってこよう。

メモ
http://www.w3.org/WAI/ER/IG/ert/iso639.htm
http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1-semic.txt

PSE

1989年以前を一律ビンテージつーことはうちのRoland JV-90(1993)はアウトでつか。
気軽に持ち運び可能な軽量76鍵(9.9kg)って代替無いんだよな。
現行の機種だと12kg前後、以前使ってたRoland D-70がちょうどそれぐらいだったけど
ソフトケースのストラップで肩が擦り切れて血が出たりすんのよね。
無くならない内にWAVE EXPANSION BOARDも必要そうなのは揃えとくかな…

2006/03/28(Tue)

kk_KZ

以下カザフスたん禁止。

それとアルメニアのARMSCII-*のiconv data作業中。
そういや日本で入手困難になって久しいオールドウォッカ"STARKA"が
愛知万博のリトアニア館で売ってたらしい orz.

2006/03/29(Wed)

買い物

「文字符号の歴史―欧米と日本編」買ってきた。

メモ

独立国家共同体(CIS)加盟国と欧州連合(EU)加盟国の一部(要するに旧ソ連)の国々のlocaleとiconv dataの整備状況を他のOSも含めてちょっとまとめてみた。

複数の公用語、あるいは準公用語の有無については外務省のページで調べただけなので不足があるやも知れません。

2006/03/30(Thu)

続 PSE

例のリスト。
うちのKORG POLY-800とKAWAI Q-80もヴィンテージ楽器に認定されました。
どっちも A C ア ダ プ タ なんですが、有難い事です。

うちではRoland S-550(S-330はOKなのに…)とAKAI DR4vr(DR4dはOKなのに...)がアウトになりました。

YAMAHAだけ見てみても、TX-116(DX-7相当の音源モジュールを最大8台搭載可能なもの)が
1、4、5、8枚刺の状態(TX-416、TX-516、TX-816)だとヴィンテージなのにそれ以外の枚数はダメとか
定価数万の4オペFM音源ですらヴィンテージなのに、VL-1とか当時270万したVP-1が除外されてたり、ツッコミどころ大杉。

2006/03/31(Fri)

iconv ``RAW'' conversion

ところでGNU libiconvは

JIS_X0201-1976
JIS_X0208-1983
JIS_X0212-1990
KSC5601
GB2312-80

のような符号化文字集合の「生」変換をサポートしている。
compound text + X11を介さずにbdf fontを操作する場合なんかに使うんだろうかね。
以下実行結果。

$ echo -n "あ" | /usr/pkg/bin/iconv -f EUC-JP -t JIS_X0208-1983 | od -c
0000000   $   "
0000002

NetBSD/Citrusでとりあえず実装するならlibISO2022.soのパラメタに

NAME		"JISX0208-RAW"
ENCODING	"ISO2022"
VARIABLE	"INIT0=94$B"
DEFCSID		"JISX0208:1990" 0x42007F00
INVALID		0x4200222E # GETA

とセットすればよいはず。
多分libEUC.so のように性能向上の為に専用モジュール書いたほうがいいんだろうけど。

$ echo -n "あ" | iconv -f EUC-JP -t JISX0208-RAW | od -c
0000000    $   " 033   (   B
0000005

うーん余計なエスケープシーケンスがついてしまうがな。

1034	if (iscntl(wc & 0xff)) {
1035		/* go back to ASCII on control chars */
1036		cs.type = CS94;
1037		cs.final = 'B';
1038		cs.interm = '\0';
1039	} else if (!(wc & ~0xff)) {

ここは制御文字がきたらASCIIに強制的に戻すんじゃなくて

static const _ISO2022Charset ascii = { CS94, 'B', '\0', '\0' };
static const _ISO2022Charset iso88591 = { CS94, 'A', '\0', '\0' };
...
	if (isc0(wc & 0xff))
		/* go back to INIT0 on C0 chars */
		cs = (ei->initg[0].final) ? ei->initg[0] : ascii;
	else if (isc1(wc & 0xff))
		/* go back to INIT1 on C1 chars */
		cs = (ei->initg[1].final) ? ei->initg[1] : ascii;
	else if (!(wc & ~0xff)) {

こんな感じでC0ならINIT0、C1ならINIT1に戻すが正解?、とりあえず上の対応をして再実行。

0000000    $   "  \0
0000003

まだゴミがついてくるね。
put_state_reset内でmbstate_tを初期化するために喰わせるL'\0'が変なことになってる。

1155	switch (cs.type) {
1156	case CS94:
1157	case CS96:
1158		i = 1;
1159		break;
1160	case CS94MULTI:
1161	case CS96MULTI:
1162		i = isthree(cs.final) ? 3 : 2;
1163		break;
1164	}
1165	while (i-- > 0)
1166		*p++ = ((wc >> (i << 3)) & 0x7f) | mask;

ここだね。
ワイド文字が制御文字にも関わらず2バイトに水増しされてしまう、ここも修正すれば多分OK。