----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)----