2009年6月7日日曜日

D言語でncursesを使う

-
 せっかくD言語を使うならlinux環境も考慮したいと思いました。必要になるのはコンソール(ターミナル)を自在に操るためのライブラリです。
で、見つかったのがcursesです。これはlinuxに標準でついているわけではありません。なのでwindowsのコンソールAPIみたいなのが無いのか探し回ったんですけど、やっぱりcursesしか見つかりませんでした。

 cursesはD言語版が無かったので、現在、C言語のヘッダファイル"curses.h"をD言語用のモジュールにする作業を行っています。私がコンソールAPIのときにやっていた、クラス作成なんかも、cursesは関連するヘッダファイルでやってあります。

 ここ数日の苦労の末、D言語でcursesを使うことは可能ということがわかりました。

"test.d"
extern(C) int endwin();

void main()
{
endwin();
}

このソースコードはcursesを使えるかどうかを確かめるためのものです。コンパイルできればいいのです。

linux環境はubuntuというのを古いPCに入れました。
ubuntuにはcursesが入っていないので、端末を起動して
$sudo apt-get install ncurses-dev

と入力します。
gcccursesを使う場合、
$gcc test.c -lcurses

となりますが、dmdの場合は、
$gcc test.d /usr/lib/libcurses.a

となります。

で、コンパイルできるので成功です。

とまあ、ここまでスムーズだったのですが、ちょっと高度なことをしようと思い、画面の好きなところに文字を出力するプログラムを作ったのですが、これがコンパイルできないんです。

ってなエラーが光臨して、これが解決するまで2日を要しました。最終的にはgcc版とdmd版逆アセンブルして見比べてみて分かりました。
gccではmove関数がwmoveになってますが、dmdではmoveのまま。moveは疑似関数で実際には存在していないのです。
extern(C) int move(int,int);
ではダメ。
extern(C) int wmove(WINDOW*,int,int);
としてwmoveを使わないといけません。"curses.h"ではマクロ使って置き換えています。

というわけで、モジュールが完成したら公開します。cursesはあまりに規模が大きいので中途半端になるとは思いますが。

0 件のコメント:

コメントを投稿