summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--README.EXT.jp129
-rw-r--r--class.c16
-rw-r--r--ext/Setup1
-rw-r--r--ext/gtk/gtk.c504
-rw-r--r--ext/kconv/kconv.c8
-rw-r--r--inits.c2
-rw-r--r--intern.h1
-rw-r--r--parse.y1
-rw-r--r--re.c16
-rw-r--r--string.c37
11 files changed, 509 insertions, 217 deletions
diff --git a/ChangeLog b/ChangeLog
index 7d3a2b2def..e2cd7a3aa9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
Fri Feb 20 10:17:51 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
+ * ext/kconv/kconv.c (kconv_kconv): default output code now be
+ determined according to the value of $KCODE.
+
+ * re.c (rb_get_kcode): can retrieve $KCODE from C.
+
* parse.y (stmt): if/unless modifiers returns nil, if condition is
not established.
@@ -13,12 +18,18 @@ Thu Feb 19 11:06:47 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* regex.c (re_compile_pattern): needed to clear pending_exact on
non-registering grouping (?:...).
+Wed Feb 18 19:54:21 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
+
+ * parse.y (here_document): needed to set lex_state to EXPR_END.
+
Wed Feb 18 18:45:10 1998 WATANABE Hirofumi <watanabe@ase.ptg.sony.co.jp>
* patches for cygwin32 applied.
Wed Feb 18 00:41:31 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
+ * string.c (str_sub_s): needed to be mbchar aware to increment one
+ character.
* regex.c (re_match): \Z matches newline just before the end of
the string.
diff --git a/README.EXT.jp b/README.EXT.jp
index 980aff0394..197efa32df 100644
--- a/README.EXT.jp
+++ b/README.EXT.jp
@@ -39,6 +39,7 @@ rubyにはユーザが使う可能性のある以下のタイプがあります.
T_HASH 連想配列
T_STRUCT (rubyの)構造体
T_BIGNUM 多倍長整数
+ T_FILE 入出力
T_TRUE 真
T_FALSE 偽
T_DATA データ
@@ -51,7 +52,7 @@ rubyにはユーザが使う可能性のある以下のタイプがあります.
T_SCOPE
T_NODE
-いくつかのタイプはCの構造体で実装されています.
+ほとんどのタイプはCの構造体で実装されています.
1.2 VALUEのデータタイプをチェックする
@@ -72,7 +73,7 @@ ruby.hではTYPE()というマクロが定義されていて,VALUEのデータ
break;
default:
/* 例外を発生させる */
- Fail("not valid value");
+ TypeError("not valid value");
break;
}
@@ -93,7 +94,7 @@ FIXNUMとNILに関してはより高速な判別マクロが用意されています.
1.3 VALUEをCのデータに変換する
データタイプがT_NIL, T_FALSE, T_TRUEである時,データはそれぞ
-れnil, FALSE, TRUEです.このデータタイプのオブジェクトはひと
+れnil, false, trueです.このデータタイプのオブジェクトはひと
つずつしか存在しません.
データタイプがT_FIXNUMの時,これは31bitのサイズを持つ整数で
@@ -103,6 +104,9 @@ FIXNUMとNILに関してはより高速な判別マクロが用意されています.
プのチェック無しで使えます(整数に変換できない場合には例外が
発生する).
+同様にチェック無しで使える変換マクロはdoubleを取り出す
+「NUM2DBL()」とchar*を取り出す「STR2CSTR()」があります.
+
それ以外のデータタイプは対応するCの構造体があります.対応す
る構造体のあるVALUEはそのままキャスト(型変換)すれば構造体の
ポインタに変換できます.
@@ -144,13 +148,13 @@ VALUEの実際の構造は
にキャストするだけでVALUEに変換出来ます.ただし,任意の構造
体がVALUEにキャスト出来るわけではありません.キャストするの
はrubyの知っている構造体(ruby.hで定義されているstruct RXxxx
-のもの)だけにしておいてください.
+のもの)だけです.
FIXNUMに関しては変換マクロを経由する必要があります.Cの整数
からVALUEに変換するマクロは以下のものがあります.必要に応じ
て使い分けてください.
- INT2FIX() もとの整数が31bit以内に収まる時
+ INT2FIX() もとの整数が31bit以内に収まる自信がある時
INT2NUM() 任意の整数からVALUEへ
INT2NUM()は整数がFIXNUMの範囲に収まらない場合,Bignumに変換
@@ -238,6 +242,12 @@ rubyで提供されている関数を使えばrubyインタプリタに新しい機能
メソッドや定数の定義にこれらの値が必要なので,ほとんどの場合
は戻り値を変数に格納しておく必要があるでしょう.
+クラスやモジュールを他のクラスの内部にネストして定義する時に
+は以下の関数を使います.
+
+ VALUE rb_define_class(VALUE outer, char *name, VALUE super)
+ VALUE rb_define_module(VALUE outer, char *name)
+
2.1.2 メソッド/特異メソッド定義
メソッドや特異メソッドを定義するには以下の関数を使います.
@@ -257,7 +267,8 @@ rubyで提供されている関数を使えばrubyインタプリタに新しい機能
これらの関数の argcという引数はCの関数へ渡される引数の数(と
形式)を決めます.argcが正の時は関数に引き渡す引数の数を意味
します.16個以上の引数は使えません(が,要りませんよね,そん
-なに).
+なに).実際の関数には先頭の引数としてselfが与えられますので,
+指定した数より1多い引数を持つことになります.
argcが負の時は引数の数ではなく,形式を指定したことになります.
argcが-1の時は引数を配列に入れて渡されます.argcが-2の時は引
@@ -290,7 +301,7 @@ privateメソッドとは関数形式でしか呼び出すことの出来ないメソッ
void rb_define_module_function(VALUE module, char *name,
VALUE (*func)(), int argc)
-関数的メソッド(Kernelモジュールのprivaet method)を定義するた
+関数的メソッド(Kernelモジュールのprivate method)を定義するた
めの関数は以下の通りです.
void rb_define_global_function(char *name, VALUE (*func)(), int argc)
@@ -343,7 +354,10 @@ IDとは変数名,メソッド名を表す整数です.rubyの中では
rb_intern(char *name)
を使います.また一文字の演算子はその文字コードがそのままシン
-ボルになっています.
+ボルになっています.rubyから引数として与えられたシンボル(ま
+たは文字列)をIDに変換するには以下の関数を使います.
+
+ rb_to_id(VALUE symbol)
2.2.3 Cからrubyのメソッドを呼び出す
@@ -353,7 +367,12 @@ Cから文字列を経由せずにrubyのメソッドを呼び出すためには以下
VALUE rb_funcall(VALUE recv, ID mid, int argc, ...)
この関数はオブジェクトrecvのmidで指定されるメソッドを呼び出
-します.
+します.その他に引数の指定の仕方が違う以下の関数もあります.
+
+ VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv)
+ VALUE rb_apply(VALUE recv, ID mid, VALUE args)
+
+applyには引数としてrubyの配列を与えます.
2.2.4 変数/定数を参照/更新する
@@ -493,9 +512,11 @@ rubyのextディレクトリにすでに含まれているdbmモジュールを例に
% mkdir ext/dbm
-rubyを展開したディレクトリの下,extディレクトリの中に拡張モ
-ジュール用のディレクトリを作ります.名前は適当に選んで構いま
-せん.
+ruby 1.1からは任意のディレクトリでダイナミックライブラリを作
+ることができるようになりました.rubyに静的にリンクする場合に
+はrubyを展開したディレクトリの下,extディレクトリの中に拡張
+モジュール用のディレクトリを作る必要があります.名前は適当に
+選んで構いません.
(2) MANIFESTファイルを作る
@@ -506,8 +527,10 @@ rubyを展開したディレクトリの下,extディレクトリの中に拡張モ
必要なので,とりあえず空のファイルを作っておきます.後でこの
ファイルには必要なファイル一覧が入ることになります.
-MANIFESTというファイルは,makeの時にディレクトリが拡張モジュー
-ルを含んでいるかどうか判定するために使われれています.
+MANIFESTというファイルは,静的リンクのmakeの時にディレクトリ
+が拡張モジュールを含んでいるかどうか判定するために使われれて
+います.ダイナミックライブラリを作る場合には必ずしも必要では
+ありません.
(3) 設計する
@@ -664,12 +687,10 @@ Cの大域変数は以下の関数を使ってrubyインタプリタに変数の存在
(5) extconf.rbを用意する
-もしディレクトリに「extconf.rb」というファイルが存在すれば,
-make時に実行されます.なければ適当にMakefileが生成されます.
-
-extconf.rbはモジュールのコンパイルに必要な条件のチェックなど
-を行うことが目的です.extconf.rbの中では以下のruby関数を使う
-ことが出来ます.
+Makefileを作る場合の雛型になるextconf.rbというファイルを作り
+ます.extconf.rbはモジュールのコンパイルに必要な条件のチェッ
+クなどを行うことが目的です.extconf.rbの中では以下のruby関数
+を使うことが出来ます.
have_library(lib, func): ライブラリの存在チェック
have_func(func): 関数の存在チェック
@@ -685,6 +706,12 @@ extconf.rbはモジュールのコンパイルに必要な条件のチェックなど
ンパイルしない時にはcreate_makefileを呼ばなければMakefileは
生成されず,コンパイルも行われません.
+モジュールがruby 1.1専用である場合には
+
+ require 'mkmf'
+
+をextconf.rbの先頭に置くと便利でしょう.
+
(6) dependを用意する
もし,ディレクトリにdependというファイルが存在すれば,
@@ -705,12 +732,32 @@ make時にはMANIFESTの内容は参照しませんので,空のままでも問題
必要なファイルを区別できるので,用意しておいた方が良いでしょ
う.
-(8) makeする
+(8) Makefileを生成する
+
+Makefileを実際に生成するためには
-rubyのディレクトリでmakeを実行するとMakefileを生成からmake,
-必要によってはそのモジュールのrubyへのリンクまで自動的に実行
-してくれます.extconf.rbを書き換えるなどしてMakefileの再生成
-が必要な時はまたrubyディレクトリでmakeしてください.
+ ruby extconf.rb
+
+とします.extconf.rbに require 'mkmf' の行がない場合にはエラー
+になりますので,引数を追加して
+
+ ruby -r mkmf extconf.rb
+
+としてください.
+
+ディレクトリをext以下に用意した場合にはruby全体のmakeの時に
+自動的にMakefileが生成されますので,このステップは不要です.
+
+(9) makeする
+
+動的リンクライブラリを生成する場合にはその場でmakeしてくださ
+い.必要であれば make install でインストールされます.
+
+ext以下にディレクトリを用意した場合は,rubyのディレクトリで
+makeを実行するとMakefileを生成からmake,必要によってはそのモ
+ジュールのrubyへのリンクまで自動的に実行してくれます.
+extconf.rbを書き換えるなどしてMakefileの再生成が必要な時はま
+たrubyディレクトリでmakeしてください.
動的リンクライブラリはmake installでrubyライブラリのディレク
トリの下にコピーされます.もしモジュールと協調して使うrubyで
@@ -719,13 +766,13 @@ rubyのディレクトリでmakeを実行するとMakefileを生成からmake,
を作り,そこに 拡張子 .rb のファイルを置いておけば同時にイン
ストールされます.
-(9) デバッグ
+(10) デバッグ
まあ,デバッグしないと動かないでしょうね.ext/Setupにディレ
クトリ名を書くと静的にリンクするのでデバッガが使えるようにな
ります.その分コンパイルが遅くなりますけど.
-(10) できあがり
+(11) できあがり
後はこっそり使うなり,広く公開するなり,売るなり,ご自由にお
使いください.rubyの作者は拡張モジュールに関して一切の権利を
@@ -775,6 +822,7 @@ rubyコマンドの実装
file.c
hash.c
io.c
+ marshal.c
math.c
numeric.c
pack.c
@@ -809,15 +857,15 @@ rubyオブジェクトを表現する型.必要に応じてキャストして用いる.
TRUE
-定数: TRUEオブジェクト(真のデフォルト値)
+定数: trueオブジェクト(真のデフォルト値)
FALSE
-定数: FALSEオブジェクト
+定数: falseオブジェクト
** Cデータのカプセル化
- Wrap_Data_Ptr(VALUE class, void (*mark)(), void (*free)(), void *sval)
+ Data_Wrap_Struct(VALUE class, void (*mark)(), void (*free)(), void *sval)
Cの任意のポインタをカプセル化したrubyオブジェクトを返す.こ
のポインタがrubyからアクセスされなくなった時,freeで指定した
@@ -825,7 +873,7 @@ Cの任意のポインタをカプセル化したrubyオブジェクトを返す.こ
ジェクトを指している場合,markに指定する関数でマークする必要
がある.
- Make_Data_Struct(class, type, mark, free, sval)
+ Data_Make_Struct(class, type, mark, free, sval)
type型のメモリをmallocし,変数svalに代入した後,それをカプセ
ル化したデータを返すマクロ.
@@ -834,6 +882,25 @@ type型のメモリをmallocし,変数svalに代入した後,それをカプセ
dataからtype型のポインタを取り出し変数svalに代入するマクロ.
+** 型チェック
+
+ TYPE(value)
+ FIXNUM_P(value)
+ NIL_P(value)
+ void Check_Type(VALUE value, int type)
+ void Check_SafeStr(VALUE value)
+
+** 型変換
+
+ FIX2INT(value)
+ INT2FIX(i)
+ NUM2INT(value)
+ INT2NUM(i)
+ NUM2DBL(value)
+ float_new(f)
+ STR2CSTR(value)
+ str_new2(s)
+
** クラス/モジュール定義
VALUE rb_define_class(char *name, VALUE super)
diff --git a/class.c b/class.c
index b5bfecfbd5..383df43dae 100644
--- a/class.c
+++ b/class.c
@@ -118,8 +118,8 @@ rb_define_class(name, super)
}
VALUE
-rb_define_class_under(under, name, super)
- VALUE under;
+rb_define_class_under(outer, name, super)
+ VALUE outer;
char *name;
VALUE super;
{
@@ -128,8 +128,8 @@ rb_define_class_under(under, name, super)
id = rb_intern(name);
klass = rb_define_class_id(id, super);
- rb_const_set(under, id, klass);
- rb_set_class_path(klass, under, name);
+ rb_const_set(outer, id, klass);
+ rb_set_class_path(klass, outer, name);
return klass;
}
@@ -175,8 +175,8 @@ rb_define_module(name)
}
VALUE
-rb_define_module_under(under, name)
- VALUE under;
+rb_define_module_under(outer, name)
+ VALUE outer;
char *name;
{
VALUE module;
@@ -184,8 +184,8 @@ rb_define_module_under(under, name)
id = rb_intern(name);
module = rb_define_module_id(id);
- rb_const_set(under, id, module);
- rb_set_class_path(module, under, name);
+ rb_const_set(outer, id, module);
+ rb_set_class_path(module, outer, name);
return module;
}
diff --git a/ext/Setup b/ext/Setup
index d772f65d9a..9e3a2474c3 100644
--- a/ext/Setup
+++ b/ext/Setup
@@ -11,4 +11,3 @@
#tkutil
#tcltklib
#gtk
-mandel
diff --git a/ext/gtk/gtk.c b/ext/gtk/gtk.c
index ca98982615..70d9550616 100644
--- a/ext/gtk/gtk.c
+++ b/ext/gtk/gtk.c
@@ -248,13 +248,6 @@ make_widget(klass, widget)
return make_gobject(klass, GTK_OBJECT(widget));
}
-static void
-free_gstyle(style)
- GtkStyle *style;
-{
- gtk_style_unref(style);
-}
-
static VALUE
make_gstyle(style)
GtkStyle *style;
@@ -262,7 +255,7 @@ make_gstyle(style)
VALUE obj;
gtk_style_ref(style);
- obj = Data_Wrap_Struct(gStyle, 0, free_gstyle, style);
+ obj = Data_Wrap_Struct(gStyle, 0, gtk_style_unref, style);
rb_funcall(obj, id_init, 0, 0);
return obj;
@@ -283,13 +276,6 @@ get_gstyle(style)
return gstyle;
}
-static void
-free_gaccel(tbl)
- GtkAcceleratorTable *tbl;
-{
- gtk_accelerator_table_unref(tbl);
-}
-
static VALUE
make_gtkacceltbl(tbl)
GtkAcceleratorTable *tbl;
@@ -297,7 +283,8 @@ make_gtkacceltbl(tbl)
VALUE obj;
gtk_accelerator_table_ref(tbl);
- obj = Data_Wrap_Struct(gAcceleratorTable, 0, free_gaccel, tbl);
+ obj = Data_Wrap_Struct(gAcceleratorTable, 0,
+ gtk_accelerator_table_unref, tbl);
rb_funcall(obj, id_init, 0, 0);
return obj;
@@ -319,18 +306,11 @@ get_gtkacceltbl(value)
return tbl;
}
-static void
-free_gtkprevinfo(info)
- GtkPreviewInfo *info;
-{
- /* no need to free() */
-}
-
static VALUE
make_gtkprevinfo(info)
GtkPreviewInfo *info;
{
- VALUE obj = Data_Wrap_Struct(gPreviewInfo, 0, free_gtkprevinfo, info);
+ VALUE obj = Data_Wrap_Struct(gPreviewInfo, 0, 0, info);
rb_funcall(obj, id_init, 0, 0);
return obj;
}
@@ -351,13 +331,6 @@ get_gtkprevinfo(value)
return info;
}
-static void
-free_ttips(tips)
- GtkTooltips *tips;
-{
- gtk_tooltips_unref(tips);
-}
-
static VALUE
make_ttips(klass, tips)
VALUE klass;
@@ -366,7 +339,7 @@ make_ttips(klass, tips)
VALUE obj;
gtk_tooltips_ref(tips);
- obj = Data_Wrap_Struct(klass, 0, free_ttips, tips);
+ obj = Data_Wrap_Struct(klass, 0, gtk_tooltips_unref, tips);
rb_funcall(obj, id_init, 0, 0);
return obj;
}
@@ -387,13 +360,6 @@ get_ttips(tips)
return gtips;
}
-static void
-free_gdkfont(font)
- GdkFont *font;
-{
- gdk_font_unref(font);
-}
-
static VALUE
make_gdkfont(font)
GdkFont *font;
@@ -401,7 +367,7 @@ make_gdkfont(font)
VALUE obj;
gdk_font_ref(font);
- obj = Data_Wrap_Struct(gdkFont, 0, free_gdkfont, font);
+ obj = Data_Wrap_Struct(gdkFont, 0, gdk_font_unref, font);
rb_funcall(obj, id_init, 0, 0);
return obj;
}
@@ -488,19 +454,12 @@ get_tobj(obj, klass)
#define make_gdkrectangle(r) make_tobj(r, gdkRectangle, sizeof(GdkRectangle))
#define get_gdkrectangle(r) ((GdkRectangle*)get_tobj(r, gdkRectangle))
-static void
-free_gdkcmap(cmap)
- GdkColormap *cmap;
-{
- gdk_colormap_unref(cmap);
-}
-
static VALUE
make_gdkcmap(cmap)
GdkColormap *cmap;
{
gdk_colormap_ref(cmap);
- return Data_Wrap_Struct(gdkColormap, 0, free_gdkcmap, cmap);
+ return Data_Wrap_Struct(gdkColormap, 0, gdk_colormap_unref, cmap);
}
static GdkColormap*
@@ -519,19 +478,12 @@ get_gdkcmap(cmap)
return gcmap;
}
-static void
-free_gdkvisual(visual)
- GdkVisual *visual;
-{
- gdk_visual_unref(visual);
-}
-
static VALUE
make_gdkvisual(visual)
GdkVisual *visual;
{
gdk_visual_ref(visual);
- return Data_Wrap_Struct(gdkVisual, 0, free_gdkvisual, visual);
+ return Data_Wrap_Struct(gdkVisual, 0, gdk_visual_unref, visual);
}
static GdkVisual*
@@ -550,68 +502,45 @@ get_gdkvisual(visual)
return gvisual;
}
-static void
-free_gdkwindow(window)
- GdkWindow *window;
-{
- gdk_window_unref(window);
-}
-
static VALUE
-make_gdkwindow(window)
- GdkWindow *window;
+make_gdkdraw(klass, draw, ref, unref)
+ VALUE klass;
+ GdkDrawable *draw;
+ void (*ref)();
+ void (*unref)();
{
- gdk_window_ref(window);
- return Data_Wrap_Struct(gdkWindow, 0, free_gdkwindow, window);
+ (*ref)(draw);
+ return Data_Wrap_Struct(gdkWindow, 0, unref, draw);
}
+#define make_gdkwindow2(c,w) make_gdkdraw(c,(w),gdk_window_ref,gdk_window_unref)
+#define make_gdkbitmap2(c,w) make_gdkdraw(c,(w),gdk_bitmap_ref,gdk_bitmap_unref)
+#define make_gdkpixmap2(c,w) make_gdkdraw(c,(w),gdk_pixmap_ref,gdk_pixmap_unref)
+#define make_gdkwindow(w) make_gdkwindow0(gdkWindow,(w))
+#define make_gdkbitmap(w) make_gdkbitmap0(gdkBitmap,(w))
+#define make_gdkpixmap(w) make_gdkpixmap0(gdkPixmap,(w))
+
static GdkWindow*
-get_gdkwindow(window)
- VALUE window;
+get_gdkdraw(draw, klass, kname)
+ VALUE draw, klass;
+ char *kname;
{
- GdkWindow *gwindow;
+ GdkDrawable *d;
- if (NIL_P(window)) return NULL;
+ if (NIL_P(draw)) return NULL;
- if (!obj_is_kind_of(window, gdkWindow)) {
- TypeError("not a GdkWindow");
+ if (!obj_is_kind_of(draw, klass)) {
+ TypeError("not a %s", kname);
}
- Data_Get_Struct(window, GdkWindow, gwindow);
+ Data_Get_Struct(draw, GdkDrawable, d);
- return gwindow;
+ return d;
}
-static void
-free_gdkpixmap(pixmap)
- GdkPixmap *pixmap;
-{
- gdk_pixmap_unref(pixmap);
-}
-
-static VALUE
-make_gdkpixmap(klass, pixmap)
- VALUE klass;
- GdkPixmap *pixmap;
-{
- gdk_pixmap_ref(pixmap);
- return Data_Wrap_Struct(klass, 0, free_gdkpixmap, pixmap);
-}
-
-static GdkPixmap*
-get_gdkpixmap(pixmap)
- VALUE pixmap;
-{
- GdkPixmap *gpixmap;
-
- if (NIL_P(pixmap)) return NULL;
-
- if (!obj_is_kind_of(pixmap, gdkPixmap)) {
- TypeError("not a GdkPixmap");
- }
- Data_Get_Struct(pixmap, GdkPixmap, gpixmap);
-
- return gpixmap;
-}
+#define get_gdkdrawable(w) get_gdkdraw((w),gdkDrawable,"GdkDrawable")
+#define get_gdkwindow(w) get_gdkdraw((w),gdkWindow,"GdkWindow")
+#define get_gdkpixmap(w) get_gdkdraw((w),gdkPixmap,"GdkPixmap")
+#define get_gdkbitmap(w) get_gdkdraw((w),gdkBitmap,"GdkBitmap")
static VALUE
gdkpmap_s_new(self, win, w, h, depth)
@@ -621,7 +550,7 @@ gdkpmap_s_new(self, win, w, h, depth)
GdkWindow *window = get_gdkwindow(win);
new = gdk_pixmap_new(window, NUM2INT(w), NUM2INT(h), NUM2INT(depth));
- return make_gdkpixmap(self, new);
+ return make_gdkpixmap2(self,new);
}
static VALUE
@@ -638,7 +567,7 @@ gdkpmap_create_from_data(self, win, data, w, h, depth, fg, bg)
NUM2INT(depth),
get_gdkcolor(fg),
get_gdkcolor(bg));
- return make_gdkpixmap(self, new);
+ return make_gdkpixmap2(self,new);
}
static VALUE
@@ -656,8 +585,8 @@ gdkpmap_create_from_xpm(self, win, tcolor, fname)
if (!new) {
ArgError("Pixmap not created from %s", RSTRING(fname)->ptr);
}
- return assoc_new(make_gdkpixmap(self, new),
- make_gdkpixmap(gdkBitmap, mask));
+ return assoc_new(make_gdkpixmap2(self,new),
+ make_gdkbitmap(mask));
}
static VALUE
@@ -681,8 +610,8 @@ gdkpmap_create_from_xpm_d(self, win, tcolor, data)
get_gdkcolor(tcolor),
buf);
- return assoc_new(make_gdkpixmap(self, new),
- make_gdkpixmap(gdkBitmap, mask));
+ return assoc_new(make_gdkpixmap2(self,new),
+ make_gdkbitmap(mask));
}
static VALUE
@@ -693,7 +622,7 @@ gdkbmap_s_new(self, win, w, h)
GdkWindow *window = get_gdkwindow(win);
new = gdk_pixmap_new(window, NUM2INT(w), NUM2INT(h), 1);
- return make_gdkpixmap(self, new);
+ return make_gdkpixmap2(self,new);
}
static VALUE
@@ -707,20 +636,14 @@ gdkbmap_create_from_data(self, win, data, w, h)
new = gdk_bitmap_create_from_data(window,
RSTRING(data)->ptr,
NUM2INT(w), NUM2INT(h));
- return make_gdkpixmap(self, (GdkPixmap*)new);
-}
-
-static void
-free_gdkimage(image)
- GdkImage *image;
-{
+ return make_gdkbitmap2(self,new);
}
static VALUE
make_gdkimage(image)
GdkImage *image;
{
- return Data_Wrap_Struct(gdkImage, 0, free_gdkimage, image);
+ return Data_Wrap_Struct(gdkImage, 0, gdk_image_destroy, image);
}
static GdkImage*
@@ -735,6 +658,9 @@ get_gdkimage(image)
TypeError("not a GdkImage");
}
Data_Get_Struct(image, GdkImage, gimage);
+ if (gimage == 0) {
+ ArgError("destroyed GdkImage");
+ }
return gimage;
}
@@ -800,22 +726,16 @@ gdkimage_destroy(self)
VALUE self;
{
gdk_image_destroy(get_gdkimage(self));
+ DATA_PTR(self) = 0;
return Qnil;
}
-static void
-free_gdkevent(event)
- GdkEvent *event;
-{
- gdk_event_free(event);
-}
-
static VALUE
make_gdkevent(event)
GdkEvent *event;
{
event = gdk_event_copy(event);
- return Data_Wrap_Struct(gdkEvent, 0, free_gdkevent, event);
+ return Data_Wrap_Struct(gdkEvent, 0, gdk_event_free, event);
}
static GdkEvent*
@@ -835,6 +755,56 @@ get_gdkevent(event)
}
static VALUE
+make_gdkgc(gc)
+ GdkGC *gc;
+{
+ return Data_Wrap_Struct(gdkGC, 0, gdk_gc_destroy, gc);
+}
+
+static GdkGC*
+get_gdkgc(gc)
+ VALUE gc;
+{
+ GdkGC *ggc;
+
+ if (NIL_P(gc)) return NULL;
+
+ if (!obj_is_instance_of(gc, gdkGC)) {
+ TypeError("not a GdkGC");
+ }
+ Data_Get_Struct(gc, GdkGC, ggc);
+ if (ggc == 0) {
+ ArgError("destroyed GdkGC");
+ }
+
+ return ggc;
+}
+
+static VALUE
+gdkgc_s_new(self, win)
+ VALUE self, win;
+{
+ return make_gdkgc(gdk_gc_new(get_widget(win)->window));
+}
+
+static VALUE
+gdkgc_copy(self, copy)
+ VALUE copy;
+{
+ gdk_gc_copy(get_gdkgc(self), get_gdkgc(copy));
+ return copy;
+}
+
+static VALUE
+gdkgc_destroy(self)
+ VALUE self;
+{
+ gdk_gc_destroy(get_gdkgc(self));
+ DATA_PTR(self) = 0;
+ return Qnil;
+}
+
+static VALUE
glist2ary(list)
GList *list;
{
@@ -951,7 +921,7 @@ arg_to_value(arg)
#endif
#ifdef GTK_TYPE_GDK_PIXMAP
else if (arg->type == GTK_TYPE_GDK_PIXMAP) {
- return make_gdkpixmap(gdkPixmap, GTK_VALUE_BOXED(*arg));
+ return make_gdkpixmap(GTK_VALUE_BOXED(*arg));
}
#endif
#ifdef GTK_TYPE_GDK_VISUAL
@@ -3662,7 +3632,7 @@ image_get(self)
gtk_image_get(GTK_IMAGE(widget), &val, &mask);
return assoc_new(make_gdkimage(self, val),
- make_gdkpixmap(self, mask));
+ make_gdkpixmap(mask));
}
static VALUE
@@ -3673,7 +3643,6 @@ preview_initialize(self, type)
return Qnil;
}
-
static VALUE
preview_size(self, w, h)
VALUE self, w, h;
@@ -3684,11 +3653,65 @@ preview_size(self, w, h)
return self;
}
-#if 0
- rb_define_method(gPixmap, "put", preview_size, 8);
- rb_define_method(gPixmap, "put_row", preview_size, 5);
- rb_define_method(gPixmap, "draw_row", preview_size, 4);
-#endif
+static VALUE
+preview_put(self, win, gc, srcx, srcy, dstx, dsty, w, h)
+ VALUE self, win, gc, srcx, srcy, dstx, dsty, w, h;
+{
+ GtkWidget *widget = get_widget(self);
+
+ gtk_preview_put(GTK_PREVIEW(widget), get_gdkwindow(win), get_gdkgc(gc),
+ NUM2INT(srcx), NUM2INT(srcy),
+ NUM2INT(dstx), NUM2INT(dsty),
+ NUM2INT(w), NUM2INT(h));
+ return self;
+}
+
+static VALUE
+preview_put_row(self, src, dst, x, y, w)
+ VALUE self, src, dst, x, y, w;
+{
+ GtkWidget *widget = get_widget(self);
+ int width = NUM2INT(w);
+ int dlen = width;
+
+ if (GTK_PREVIEW(widget)->type == GTK_PREVIEW_COLOR) {
+ dlen *= 3;
+ }
+ Check_Type(src, T_STRING);
+ if (RSTRING(src)->len < dlen) {
+ ArgError("src too short");
+ }
+ Check_Type(dst, T_STRING);
+ if (RSTRING(dst)->len < dlen) {
+ ArgError("dst too short");
+ }
+ str_modify(dst);
+ gtk_preview_put_row(GTK_PREVIEW(widget),
+ RSTRING(src)->ptr, RSTRING(dst)->ptr,
+ NUM2INT(x), NUM2INT(y), width);
+ return self;
+}
+
+static VALUE
+preview_draw_row(self, data, x, y, w)
+ VALUE self, data, x, y, w;
+{
+ GtkWidget *widget = get_widget(self);
+ int width = NUM2INT(w);
+ int dlen = width;
+
+ if (GTK_PREVIEW(widget)->type == GTK_PREVIEW_COLOR) {
+ dlen *= 3;
+ }
+ Check_Type(data, T_STRING);
+ if (RSTRING(data)->len < dlen) {
+ ArgError("data too short");
+ }
+
+ gtk_preview_draw_row(GTK_PREVIEW(widget), RSTRING(data)->ptr,
+ NUM2INT(x), NUM2INT(y), width);
+ return self;
+}
static VALUE
preview_set_expand(self, expand)
@@ -3723,7 +3746,7 @@ static VALUE
preview_set_install_cmap(self, cmap)
VALUE self, cmap;
{
- gtk_preview_set_install_cmap(NUM2INT(cmap));
+ gtk_preview_set_install_cmap(RTEST(cmap));
return Qnil;
}
@@ -3739,16 +3762,14 @@ static VALUE
preview_get_visual(self)
VALUE self;
{
- GdkVisual *v = gtk_preview_get_visual();
- return make_gdkvisual(v);
+ return make_gdkvisual(gtk_preview_get_visual());
}
static VALUE
preview_get_cmap(self)
VALUE self;
{
- GdkColormap *c = gtk_preview_get_cmap();
- return make_gdkcmap(c);
+ return make_gdkcmap(gtk_preview_get_cmap());
}
static VALUE
@@ -4754,8 +4775,8 @@ pixmap_get(self)
gtk_pixmap_get(GTK_PIXMAP(widget), &val, &mask);
- return assoc_new(make_gdkpixmap(self, val),
- make_gdkpixmap(self, mask));
+ return assoc_new(make_gdkpixmap(val),
+ make_gdkbitmap(mask));
}
static VALUE
@@ -5387,6 +5408,168 @@ gtk_m_main(self)
return Qnil;
}
+
+static VALUE
+gdkdraw_draw_point(self, gc, x, y)
+ VALUE self, gc, x, y;
+{
+ gdk_draw_point(get_gdkdrawable(self), get_gdkgc(gc),
+ NUM2INT(x), NUM2INT(y));
+ return self;
+}
+
+static VALUE
+gdkdraw_draw_line(self, gc, x1, y1, x2, y2)
+ VALUE self, gc, x1, y1, x2, y2;
+{
+ gdk_draw_line(get_gdkdrawable(self), get_gdkgc(gc),
+ NUM2INT(x1), NUM2INT(y1),
+ NUM2INT(x2), NUM2INT(y2));
+ return self;
+}
+
+static VALUE
+gdkdraw_draw_rect(self, gc, filled, x, y, w, h)
+ VALUE self, gc, filled, x, y, w, h;
+{
+ gdk_draw_rectangle(get_gdkdrawable(self), get_gdkgc(gc),
+ RTEST(filled),
+ NUM2INT(x), NUM2INT(y),
+ NUM2INT(w), NUM2INT(h));
+ return self;
+}
+
+static VALUE
+gdkdraw_draw_arc(self, gc, filled, x, y, w, h, a1, a2)
+ VALUE gc, filled, x, y, w, h, a1, a2;
+{
+ gdk_draw_arc(get_gdkdrawable(self), get_gdkgc(gc),
+ RTEST(filled),
+ NUM2INT(x), NUM2INT(y),
+ NUM2INT(w), NUM2INT(h),
+ NUM2INT(a1), NUM2INT(a2));
+ return self;
+}
+
+static VALUE
+gdkdraw_draw_poly(self, gc, filled, pnts)
+ VALUE self, gc, filled, pnts;
+{
+ GdkPoint *points;
+ int i;
+
+ Check_Type(pnts, T_ARRAY);
+ points = ALLOCA_N(GdkPoint,RARRAY(pnts)->len);
+ for (i=0; i<RARRAY(pnts)->len; i++) {
+ Check_Type(RARRAY(pnts)->ptr[i], T_ARRAY);
+ if (RARRAY(RARRAY(pnts)->ptr[i])->len < 2) {
+ ArgError("point %d should be array of size 2", i);
+ }
+ points[i].x = NUM2INT(RARRAY(RARRAY(pnts)->ptr[i])->ptr[0]);
+ points[i].y = NUM2INT(RARRAY(RARRAY(pnts)->ptr[i])->ptr[1]);
+ }
+ gdk_draw_polygon(get_gdkdrawable(self), get_gdkgc(gc),
+ RTEST(filled),
+ points,
+ RARRAY(pnts)->len);
+ return self;
+}
+
+static VALUE
+gdkdraw_draw_text(self, font, gc, x, y, str)
+ VALUE self, font, gc, x, y, str;
+{
+ Check_Type(str, T_STRING);
+ gdk_draw_text(get_gdkdrawable(self), get_gdkfont(font), get_gdkgc(gc),
+ NUM2INT(x), NUM2INT(y),
+ RSTRING(str)->ptr, RSTRING(str)->len);
+ return self;
+}
+
+static VALUE
+gdkdraw_draw_pmap(self, gc, src, xsrc, ysrc, xdst, ydst, w, h)
+ VALUE self, gc, src, xsrc, ysrc, xdst, ydst, w, h;
+{
+ gdk_draw_pixmap(get_gdkdrawable(self), get_gdkgc(gc),
+ get_gdkdrawable(src),
+ NUM2INT(xsrc), NUM2INT(ysrc),
+ NUM2INT(xdst), NUM2INT(ydst),
+ NUM2INT(w), NUM2INT(h));
+ return self;
+}
+
+static VALUE
+gdkdraw_draw_bmap(self, gc, src, xsrc, ysrc, xdst, ydst, w, h)
+ VALUE self, gc, src, xsrc, ysrc, xdst, ydst, w, h;
+{
+ gdk_draw_bitmap(get_gdkdrawable(self), get_gdkgc(gc),
+ get_gdkdrawable(src),
+ NUM2INT(xsrc), NUM2INT(ysrc),
+ NUM2INT(xdst), NUM2INT(ydst),
+ NUM2INT(w), NUM2INT(h));
+ return self;
+}
+
+static VALUE
+gdkdraw_draw_image(self, gc, image, xsrc, ysrc, xdst, ydst, w, h)
+ VALUE self, gc, image, xsrc, ysrc, xdst, ydst, w, h;
+{
+ gdk_draw_image(get_gdkdrawable(self), get_gdkgc(gc),
+ get_gdkimage(image),
+ NUM2INT(xsrc), NUM2INT(ysrc),
+ NUM2INT(xdst), NUM2INT(ydst),
+ NUM2INT(w), NUM2INT(h));
+ return self;
+}
+
+static VALUE
+gdkdraw_draw_pnts(self, gc, pnts)
+ VALUE self, gc, pnts;
+{
+ GdkPoint *points;
+ int i;
+
+ Check_Type(pnts, T_ARRAY);
+ points = ALLOCA_N(GdkPoint,RARRAY(pnts)->len);
+ for (i=0; i<RARRAY(pnts)->len; i++) {
+ Check_Type(RARRAY(pnts)->ptr[i], T_ARRAY);
+ if (RARRAY(RARRAY(pnts)->ptr[i])->len < 2) {
+ ArgError("point %d should be array of size 2", i);
+ }
+ points[i].x = NUM2INT(RARRAY(RARRAY(pnts)->ptr[i])->ptr[0]);
+ points[i].y = NUM2INT(RARRAY(RARRAY(pnts)->ptr[i])->ptr[1]);
+ }
+ gdk_draw_points(get_gdkdrawable(self), get_gdkgc(gc),
+ points,
+ RARRAY(pnts)->len);
+ return self;
+}
+
+static VALUE
+gdkdraw_draw_segs(self, gc, segs)
+ VALUE self, gc, segs;
+{
+ GdkSegment *segments;
+ int i;
+
+ Check_Type(segs, T_ARRAY);
+ segments = ALLOCA_N(GdkSegment,RARRAY(segs)->len);
+ for (i=0; i<RARRAY(segs)->len; i++) {
+ Check_Type(RARRAY(segs)->ptr[i], T_ARRAY);
+ if (RARRAY(RARRAY(segs)->ptr[i])->len < 4) {
+ ArgError("segment %d should be array of size 4", i);
+ }
+ segments[i].x1 = NUM2INT(RARRAY(RARRAY(segs)->ptr[i])->ptr[0]);
+ segments[i].y1 = NUM2INT(RARRAY(RARRAY(segs)->ptr[i])->ptr[1]);
+ segments[i].x2 = NUM2INT(RARRAY(RARRAY(segs)->ptr[i])->ptr[2]);
+ segments[i].y2 = NUM2INT(RARRAY(RARRAY(segs)->ptr[i])->ptr[3]);
+ }
+ gdk_draw_segments(get_gdkdrawable(self), get_gdkgc(gc),
+ segments,
+ RARRAY(segs)->len);
+ return self;
+}
+
static gint
idle()
{
@@ -6126,9 +6309,9 @@ Init_gtk()
/* Preview */
rb_define_method(gPreview, "initialize", preview_initialize, 1);
rb_define_method(gPreview, "size", preview_size, 2);
- rb_define_method(gPreview, "put", preview_size, 8);
- rb_define_method(gPreview, "put_row", preview_size, 5);
- rb_define_method(gPreview, "draw_row", preview_size, 4);
+ rb_define_method(gPreview, "put", preview_put, 8);
+ rb_define_method(gPreview, "put_row", preview_put_row, 5);
+ rb_define_method(gPreview, "draw_row", preview_draw_row, 4);
rb_define_method(gPreview, "set_expand", preview_set_expand, 1);
rb_define_singleton_method(gPreview, "set_gamma", preview_set_gamma, 1);
rb_define_singleton_method(gPreview, "set_color_cube",
@@ -6233,10 +6416,19 @@ Init_gtk()
/* GdkFont */
rb_define_method(gdkFont, "==", gdkfnt_equal, 1);
- /* GdkBitmap */
- rb_define_singleton_method(gdkBitmap, "new", gdkbmap_s_new, 3);
- rb_define_singleton_method(gdkBitmap, "create_from_data",
- gdkbmap_create_from_data, 4);
+ /* GdkDrawable */
+ rb_define_method(gdkDrawable, "draw_point", gdkdraw_draw_point, 3);
+ rb_define_method(gdkDrawable, "draw_line", gdkdraw_draw_line, 5);
+ rb_define_method(gdkDrawable, "draw_rectangle", gdkdraw_draw_rect, 6);
+ rb_define_method(gdkDrawable, "draw_arc", gdkdraw_draw_arc, 8);
+ rb_define_method(gdkDrawable, "draw_polygon", gdkdraw_draw_poly, 3);
+ rb_define_method(gdkDrawable, "draw_string", gdkdraw_draw_text, 5);
+ rb_define_method(gdkDrawable, "draw_text", gdkdraw_draw_text, 5);
+ rb_define_method(gdkDrawable, "draw_pixmap", gdkdraw_draw_pmap, 8);
+ rb_define_method(gdkDrawable, "draw_bitmap", gdkdraw_draw_bmap, 8);
+ rb_define_method(gdkDrawable, "draw_image", gdkdraw_draw_image, 8);
+ rb_define_method(gdkDrawable, "draw_points", gdkdraw_draw_pnts, 2);
+ rb_define_method(gdkDrawable, "draw_segments", gdkdraw_draw_segs, 2);
/* GdkPixmap */
rb_define_singleton_method(gdkPixmap, "new", gdkpmap_s_new, 4);
@@ -6247,8 +6439,18 @@ Init_gtk()
rb_define_singleton_method(gdkPixmap, "create_from_xpm_d",
gdkpmap_create_from_xpm_d, 3);
+ /* GdkBitmap */
+ rb_define_singleton_method(gdkBitmap, "new", gdkbmap_s_new, 3);
+ rb_define_singleton_method(gdkBitmap, "create_from_data",
+ gdkbmap_create_from_data, 4);
+
/* GdkWindow */
+ /* GdkGC */
+ rb_define_singleton_method(gdkGC, "new", gdkgc_s_new, 1);
+ rb_define_method(gdkGC, "copy", gdkgc_copy, 1);
+ rb_define_method(gdkGC, "destroy", gdkgc_destroy, 0);
+
/* GdkImage */
rb_define_singleton_method(gdkImage, "new_bitmap", gdkimage_s_newbmap, 4);
rb_define_singleton_method(gdkImage, "new", gdkimage_s_new, 4);
diff --git a/ext/kconv/kconv.c b/ext/kconv/kconv.c
index 011b8b6b61..5762e3531f 100644
--- a/ext/kconv/kconv.c
+++ b/ext/kconv/kconv.c
@@ -1780,15 +1780,19 @@ kconv_kconv(argc, argv)
VALUE src, dst;
VALUE in, out;
int in_code, out_code;
+ char *codename = 0;
rb_scan_args(argc, argv, "12", &src, &out, &in);
Check_Type(src, T_STRING);
if (NIL_P(out)) {
- out_code = _JIS;
+ codename = rb_get_kcode();
+ goto codeselect;
}
else if (TYPE(out) == T_STRING) {
- switch (RSTRING(out)->ptr[0]) {
+ codename = RSTRING(out)->ptr;
+ codeselect:
+ switch (codename[0]) {
case 'E': case 'e':
out_code = _EUC;
break;
diff --git a/inits.c b/inits.c
index 55db006bfe..5d6532fedc 100644
--- a/inits.c
+++ b/inits.c
@@ -49,7 +49,6 @@ rb_call_inits()
Init_sym();
Init_var_tables();
Init_Object();
- Init_Exception();
#ifdef THREAD
Init_Thread();
#endif
@@ -57,6 +56,7 @@ rb_call_inits()
Init_Enumerable();
Init_eval();
Init_String();
+ Init_Exception();
Init_Numeric();
Init_Bignum();
Init_Array();
diff --git a/intern.h b/intern.h
index d8531bdda4..3483881024 100644
--- a/intern.h
+++ b/intern.h
@@ -214,6 +214,7 @@ VALUE reg_match_last _((VALUE));
VALUE reg_new _((char *, int, int));
VALUE reg_match _((VALUE, VALUE));
VALUE reg_match2 _((VALUE));
+char*rb_get_kcode _((void));
void rb_set_kcode _((char *));
/* ruby.c */
void rb_load_file _((char *));
diff --git a/parse.y b/parse.y
index abc3f19e53..48a38e4431 100644
--- a/parse.y
+++ b/parse.y
@@ -2100,6 +2100,7 @@ here_document(term)
lex_p = save_lexp;
lex_pbeg = save_beg;
lex_pend = save_end;
+ lex_state = EXPR_END;
if (list) {
yylval.node = list;
diff --git a/re.c b/re.c
index 4669aeaec5..f977face5c 100644
--- a/re.c
+++ b/re.c
@@ -969,19 +969,25 @@ reg_prepare_operation(re1, re2)
return flag;
}
-static VALUE
-kcode_getter()
+char*
+rb_get_kcode()
{
switch (reg_kcode) {
case KCODE_SJIS:
- return str_new2("SJIS");
+ return "SJIS";
case KCODE_EUC:
- return str_new2("EUC");
+ return "EUC";
default:
- return str_new2("NONE");
+ return "NONE";
}
}
+static VALUE
+kcode_getter()
+{
+ return str_new2(rb_get_kcode());
+}
+
void
rb_set_kcode(code)
char *code;
diff --git a/string.c b/string.c
index 3c43e2d885..5552e4f9d0 100644
--- a/string.c
+++ b/string.c
@@ -898,14 +898,15 @@ str_sub_s(str, pat, val, once)
repl = reg_regsub(val, str, regs);
str_cat(result, RSTRING(repl)->ptr, RSTRING(repl)->len);
if (BEG(0) == END(0)) {
+ int len = ismbchar(RSTRING(str)->ptr[END(0)])?2:1;
/*
* Always consume at least one character of the input string
* in order to prevent infinite loops.
*/
if (RSTRING(str)->len > END(0)) {
- str_cat(result, RSTRING(str)->ptr+END(0), 1);
+ str_cat(result, RSTRING(str)->ptr+END(0), len);
}
- offset = END(0)+1;
+ offset = END(0)+len;
}
else {
offset = END(0);
@@ -970,27 +971,30 @@ str_sub_iter_s(str, pat, once)
result = str_new(0,0);
n = 0; offset = 0;
while ((beg=reg_search(pat, str, offset, 0)) >= 0) {
- n++;
- null = 0;
+ n++;
+ regs = RMATCH(backref_get())->regs;
str_cat(result, RSTRING(str)->ptr+offset, beg-offset);
- regs = RMATCH(backref_get())->regs;
- if (END(0) == offset) {
- null = 1;
- offset = END(0)+1;
+ val = obj_as_string(rb_yield(reg_nth_match(0, backref_get())));
+ str_cat(result, RSTRING(val)->ptr, RSTRING(val)->len);
+
+ if (BEG(0) == END(0)) {
+ int len = ismbchar(RSTRING(str)->ptr[END(0)])?2:1;
+
+ /*
+ * Always consume at least one character of the input string
+ * in order to prevent infinite loops.
+ */
+ if (RSTRING(str)->len > END(0)) {
+ str_cat(result, RSTRING(str)->ptr+END(0), len);
+ }
+ offset = END(0)+len;
}
else {
offset = END(0);
}
- val = rb_yield(reg_nth_match(0, backref_get()));
- val = obj_as_string(val);
- str_cat(result, RSTRING(val)->ptr, RSTRING(val)->len);
- if (null && RSTRING(str)->len) {
- str_cat(result, RSTRING(str)->ptr+offset-1, 1);
- }
-
if (once) break;
if (offset >= STRLEN(str)) break;
}
@@ -2506,7 +2510,4 @@ Init_String()
rb_define_global_function("split", f_split, -1);
pr_str = rb_intern("to_s");
-
- /* Fix-up initialize ordering */
- RCLASS(eGlobalExit)->super = cString;
}