----Next_Part(Fri_Mar_28_10:42:23_1997)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit 前田です。 On Wed, 19 Mar 97 19:12:16 JST, matz / caelum.co.jp (Yukihiro Matsumoto) wrote: | うー,私は curses使ったことないんで,そういうのはちょっとつ | らいですねえ.まあ,他の拡張モジュールでもあんまり使ったこと | ないのを作ってますけど(TkとかGDとか). | | だれかrubyによる拡張を学ぶため,立候補してくださる方はいらっ | しゃいませんか.松本との掛け合い連載をここ(ML)でしてくださる | んでも構いません. 遅くなりましたが立候補させてください。 curses使ったことないので躊躇していたのですが、なんとかやってみ ようと思います。 いずれはrubyでエディタを実装できればいいな、と思います。 ScreenというモジュールとWindowというクラスで実装しようと思います。 WindowはもちろんWINDOW構造体のラッパークラスです。 で、とりあえず init_screen, close_screen, addch, getchなどを実装して、コンパイル は通ったのですが、 ruby test.rbとしたら、 [BUG] Unknown operator `' IOT trap/Abort (core dumped) とのことでお亡くなりになりました:-( Unknown operator とはどういうエラーメッセージなんでしょう? # 演算子なんて定義してないのに。 一応ソースを付けときます。 あとREADME.EXTでバグらしきものを見つけましたので、パッチを付けと きます。 前田 修吾 ----Next_Part(Fri_Mar_28_10:42:23_1997)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Description: "This file is ext/curses/curses.c" /* * curses.c */ #include "ruby.h" #include <stdio.h> #include <curses.h> #define NUM2CHAR(x) (char)NUM2INT(x) #define CHAR2NUM(x) INT2NUM((int)x) VALUE mScreen; VALUE cWindow; extern VALUE mEnumerable; struct windata { WINDOW *window; }; static VALUE screen_init_screen() { initscr(); wclear(stdscr); return Qnil; } static VALUE screen_close_screen() { endwin(); return Qnil; } static void free_window(struct windata *winp) { if (winp->window) delwin(winp->window); } static VALUE window_s_new(VALUE class, VALUE lines, VALUE cols, VALUE top, VALUE left) { WINDOW *window; struct windata *winp; VALUE obj; window ewwin(NUM2INT(lines), NUM2INT(cols), NUM2INT(top), NUM2INT(left)); obj ata_Make_Struct(class , struct windata, 0, free_window, winp); winp->window indow; return obj; } static VALUE screen_addch(VALUE obj, VALUE ch) { addch(NUM2CHAR(ch)); return Qnil; } static VALUE screen_getch(VALUE obj) { return CHAR2NUM(getch()); } static VALUE make_stdscr() { VALUE obj; struct windata *winp; obj ata_Make_Struct(mScreen , struct windata, 0, free_window, winp); winp->window tdscr; } Init_curses() { mScreen b_define_module("Screen"); rb_define_module_function(mScreen, "init_screen", screen_init_screen, 0); rb_define_module_function(mScreen, "close_screen", screen_close_screen, 0); rb_define_module_function(mScreen, "getch", screen_getch, 0); rb_define_module_function(mScreen, "addch", screen_addch, 1); rb_define_global_const(mScreen, "STDSCR", make_stdscr()); cWindow b_define_class("Window", cObject); rb_include_module(cWindow, mEnumerable); rb_define_singleton_method(cWindow, "new", window_s_new, 4); } ----Next_Part(Fri_Mar_28_10:42:23_1997)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit Content-Description: "this file is a patch to README.EXT" *** README.EXT.orig Fri Mar 28 10:26:27 1997 --- README.EXT Fri Mar 28 10:30:47 1997 *************** *** 241,247 **** void rb_define_method(VALUE class, char *name, VALUE (*func)(), int argc) ! void rb_define_sigleton_method(VALUE object, char *name, VALUE (*func)(), int argc) --- 241,247 ---- void rb_define_method(VALUE class, char *name, VALUE (*func)(), int argc) ! void rb_define_singleton_method(VALUE object, char *name, VALUE (*func)(), int argc) *************** *** 283,290 **** という形式でも使えます.モジュール関数を定義する関数は以下の 通りです. ! void rb_define_private_method(VALUE module, char *name, ! VALUE (*func)(), int argc) 関数的メソッド(Kernelモジュールのprivaet method)を定義するた めの関数は以下の通りです. --- 283,290 ---- という形式でも使えます.モジュール関数を定義する関数は以下の 通りです. ! void rb_define_module_function(VALUE module, char *name, ! VALUE (*func)(), int argc) 関数的メソッド(Kernelモジュールのprivaet method)を定義するた めの関数は以下の通りです. ----Next_Part(Fri_Mar_28_10:42:23_1997)----