1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

1.1d series

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1dev@298 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 1998-09-08 07:09:52 +00:00
parent 1c193e5ffe
commit 5d71c8d89c
67 changed files with 7155 additions and 6731 deletions

View file

@ -1,3 +1,21 @@
Tue Sep 8 01:42:30 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* enum.c (Init_Enumerable): Enumerable#reverse removed.
* eval.c (call_trace_func): profiler support.
* eval.c (rb_call0): ditto.
Thu Sep 3 16:34:39 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* bignum.c (bigadd): proper sign combination.
* eval.c (dvar_asgn_push): modify calling block to create dvar,
not insert it next to dummy dvar slot.
* eval.c (eval): save calling block in (thread local) global
variable. no dummy dvar slot is generated by yield.
Thu Sep 3 14:08:14 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* version 1.1c4 released.
@ -41,10 +59,25 @@ Fri Aug 28 12:25:33 1998 Hiroshi Igarashi <igarashi@ueda.info.waseda.ac.jp>
* ruby.c (ruby_require_modules): load modules in appearing order.
Fri Aug 28 01:57:04 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* regex.c (re_compile_pattern): accepts (?ix-ix) and (?ix-ix:...).
Thu Aug 27 12:54:28 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* version 1.1c3 released.
Wed Aug 26 14:40:56 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* eval.c (rb_eval): check whether ruby_class is properly set,
before accessing it.
* eval.c (rb_obj_instance_eval): ruby_class should be Qnil for
special objects like Fixnums.
* ext/tkutil/tkutil.c (Init_tkutil): removes calls to
rb_yield_0(). used instance_eval() instead in the tk.rb.
Wed Aug 26 11:47:00 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* regex.c (re_match): pop non-greedy stack elements on success.
@ -53,6 +86,10 @@ Wed Aug 26 09:25:35 1998 WATANABE Hirofumi <watanabe@ase.ptg.sony.co.jp>
* ruby.h: add #define environ for cygwin32.
Tue Aug 25 08:57:41 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* array.c (rb_ary_sort_bang): temporarily freeze sorting array.
Mon Aug 24 18:46:44 1998 WATANABE Hirofumi <watanabe@ase.ptg.sony.co.jp>
* dln.c (dln_find_1): path check was too strict.
@ -61,6 +98,23 @@ Mon Aug 24 15:28:11 1998 WATANABE Hirofumi <watanabe@ase.ptg.sony.co.jp>
* parse.y (f_arglist): opt_nl added after f_args.
Fri Aug 21 01:06:01 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* ext/socket/socket.c: grand renaming on socket.c.
* ext/socket/socket.c (inet_aton): supply inet_aton for those
systems that do not have it.
* ext/socket/socket.c (setipaddr): use inet_aton instead of
inet_addr.
* ext/socket/socket.c (tcp_s_gethostbyname): new method: works
like Socket.gethostbyname but returning array contains ip-addrs
as octet decimal string format like "127.0.0.1".
* ext/socket/socket.c (mkhostent): return format changed to
[host, aliases, type, ipaddr..] as documented.
Wed Aug 19 00:31:09 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* io.c (io_ctl): forgot to place TRAP_END at right position.
@ -89,6 +143,24 @@ Fri Aug 7 17:44:44 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
with snprintf to avoid buffer over-run. For systems which does
dot provide snprintf, missing/snprintf.c added.
Wed Aug 5 00:47:35 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* re.c (rb_reg_search): recycle match object.
Mon Aug 3 09:17:55 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* string.c (rb_str_gsub_bang): do not allocate temporary string.
* string.c (rb_str_sub_bang): use inline replace.
Wed Jul 29 00:36:08 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* hash.c (hash_s_new): the default value can be specified.
* hash.c (hash_default): method to set the default value.
* hash.c (hash_aref): now returns the default value.
Tue Jul 28 13:03:25 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* array.c (ary_s_new): argument to specify initial value is added.

View file

@ -74,9 +74,9 @@ OBJS = array.o \
all: miniruby$(binsuffix) rbconfig.rb
@./miniruby$(binsuffix) -Xext extmk.rb @EXTSTATIC@
miniruby$(binsuffix): $(OBJS) $(MAINOBJ) dmyext.o
miniruby$(binsuffix): $(LIBRUBY) $(MAINOBJ) dmyext.o
@rm -f $@
$(PURIFY) $(CC) $(LDFLAGS) $(MAINOBJ) $(OBJS) dmyext.o $(LIBS) -o $@
$(PURIFY) $(CC) $(LDFLAGS) $(MAINOBJ) dmyext.o $(LIBRUBYARG) $(LIBS) -o $@
ruby$(binsuffix): $(LIBRUBY) $(MAINOBJ) $(EXTOBJS)
@rm -f $@
@ -213,7 +213,7 @@ random.o: random.c ruby.h config.h defines.h intern.h
range.o: range.c ruby.h config.h defines.h intern.h
re.o: re.c ruby.h config.h defines.h intern.h re.h regex.h
regex.o: regex.c config.h regex.h util.h
ruby.o: ruby.c ruby.h config.h defines.h intern.h dln.h
ruby.o: ruby.c ruby.h config.h defines.h intern.h dln.h util.h
signal.o: signal.c ruby.h config.h defines.h intern.h rubysig.h
sprintf.o: sprintf.c ruby.h config.h defines.h intern.h
st.o: st.c config.h st.h

3
README
View file

@ -15,7 +15,8 @@ Perl). It is simple, straight-forward, and extensible.
+ Iterators and Closures
+ Garbage Collection
+ Dynamic Loading of Object files(on some architecture)
+ Highly Portable(works on many UNIX machines)
+ Highly Portable(works on many UNIX machines, and on DOS,
Windows, Mac, BeOS etc.)
* How to get Ruby

View file

@ -159,43 +159,43 @@ Ruby
String funtions
str_new(char *ptr, int len)
rb_str_new(char *ptr, int len)
Creates a new Ruby string.
str_new2(char *ptr)
rb_str_new2(char *ptr)
Creates a new Ruby string from C string. This is equivalent to
str_new(ptr, strlen(ptr)).
rb_str_new(ptr, strlen(ptr)).
str_cat(VALUE str, char *ptr, int len)
rb_str_cat(VALUE str, char *ptr, int len)
Appends len bytes data from ptr to the Ruby string.
Array functions
ary_new()
rb_ary_new()
Creates an array with no element.
ary_new2(int len)
rb_ary_new2(int len)
Creates an array with no element, with allocating internal buffer
for len elements.
ary_new3(int n, ...)
rb_ary_new3(int n, ...)
Creates an n-elements array from arguments.
ary_new4(int n, VALUE *elts)
rb_ary_new4(int n, VALUE *elts)
Creates an n-elements array from C array.
ary_push(VALUE ary, VALUE val)
ary_pop(VALUE ary)
ary_shift(VALUE ary)
ary_unshift(VALUE ary, VALUE val)
ary_entry(VALUE ary, int idx)
rb_ary_push(VALUE ary, VALUE val)
rb_ary_pop(VALUE ary)
rb_ary_shift(VALUE ary)
rb_ary_unshift(VALUE ary, VALUE val)
rb_ary_entry(VALUE ary, int idx)
Array operations. The first argument to each functions must be an
array. They may dump core if other types given.
@ -376,10 +376,10 @@ C
Following Ruby constants can be referred from C.
TRUE
FALSE
Qtrue
Qfalse
Boolean values. FALSE is false in the C also (i.e. 0).
Boolean values. Qfalse is false in the C also (i.e. 0).
Qnil
@ -526,9 +526,9 @@ Ruby
Init_dbm()
{
/* DBMクラスを定義する */
cDBM = rb_define_class("DBM", cObject);
cDBM = rb_define_class("DBM", rb_cObject);
/* DBMはEnumerateモジュールをインクルードする */
rb_include_module(cDBM, mEnumerable);
rb_include_module(cDBM, rb_mEnumerable);
/* DBMクラスのクラスメソッドopen(): 引数はCの配列で受ける */
rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1);
@ -704,9 +704,9 @@ Ruby
してくれますextconf.rbを書き換えるなどしてMakefileの再生成
が必要な時はまたRubyディレクトリでmakeしてください
(9) debug
(9) rb_debug
You may need to debug the module. The modules can be linked
You may need to rb_debug the module. The modules can be linked
statically by adding directory name in the ext/Setup file,
so that you can inspect the module by the debugger.
@ -792,13 +792,13 @@ Ruby
const: nil object
TRUE
Qtrue
const: TRUE object(default true value)
const: Qtrue object(default true value)
FALSE
Qfalse
const: FALSE object
const: Qfalse object
** Cデータのカプセル化
@ -988,21 +988,21 @@ val
** 例外・エラー
void Warning(char *fmt, ...)
void rb_warning(char *fmt, ...)
verbose時に標準エラー出力に警告情報を表示する引数はprintf()と同じ.
rb_verbose時に標準エラー出力に警告情報を表示する引数はprintf()と同じ.
void Fail(char *fmt, ...)
void rb_raise(rb_eRuntimeError, char *fmt, ...)
例外を発生させる引数はprintf()と同じ.
void Fatal(char *fmt, ...)
void rb_fatal(char *fmt, ...)
致命的例外を発生させる.通常の例外処理は行なわれず, インター
プリタが終了する(ただしensureで指定されたコードは終了前に実
行される)
void Bug(char *fmt, ...)
void rb_bug(char *fmt, ...)
インタープリタなどプログラムのバグでしか発生するはずのない状
況の時呼ぶ.インタープリタはコアダンプし直ちに終了する.例外
@ -1034,7 +1034,7 @@ extconf.rb
have_library(lib, func)
関数funcを定義しているライブラリlibの存在をチェックする
イブラリが存在する時,TRUEを返す.
イブラリが存在する時,Qtrueを返す.
have_func(func)

View file

@ -171,43 +171,43 @@ Ruby
文字列に対する関数
str_new(char *ptr, int len)
rb_str_new(char *ptr, int len)
新しいRubyの文字列を生成する
str_new2(char *ptr)
rb_str_new2(char *ptr)
Cの文字列からRubyの文字列を生成するこの関数の機能は
str_new(ptr, strlen(ptr))と同等である.
rb_str_new(ptr, strlen(ptr))と同等である.
str_cat(VALUE str, char *ptr, int len)
rb_str_cat(VALUE str, char *ptr, int len)
Rubyの文字列strにlenバイトの文字列ptrを追加する
配列に対する関数
ary_new()
rb_ary_new()
要素が0の配列を生成する
ary_new2(int len)
rb_ary_new2(int len)
要素が0の配列を生成するlen要素分の領域をあらかじめ割り
当てておく.
ary_new3(int n, ...)
rb_ary_new3(int n, ...)
引数で指定したn要素を含む配列を生成する
ary_new4(int n, VALUE *elts)
rb_ary_new4(int n, VALUE *elts)
配列で与えたn要素の配列を生成する
ary_push(VALUE ary, VALUE val)
ary_pop(VALUE ary)
ary_shift(VALUE ary)
ary_unshift(VALUE ary, VALUE val)
ary_entry(VALUE ary, int idx)
rb_ary_push(VALUE ary, VALUE val)
rb_ary_pop(VALUE ary)
rb_ary_shift(VALUE ary)
rb_ary_unshift(VALUE ary, VALUE val)
rb_ary_entry(VALUE ary, int idx)
Arrayの同名のメソッドと同じ働きをする関数第1引数は必ず
配列でなければならない.
@ -403,10 +403,10 @@ C
以下のRubyの定数はCのレベルから参照できる
TRUE
FALSE
Qtrue
Qfalse
真偽値.FALSEはC言語でも偽とみなされる(つまり0)
真偽値.QfalseはC言語でも偽とみなされる(つまり0)
Qnil
@ -557,9 +557,9 @@ Ruby
Init_dbm()
{
/* DBMクラスを定義する */
cDBM = rb_define_class("DBM", cObject);
cDBM = rb_define_class("DBM", rb_cObject);
/* DBMはEnumerateモジュールをインクルードする */
rb_include_module(cDBM, mEnumerable);
rb_include_module(cDBM, rb_mEnumerable);
/* DBMクラスのクラスメソッドopen(): 引数はCの配列で受ける */
rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1);
@ -855,11 +855,11 @@ Ruby
定数: nilオブジェクト
TRUE
Qtrue
定数: trueオブジェクト(真のデフォルト値)
FALSE
Qfalse
定数: falseオブジェクト
@ -897,9 +897,9 @@ data
NUM2INT(value)
INT2NUM(i)
NUM2DBL(value)
float_new(f)
rb_float_new(f)
STR2CSTR(value)
str_new2(s)
rb_str_new2(s)
** クラス/モジュール定義
@ -1071,25 +1071,25 @@ val
** 例外・エラー
void Warning(char *fmt, ...)
void rb_warning(char *fmt, ...)
verbose時に標準エラー出力に警告情報を表示する引数はprintf()と同じ.
rb_verbose時に標準エラー出力に警告情報を表示する引数はprintf()と同じ.
void Fail(char *fmt, ...)
void rb_raise(rb_eRuntimeError, char *fmt, ...)
RuntimeError例外を発生させる引数はprintf()と同じ.
void Raise(VALUE exception, char *fmt, ...)
void rb_raise(VALUE exception, char *fmt, ...)
exceptionで指定した例外を発生させるfmt以下の引数はprintf()と同じ.
void Fatal(char *fmt, ...)
void rb_fatal(char *fmt, ...)
致命的例外を発生させる.通常の例外処理は行なわれず, インター
プリタが終了する(ただしensureで指定されたコードは終了前に実
行される)
void Bug(char *fmt, ...)
void rb_bug(char *fmt, ...)
インタープリタなどプログラムのバグでしか発生するはずのない状
況の時呼ぶ.インタープリタはコアダンプし直ちに終了する.例外
@ -1121,7 +1121,7 @@ extconf.rb
have_library(lib, func)
関数funcを定義しているライブラリlibの存在をチェックする
イブラリが存在する時,TRUEを返す.
イブラリが存在する時,Qtrueを返す.
have_func(func)

View file

@ -20,7 +20,8 @@ Ruby
+ イテレータとクロージャ
+ ガーベージコレクタ
+ ダイナミックローディング (アーキテクチャによる)
+ 移植性が高い多くのUNIX上で動く
+ 移植性が高い多くのUNIX上で動くだけでなくDOSやWindows
MacBeOSなどの上でも動く
* 入手法
@ -41,14 +42,14 @@ Ruby
です.
* メリングリスト
* メリングリスト
Rubyに関わる話題のためのメリングリストを開設しました.ア
Rubyに関わる話題のためのメリングリストを開設しました.ア
ドレスは
ruby-list@netlab.co.jp
です.このアドレスにメルを送れば,自動的に登録されます.
です.このアドレスにメルを送れば,自動的に登録されます.
* コンパイル・インストール
@ -122,34 +123,37 @@ Licence)
由に変更できます.
(a) ネットニューズにポストしたり,作者に変更を送付する
などの方法で,変更を公開する
などの方法で,変更を公開する
(b) 変更したRubyを自分の所属する組織内部だけで使う
(b) 変更したRubyを自分の所属する組織内部だけで使う
(c) 変更点を明示したうえ,ソフトウェアの名前を変更する.
そのソフトウェアを配布する時にはもとのRubyも同時に
配布する
そのソフトウェアを配布する時には変更前のRubyも同時
に配布するまたは変更前のRubyのソースの入手法を明
示する.
(d) その他の変更条件を作者と合意する
(d) その他の変更条件を作者と合意する
3. 以下の条件のいずれかを満たす時にRubyをオブジェクトコー
ドや実行形式でも配布できます.
(a) バイナリを受け取った人がソースを入手できるようにソー
スの入手法を明示する
(a) バイナリを受け取った人がソースを入手できるように
ソースの入手法を明示する
(b) 機械可読なソースコードを添付する
(b) 機械可読なソースコードを添付する
(c) 変更を行ったバイナリは名前を変更したうえ,ソースの
入手法を明示する
入手法を明示する
(d) その他の配布条件を作者と合意する
(d) その他の配布条件を作者と合意する
4. 他のプログラムへの引用はいかなる目的であれ自由です.た
だしRubyに含まれる他の作者によるコードはそれぞれの
作者の意向による制限が加えられます具体的にはgc.c(一部)
util.c(一部)st.[ch]regex.[ch], fnmatch.[ch], glob.c
および./missingディレクトリ下のファイル群が該当します
それぞれの配布条件などに付いては各ファイルを参照してく
ださい.
5. Rubyへの入力となるスクリプトおよびRubyからの出力の権
利はRubyの作者ではなくそれぞれの入出力を生成した人に

1
ToDo
View file

@ -1,4 +1,3 @@
* remove Enumerable#reverse at 1.2
* non-blocking open/write for thread
* package or access control for global variables
* format

535
array.c

File diff suppressed because it is too large Load diff

336
bignum.c
View file

@ -12,7 +12,7 @@
#include <math.h>
#include <ctype.h>
VALUE cBignum;
VALUE rb_cBignum;
typedef unsigned short USHORT;
#define BDIGITS(x) RBIGNUM(x)->digits
@ -38,10 +38,10 @@ bignew_1(klass, len, sign)
return (VALUE)big;
}
#define bignew(len,sign) bignew_1(cBignum,len,sign)
#define bignew(len,sign) bignew_1(rb_cBignum,len,sign)
VALUE
big_clone(x)
rb_big_clone(x)
VALUE x;
{
VALUE z = bignew_1(CLASS_OF(x), RBIGNUM(x)->len, RBIGNUM(x)->sign);
@ -51,7 +51,7 @@ big_clone(x)
}
void
big_2comp(x) /* get 2's complement */
rb_big_2comp(x) /* get 2's complement */
VALUE x;
{
unsigned int i = RBIGNUM(x)->len;
@ -101,14 +101,14 @@ bignorm(x)
}
VALUE
big_norm(x)
rb_big_norm(x)
VALUE x;
{
return bignorm(RBIGNUM(x));
return bignorm(x);
}
VALUE
uint2big(n)
rb_uint2big(n)
unsigned long n;
{
unsigned int i = 0;
@ -130,7 +130,7 @@ uint2big(n)
}
VALUE
int2big(n)
rb_int2big(n)
long n;
{
long neg = 0;
@ -140,7 +140,7 @@ int2big(n)
n = -n;
neg = 1;
}
big = uint2big(n);
big = rb_uint2big(n);
if (neg) {
RBIGNUM(big)->sign = 0;
}
@ -148,23 +148,23 @@ int2big(n)
}
VALUE
uint2inum(n)
rb_uint2inum(n)
unsigned long n;
{
if (POSFIXABLE(n)) return INT2FIX(n);
return uint2big(n);
return rb_uint2big(n);
}
VALUE
int2inum(n)
rb_int2inum(n)
long n;
{
if (FIXABLE(n)) return INT2FIX(n);
return int2big(n);
return rb_int2big(n);
}
VALUE
str2inum(str, base)
rb_str2inum(str, base)
char *str;
int base;
{
@ -222,7 +222,7 @@ str2inum(str, base)
}
}
else {
VALUE big = uint2big(val);
VALUE big = rb_uint2big(val);
RBIGNUM(big)->sign = sign;
return big;
}
@ -271,7 +271,7 @@ str2inum(str, base)
static char hexmap[] = "0123456789abcdef";
VALUE
big2str(x, base)
rb_big2str(x, base)
VALUE x;
int base;
{
@ -282,10 +282,10 @@ big2str(x, base)
char *s, c;
if (FIXNUM_P(x)) {
return fix2str(x, base);
return rb_fix2str(x, base);
}
i = RBIGNUM(x)->len;
if (i == 0) return str_new2("0");
if (i == 0) return rb_str_new2("0");
if (base == 10) {
j = (sizeof(USHORT)/sizeof(char)*CHAR_BIT*i*241L)/800+2;
hbase = 10000;
@ -305,12 +305,12 @@ big2str(x, base)
else {
j = 0;
hbase = 0;
Fail("bignum cannot treat base %d", base);
rb_raise(rb_eArgError, "bignum cannot treat base %d", base);
}
t = big_clone(x);
t = rb_big_clone(x);
ds = BDIGITS(t);
ss = str_new(0, j);
ss = rb_str_new(0, j);
s = RSTRING(ss)->ptr;
s[0] = RBIGNUM(x)->sign ? '+' : '-';
@ -340,14 +340,14 @@ big2str(x, base)
}
static VALUE
big_to_s(x)
rb_big_to_s(x)
VALUE x;
{
return big2str(x, 10);
return rb_big2str(x, 10);
}
unsigned long
big2ulong(x)
rb_big2ulong(x)
VALUE x;
{
unsigned long num;
@ -355,7 +355,7 @@ big2ulong(x)
USHORT *ds;
if (len > sizeof(long)/sizeof(USHORT))
ArgError("bignum too big to convert into `uint'");
rb_raise(rb_eArgError, "bignum too big to convert into `uint'");
ds = BDIGITS(x);
num = 0;
while (len--) {
@ -366,27 +366,27 @@ big2ulong(x)
}
long
big2long(x)
rb_big2long(x)
VALUE x;
{
unsigned long num = big2ulong(x);
unsigned long num = rb_big2ulong(x);
if ((long)num < 0) {
ArgError("bignum too big to convert into `int'");
rb_raise(rb_eArgError, "bignum too big to convert into `int'");
}
if (!RBIGNUM(x)->sign) return -num;
return num;
}
VALUE
big_to_i(x)
static VALUE
rb_big_to_i(x)
VALUE x;
{
return bignorm(x);
}
VALUE
dbl2big(d)
rb_dbl2big(d)
double d;
{
unsigned int i = 0;
@ -412,7 +412,7 @@ dbl2big(d)
}
double
big2dbl(x)
rb_big2dbl(x)
VALUE x;
{
double d = 0.0;
@ -426,29 +426,29 @@ big2dbl(x)
return d;
}
VALUE
big_to_f(x)
static VALUE
rb_big_to_f(x)
VALUE x;
{
return float_new(big2dbl(x));
return rb_float_new(rb_big2dbl(x));
}
static VALUE
big_cmp(x, y)
rb_big_cmp(x, y)
VALUE x, y;
{
int xlen = RBIGNUM(x)->len;
switch (TYPE(y)) {
case T_FIXNUM:
y = int2big(FIX2LONG(y));
y = rb_int2big(FIX2LONG(y));
break;
case T_BIGNUM:
break;
default:
return num_coerce_bin(x, y);
return rb_num_coerce_bin(x, y);
}
if (RBIGNUM(x)->sign > RBIGNUM(y)->sign) return INT2FIX(1);
@ -466,18 +466,18 @@ big_cmp(x, y)
}
static VALUE
big_eq(x, y)
rb_big_eq(x, y)
VALUE x, y;
{
if (big_cmp(x, y) == INT2FIX(0)) return TRUE;
return FALSE;
if (rb_big_cmp(x, y) == INT2FIX(0)) return Qtrue;
return Qfalse;
}
static VALUE
big_uminus(x)
rb_big_uminus(x)
VALUE x;
{
VALUE z = big_clone(x);
VALUE z = rb_big_clone(x);
RBIGNUM(z)->sign = !RBIGNUM(x)->sign;
@ -485,16 +485,16 @@ big_uminus(x)
}
static VALUE
big_neg(x)
rb_big_neg(x)
VALUE x;
{
VALUE z = big_clone(x);
VALUE z = rb_big_clone(x);
unsigned int i = RBIGNUM(x)->len;
USHORT *ds = BDIGITS(z);
if (!RBIGNUM(x)->sign) big_2comp(z);
if (!RBIGNUM(x)->sign) rb_big_2comp(z);
while (i--) ds[i] = ~ds[i];
if (RBIGNUM(x)->sign) big_2comp(z);
if (RBIGNUM(x)->sign) rb_big_2comp(z);
RBIGNUM(z)->sign = !RBIGNUM(z)->sign;
return bignorm(z);
@ -557,22 +557,11 @@ bigadd(x, y, sign)
long num;
unsigned int i, len;
if (RBIGNUM(x)->sign == (RBIGNUM(y)->sign ^ sign)) {
if (RBIGNUM(y)->sign == sign) return bigsub(y, x);
sign = (sign == RBIGNUM(y)->sign);
if (RBIGNUM(x)->sign != sign) {
if (sign) return bigsub(y, x);
return bigsub(x, y);
}
else if (sign == 0) {
/* x - y */
if ((RBIGNUM(x)->sign == 0) && (RBIGNUM(y)->sign == 1)) {
/* x is negative and y is positive. */
/* return -(abs(x) + y) */
VALUE ret;
RBIGNUM(x)->sign = 1; /* x = abs(x) */
ret = bigadd(x, y, 1); /* ret = x + y (recursive call) */
RBIGNUM(ret)->sign = 0; /* ret = -ret */
return ret;
}
}
if (RBIGNUM(x)->len > RBIGNUM(y)->len) {
len = RBIGNUM(x)->len + 1;
@ -581,7 +570,7 @@ bigadd(x, y, sign)
else {
len = RBIGNUM(y)->len + 1;
}
z = bignew(len, sign==RBIGNUM(y)->sign);
z = bignew(len, sign);
len = RBIGNUM(x)->len;
for (i = 0, num = 0; i < len; i++) {
@ -605,45 +594,45 @@ bigadd(x, y, sign)
}
VALUE
big_plus(x, y)
rb_big_plus(x, y)
VALUE x, y;
{
switch (TYPE(y)) {
case T_FIXNUM:
y = int2big(FIX2LONG(y));
y = rb_int2big(FIX2LONG(y));
/* fall through */
case T_BIGNUM:
return bigadd(x, y, 1);
case T_FLOAT:
return float_new(big2dbl(x) + RFLOAT(y)->value);
return rb_float_new(rb_big2dbl(x) + RFLOAT(y)->value);
default:
return num_coerce_bin(x, y);
return rb_num_coerce_bin(x, y);
}
}
VALUE
big_minus(x, y)
rb_big_minus(x, y)
VALUE x, y;
{
switch (TYPE(y)) {
case T_FIXNUM:
y = int2big(FIX2LONG(y));
y = rb_int2big(FIX2LONG(y));
/* fall through */
case T_BIGNUM:
return bigadd(x, y, 0);
case T_FLOAT:
return float_new(big2dbl(x) - RFLOAT(y)->value);
return rb_float_new(rb_big2dbl(x) - RFLOAT(y)->value);
default:
return num_coerce_bin(x, y);
return rb_num_coerce_bin(x, y);
}
}
VALUE
big_mul(x, y)
rb_big_mul(x, y)
VALUE x, y;
{
unsigned int i = 0, j;
@ -651,20 +640,20 @@ big_mul(x, y)
VALUE z;
USHORT *zds;
if (FIXNUM_P(x)) x = int2big(FIX2LONG(x));
if (FIXNUM_P(x)) x = rb_int2big(FIX2LONG(x));
switch (TYPE(y)) {
case T_FIXNUM:
y = int2big(FIX2LONG(y));
y = rb_int2big(FIX2LONG(y));
break;
case T_BIGNUM:
break;
case T_FLOAT:
return float_new(big2dbl(x) * RFLOAT(y)->value);
return rb_float_new(rb_big2dbl(x) * RFLOAT(y)->value);
default:
return num_coerce_bin(x, y);
return rb_num_coerce_bin(x, y);
}
j = RBIGNUM(x)->len + RBIGNUM(y)->len + 1;
@ -703,7 +692,7 @@ bigdivmod(x, y, div, mod, modulo)
USHORT dd, q;
yds = BDIGITS(y);
if (ny == 0 && yds[0] == 0) num_zerodiv();
if (ny == 0 && yds[0] == 0) rb_num_zerodiv();
if (nx < ny || nx == ny && BDIGITS(x)[nx - 1] < BDIGITS(y)[ny - 1]) {
if (div) *div = INT2FIX(0);
if (mod) *mod = bignorm(x);
@ -712,7 +701,7 @@ bigdivmod(x, y, div, mod, modulo)
xds = BDIGITS(x);
if (ny == 1) {
dd = yds[0];
z = big_clone(x);
z = rb_big_clone(x);
zds = BDIGITS(z);
t2 = 0; i = nx;
while (i--) {
@ -732,7 +721,7 @@ bigdivmod(x, y, div, mod, modulo)
if (nx==ny) zds[nx+1] = 0;
while (!yds[ny-1]) ny--;
if ((dd = BIGRAD/(int)(yds[ny-1]+1)) != 1) {
yy = big_clone(y);
yy = rb_big_clone(y);
tds = BDIGITS(yy);
j = 0;
num = 0;
@ -786,7 +775,7 @@ bigdivmod(x, y, div, mod, modulo)
zds[j] = q;
} while (--j >= ny);
if (div) { /* move quotient down in z */
*div = big_clone(z);
*div = rb_big_clone(z);
zds = BDIGITS(*div);
j = (nx==ny ? nx+2 : nx+1) - ny;
for (i = 0;i < j;i++) zds[i] = zds[i+ny];
@ -794,7 +783,7 @@ bigdivmod(x, y, div, mod, modulo)
*div = bignorm(*div);
}
if (mod) { /* just normalize remainder */
*mod = big_clone(z);
*mod = rb_big_clone(z);
if (dd) {
zds = BDIGITS(*mod);
t2 = 0; i = ny;
@ -820,24 +809,24 @@ bigdivmod(x, y, div, mod, modulo)
}
static VALUE
big_div(x, y)
rb_big_div(x, y)
VALUE x, y;
{
VALUE z;
switch (TYPE(y)) {
case T_FIXNUM:
y = int2big(FIX2LONG(y));
y = rb_int2big(FIX2LONG(y));
break;
case T_BIGNUM:
break;
case T_FLOAT:
return float_new(big2dbl(x) / RFLOAT(y)->value);
return rb_float_new(rb_big2dbl(x) / RFLOAT(y)->value);
default:
return num_coerce_bin(x, y);
return rb_num_coerce_bin(x, y);
}
bigdivmod(x, y, &z, 0, 0);
@ -846,7 +835,7 @@ big_div(x, y)
static VALUE
big_modulo(x, y, modulo)
rb_big_modulo(x, y, modulo)
VALUE x, y;
int modulo;
{
@ -854,18 +843,18 @@ big_modulo(x, y, modulo)
switch (TYPE(y)) {
case T_FIXNUM:
y = int2big(FIX2LONG(y));
y = rb_int2big(FIX2LONG(y));
break;
case T_BIGNUM:
break;
case T_FLOAT:
y = dbl2big(RFLOAT(y)->value);
y = rb_dbl2big(RFLOAT(y)->value);
break;
default:
return num_coerce_bin(x, y);
return rb_num_coerce_bin(x, y);
}
bigdivmod(x, y, 0, &z, modulo);
@ -873,47 +862,47 @@ big_modulo(x, y, modulo)
}
static VALUE
big_mod(x, y)
rb_big_mod(x, y)
VALUE x, y;
{
return big_modulo(x, y, 1);
return rb_big_modulo(x, y, 1);
}
static VALUE
big_remainder(x, y)
rb_big_remainder(x, y)
VALUE x, y;
{
return big_modulo(x, y, 0);
return rb_big_modulo(x, y, 0);
}
static VALUE
big_divmod(x, y)
rb_big_divmod(x, y)
VALUE x, y;
{
VALUE div, mod;
switch (TYPE(y)) {
case T_FIXNUM:
y = int2big(FIX2LONG(y));
y = rb_int2big(FIX2LONG(y));
break;
case T_FLOAT:
y = dbl2big(RFLOAT(y)->value);
y = rb_dbl2big(RFLOAT(y)->value);
break;
case T_BIGNUM:
break;
default:
return num_coerce_bin(x, y);
return rb_num_coerce_bin(x, y);
}
bigdivmod(x, y, &div, &mod, 1);
return assoc_new(div, mod);;
return rb_assoc_new(div, mod);;
}
VALUE
big_pow(x, y)
rb_big_pow(x, y)
VALUE x, y;
{
double d;
@ -926,8 +915,8 @@ big_pow(x, y)
break;
case T_BIGNUM:
Warn("in a**b, b may be too big");
d = big2dbl(y);
rb_warn("in a**b, b may be too big");
d = rb_big2dbl(y);
break;
case T_FIXNUM:
@ -941,9 +930,9 @@ big_pow(x, y)
if (yy == 0) break;
while (yy % 2 == 0) {
yy = yy / 2;
x = big_mul(x, x);
x = rb_big_mul(x, x);
}
z = big_mul(z, x);
z = rb_big_mul(z, x);
}
return z;
}
@ -951,13 +940,13 @@ big_pow(x, y)
break;
default:
return num_coerce_bin(x, y);
return rb_num_coerce_bin(x, y);
}
return float_new(pow(big2dbl(x), d));
return rb_float_new(pow(rb_big2dbl(x), d));
}
VALUE
big_and(x, y)
rb_big_and(x, y)
VALUE x, y;
{
VALUE z;
@ -966,19 +955,19 @@ big_and(x, y)
char sign;
if (FIXNUM_P(y)) {
y = int2big(FIX2LONG(y));
y = rb_int2big(FIX2LONG(y));
}
else {
Check_Type(y, T_BIGNUM);
}
if (!RBIGNUM(y)->sign) {
y = big_clone(y);
big_2comp(y);
y = rb_big_clone(y);
rb_big_2comp(y);
}
if (!RBIGNUM(x)->sign) {
x = big_clone(x);
big_2comp(x);
x = rb_big_clone(x);
rb_big_2comp(x);
}
if (RBIGNUM(x)->len > RBIGNUM(y)->len) {
l1 = RBIGNUM(y)->len;
@ -1003,12 +992,12 @@ big_and(x, y)
for (; i<l2; i++) {
zds[i] = sign?0:ds2[i];
}
if (!RBIGNUM(z)->sign) big_2comp(z);
if (!RBIGNUM(z)->sign) rb_big_2comp(z);
return bignorm(z);
}
VALUE
big_or(x, y)
rb_big_or(x, y)
VALUE x, y;
{
VALUE z;
@ -1017,19 +1006,19 @@ big_or(x, y)
char sign;
if (FIXNUM_P(y)) {
y = int2big(FIX2LONG(y));
y = rb_int2big(FIX2LONG(y));
}
else {
Check_Type(y, T_BIGNUM);
}
if (!RBIGNUM(y)->sign) {
y = big_clone(y);
big_2comp(y);
y = rb_big_clone(y);
rb_big_2comp(y);
}
if (!RBIGNUM(x)->sign) {
x = big_clone(x);
big_2comp(x);
x = rb_big_clone(x);
rb_big_2comp(x);
}
if (RBIGNUM(x)->len > RBIGNUM(y)->len) {
l1 = RBIGNUM(y)->len;
@ -1054,13 +1043,13 @@ big_or(x, y)
for (; i<l2; i++) {
zds[i] = sign?ds2[i]:(BIGRAD-1);
}
if (!RBIGNUM(z)->sign) big_2comp(z);
if (!RBIGNUM(z)->sign) rb_big_2comp(z);
return bignorm(z);
}
VALUE
big_xor(x, y)
rb_big_xor(x, y)
VALUE x, y;
{
VALUE z;
@ -1069,19 +1058,19 @@ big_xor(x, y)
char sign;
if (FIXNUM_P(y)) {
y = int2big(FIX2LONG(y));
y = rb_int2big(FIX2LONG(y));
}
else {
Check_Type(y, T_BIGNUM);
}
if (!RBIGNUM(y)->sign) {
y = big_clone(y);
big_2comp(y);
y = rb_big_clone(y);
rb_big_2comp(y);
}
if (!RBIGNUM(x)->sign) {
x = big_clone(x);
big_2comp(x);
x = rb_big_clone(x);
rb_big_2comp(x);
}
if (RBIGNUM(x)->len > RBIGNUM(y)->len) {
l1 = RBIGNUM(y)->len;
@ -1108,15 +1097,15 @@ big_xor(x, y)
for (; i<l2; i++) {
zds[i] = sign?ds2[i]:~ds2[i];
}
if (!RBIGNUM(z)->sign) big_2comp(z);
if (!RBIGNUM(z)->sign) rb_big_2comp(z);
return bignorm(z);
}
static VALUE big_rshift _((VALUE,VALUE));
static VALUE rb_big_rshift _((VALUE,VALUE));
VALUE
big_lshift(x, y)
rb_big_lshift(x, y)
VALUE x, y;
{
USHORT *xds, *zds;
@ -1127,7 +1116,7 @@ big_lshift(x, y)
unsigned long num = 0;
unsigned int len, i;
if (shift < 0) return big_rshift(x, INT2FIX(-shift));
if (shift < 0) return rb_big_rshift(x, INT2FIX(-shift));
xds = BDIGITS(x);
len = RBIGNUM(x)->len;
z = bignew(len+s1+1, RBIGNUM(x)->sign);
@ -1145,7 +1134,7 @@ big_lshift(x, y)
}
static VALUE
big_rshift(x, y)
rb_big_rshift(x, y)
VALUE x, y;
{
USHORT *xds, *zds;
@ -1157,7 +1146,7 @@ big_rshift(x, y)
unsigned int i = RBIGNUM(x)->len;
unsigned int j;
if (shift < 0) return big_lshift(x, INT2FIX(-shift));
if (shift < 0) return rb_big_lshift(x, INT2FIX(-shift));
if (s1 > RBIGNUM(x)->len) {
if (RBIGNUM(x)->sign)
return INT2FIX(0);
@ -1177,7 +1166,7 @@ big_rshift(x, y)
}
static VALUE
big_aref(x, y)
rb_big_aref(x, y)
VALUE x, y;
{
USHORT *xds;
@ -1190,8 +1179,8 @@ big_aref(x, y)
if (!RBIGNUM(x)->sign) {
if (s1 >= RBIGNUM(x)->len) return INT2FIX(1);
x = big_clone(x);
big_2comp(x);
x = rb_big_clone(x);
rb_big_2comp(x);
}
else {
if (s1 >= RBIGNUM(x)->len) return INT2FIX(0);
@ -1203,7 +1192,7 @@ big_aref(x, y)
}
static VALUE
big_hash(x)
rb_big_hash(x)
VALUE x;
{
int i, len, key;
@ -1217,24 +1206,25 @@ big_hash(x)
}
static VALUE
big_coerce(x, y)
rb_big_coerce(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
return assoc_new(int2big(FIX2LONG(y)), x);
return rb_assoc_new(rb_int2big(FIX2LONG(y)), x);
}
else {
TypeError("can't coerce %s to Bignum", rb_class2name(CLASS_OF(y)));
rb_raise(rb_eTypeError, "can't coerce %s to Bignum",
rb_class2name(CLASS_OF(y)));
}
/* not reached */
}
static VALUE
big_abs(x)
rb_big_abs(x)
VALUE x;
{
if (!RBIGNUM(x)->sign) {
x = big_clone(x);
x = rb_big_clone(x);
RBIGNUM(x)->sign = 1;
}
return x;
@ -1245,7 +1235,7 @@ big_abs(x)
*/
VALUE
big_rand(max)
rb_big_rand(max)
VALUE max;
{
struct RBignum *v;
@ -1261,56 +1251,56 @@ big_rand(max)
#endif
}
return big_mod(v, max);
return rb_big_mod((VALUE)v, max);
}
static VALUE
big_size(big)
rb_big_size(big)
VALUE big;
{
return INT2FIX(RBIGNUM(big)->len*sizeof(USHORT));
}
static VALUE
big_zero_p(big)
rb_big_zero_p(big)
VALUE big;
{
return FALSE;
return Qfalse;
}
void
Init_Bignum()
{
cBignum = rb_define_class("Bignum", cInteger);
rb_cBignum = rb_define_class("Bignum", rb_cInteger);
rb_undef_method(CLASS_OF(cBignum), "new");
rb_undef_method(CLASS_OF(rb_cBignum), "new");
rb_define_method(cBignum, "to_s", big_to_s, 0);
rb_define_method(cBignum, "coerce", big_coerce, 1);
rb_define_method(cBignum, "-@", big_uminus, 0);
rb_define_method(cBignum, "+", big_plus, 1);
rb_define_method(cBignum, "-", big_minus, 1);
rb_define_method(cBignum, "*", big_mul, 1);
rb_define_method(cBignum, "/", big_div, 1);
rb_define_method(cBignum, "%", big_mod, 1);
rb_define_method(cBignum, "divmod", big_divmod, 1);
rb_define_method(cBignum, "remainder", big_remainder, 1);
rb_define_method(cBignum, "**", big_pow, 1);
rb_define_method(cBignum, "&", big_and, 1);
rb_define_method(cBignum, "|", big_or, 1);
rb_define_method(cBignum, "^", big_xor, 1);
rb_define_method(cBignum, "~", big_neg, 0);
rb_define_method(cBignum, "<<", big_lshift, 1);
rb_define_method(cBignum, ">>", big_rshift, 1);
rb_define_method(cBignum, "[]", big_aref, 1);
rb_define_method(rb_cBignum, "to_s", rb_big_to_s, 0);
rb_define_method(rb_cBignum, "coerce", rb_big_coerce, 1);
rb_define_method(rb_cBignum, "-@", rb_big_uminus, 0);
rb_define_method(rb_cBignum, "+", rb_big_plus, 1);
rb_define_method(rb_cBignum, "-", rb_big_minus, 1);
rb_define_method(rb_cBignum, "*", rb_big_mul, 1);
rb_define_method(rb_cBignum, "/", rb_big_div, 1);
rb_define_method(rb_cBignum, "%", rb_big_mod, 1);
rb_define_method(rb_cBignum, "divmod", rb_big_divmod, 1);
rb_define_method(rb_cBignum, "remainder", rb_big_remainder, 1);
rb_define_method(rb_cBignum, "**", rb_big_pow, 1);
rb_define_method(rb_cBignum, "&", rb_big_and, 1);
rb_define_method(rb_cBignum, "|", rb_big_or, 1);
rb_define_method(rb_cBignum, "^", rb_big_xor, 1);
rb_define_method(rb_cBignum, "~", rb_big_neg, 0);
rb_define_method(rb_cBignum, "<<", rb_big_lshift, 1);
rb_define_method(rb_cBignum, ">>", rb_big_rshift, 1);
rb_define_method(rb_cBignum, "[]", rb_big_aref, 1);
rb_define_method(cBignum, "<=>", big_cmp, 1);
rb_define_method(cBignum, "==", big_eq, 1);
rb_define_method(cBignum, "eql?", big_eq, 1);
rb_define_method(cBignum, "hash", big_hash, 0);
rb_define_method(cBignum, "to_i", big_to_i, 0);
rb_define_method(cBignum, "to_f", big_to_f, 0);
rb_define_method(cBignum, "abs", big_abs, 0);
rb_define_method(cBignum, "size", big_size, 0);
rb_define_method(cBignum, "zero?", big_zero_p, 0);
rb_define_method(rb_cBignum, "<=>", rb_big_cmp, 1);
rb_define_method(rb_cBignum, "==", rb_big_eq, 1);
rb_define_method(rb_cBignum, "eql?", rb_big_eq, 1);
rb_define_method(rb_cBignum, "hash", rb_big_hash, 0);
rb_define_method(rb_cBignum, "to_i", rb_big_to_i, 0);
rb_define_method(rb_cBignum, "to_f", rb_big_to_f, 0);
rb_define_method(rb_cBignum, "abs", rb_big_abs, 0);
rb_define_method(rb_cBignum, "size", rb_big_size, 0);
rb_define_method(rb_cBignum, "zero?", rb_big_zero_p, 0);
}

126
class.c
View file

@ -22,25 +22,25 @@
extern st_table *rb_class_tbl;
VALUE
class_new(super)
rb_class_new(super)
VALUE super;
{
NEWOBJ(klass, struct RClass);
OBJSETUP(klass, cClass, T_CLASS);
OBJSETUP(klass, rb_cClass, T_CLASS);
klass->super = super;
klass->iv_tbl = 0;
klass->m_tbl = 0; /* safe GC */
klass->m_tbl = new_idhash();
klass->m_tbl = st_init_numtable();
return (VALUE)klass;
}
VALUE
singleton_class_new(super)
rb_singleton_class_new(super)
VALUE super;
{
VALUE klass = class_new(super);
VALUE klass = rb_class_new(super);
FL_SET(klass, FL_SINGLETON);
return klass;
@ -57,7 +57,7 @@ clone_method(mid, body, tbl)
}
VALUE
singleton_class_clone(klass)
rb_singleton_class_clone(klass)
VALUE klass;
{
if (!FL_TEST(klass, FL_SINGLETON))
@ -70,7 +70,7 @@ singleton_class_clone(klass)
clone->super = RCLASS(klass)->super;
clone->iv_tbl = 0;
clone->m_tbl = 0;
clone->m_tbl = new_idhash();
clone->m_tbl = st_init_numtable();
st_foreach(RCLASS(klass)->m_tbl, clone_method, clone->m_tbl);
FL_SET(clone, FL_SINGLETON);
return (VALUE)clone;
@ -78,7 +78,7 @@ singleton_class_clone(klass)
}
void
singleton_class_attached(klass, obj)
rb_singleton_class_attached(klass, obj)
VALUE klass, obj;
{
if (FL_TEST(klass, FL_SINGLETON))
@ -92,12 +92,12 @@ rb_define_class_id(id, super)
{
VALUE klass;
if (!super) super = cObject;
klass = class_new(super);
if (!super) super = rb_cObject;
klass = rb_class_new(super);
rb_name_class(klass, id);
/* make metaclass */
RBASIC(klass)->klass = singleton_class_new(RBASIC(super)->klass);
singleton_class_attached(RBASIC(klass)->klass, klass);
RBASIC(klass)->klass = rb_singleton_class_new(RBASIC(super)->klass);
rb_singleton_class_attached(RBASIC(klass)->klass, klass);
rb_funcall(super, rb_intern("inherited"), 1, klass);
return klass;
@ -136,15 +136,15 @@ rb_define_class_under(outer, name, super)
}
VALUE
module_new()
rb_module_new()
{
NEWOBJ(mdl, struct RClass);
OBJSETUP(mdl, cModule, T_MODULE);
OBJSETUP(mdl, rb_cModule, T_MODULE);
mdl->super = 0;
mdl->iv_tbl = 0;
mdl->m_tbl = 0;
mdl->m_tbl = new_idhash();
mdl->m_tbl = st_init_numtable();
return (VALUE)mdl;
}
@ -154,7 +154,7 @@ rb_define_module_id(id)
ID id;
{
extern st_table *rb_class_tbl;
VALUE mdl = module_new();
VALUE mdl = rb_module_new();
rb_name_class(mdl, id);
@ -192,11 +192,11 @@ rb_define_module_under(outer, name)
}
static VALUE
include_class_new(module, super)
include_rb_class_new(module, super)
VALUE module, super;
{
NEWOBJ(klass, struct RClass);
OBJSETUP(klass, cClass, T_ICLASS);
OBJSETUP(klass, rb_cClass, T_ICLASS);
klass->m_tbl = RCLASS(module)->m_tbl;
klass->iv_tbl = RCLASS(module)->iv_tbl;
@ -241,7 +241,7 @@ rb_include_module(klass, module)
}
}
RCLASS(klass)->super =
include_class_new(module, RCLASS(klass)->super);
include_rb_class_new(module, RCLASS(klass)->super);
klass = RCLASS(klass)->super;
module = RCLASS(module)->super;
}
@ -249,35 +249,35 @@ rb_include_module(klass, module)
}
VALUE
mod_included_modules(mod)
rb_mod_included_modules(mod)
VALUE mod;
{
VALUE ary = ary_new();
VALUE ary = rb_ary_new();
VALUE p;
for (p = RCLASS(mod)->super; p; p = RCLASS(p)->super) {
if (BUILTIN_TYPE(p) == T_ICLASS) {
ary_push(ary, RBASIC(p)->klass);
rb_ary_push(ary, RBASIC(p)->klass);
}
}
return ary;
}
VALUE
mod_ancestors(mod)
rb_mod_ancestors(mod)
VALUE mod;
{
VALUE ary = ary_new();
VALUE ary = rb_ary_new();
VALUE p;
for (p = mod; p; p = RCLASS(p)->super) {
if (FL_TEST(p, FL_SINGLETON))
continue;
if (BUILTIN_TYPE(p) == T_ICLASS) {
ary_push(ary, RBASIC(p)->klass);
rb_ary_push(ary, RBASIC(p)->klass);
}
else {
ary_push(ary, p);
rb_ary_push(ary, p);
}
}
return ary;
@ -290,18 +290,18 @@ ins_methods_i(key, body, ary)
VALUE ary;
{
if ((body->nd_noex&(NOEX_PRIVATE|NOEX_PROTECTED)) == 0) {
VALUE name = str_new2(rb_id2name(key));
VALUE name = rb_str_new2(rb_id2name(key));
if (!ary_includes(ary, name)) {
if (!rb_ary_includes(ary, name)) {
if (!body->nd_body) {
ary_push(ary, Qnil);
rb_ary_push(ary, Qnil);
}
ary_push(ary, name);
rb_ary_push(ary, name);
}
}
else if (body->nd_body && nd_type(body->nd_body) == NODE_ZSUPER) {
ary_push(ary, Qnil);
ary_push(ary, str_new2(rb_id2name(key)));
rb_ary_push(ary, Qnil);
rb_ary_push(ary, rb_str_new2(rb_id2name(key)));
}
return ST_CONTINUE;
}
@ -313,19 +313,19 @@ ins_methods_prot_i(key, body, ary)
VALUE ary;
{
if (!body->nd_body) {
ary_push(ary, Qnil);
ary_push(ary, str_new2(rb_id2name(key)));
rb_ary_push(ary, Qnil);
rb_ary_push(ary, rb_str_new2(rb_id2name(key)));
}
else if (body->nd_noex & NOEX_PROTECTED) {
VALUE name = str_new2(rb_id2name(key));
VALUE name = rb_str_new2(rb_id2name(key));
if (!ary_includes(ary, name)) {
ary_push(ary, name);
if (!rb_ary_includes(ary, name)) {
rb_ary_push(ary, name);
}
}
else if (nd_type(body->nd_body) == NODE_ZSUPER) {
ary_push(ary, Qnil);
ary_push(ary, str_new2(rb_id2name(key)));
rb_ary_push(ary, Qnil);
rb_ary_push(ary, rb_str_new2(rb_id2name(key)));
}
return ST_CONTINUE;
}
@ -337,19 +337,19 @@ ins_methods_priv_i(key, body, ary)
VALUE ary;
{
if (!body->nd_body) {
ary_push(ary, Qnil);
ary_push(ary, str_new2(rb_id2name(key)));
rb_ary_push(ary, Qnil);
rb_ary_push(ary, rb_str_new2(rb_id2name(key)));
}
else if (body->nd_noex & NOEX_PRIVATE) {
VALUE name = str_new2(rb_id2name(key));
VALUE name = rb_str_new2(rb_id2name(key));
if (!ary_includes(ary, name)) {
ary_push(ary, name);
if (!rb_ary_includes(ary, name)) {
rb_ary_push(ary, name);
}
}
else if (nd_type(body->nd_body) == NODE_ZSUPER) {
ary_push(ary, Qnil);
ary_push(ary, str_new2(rb_id2name(key)));
rb_ary_push(ary, Qnil);
rb_ary_push(ary, rb_str_new2(rb_id2name(key)));
}
return ST_CONTINUE;
}
@ -364,7 +364,7 @@ method_list(mod, option, func)
VALUE klass;
VALUE *p, *q, *pend;
ary = ary_new();
ary = rb_ary_new();
for (klass = mod; klass; klass = RCLASS(klass)->super) {
st_foreach(RCLASS(klass)->m_tbl, func, ary);
if (!option) break;
@ -382,7 +382,7 @@ method_list(mod, option, func)
}
VALUE
class_instance_methods(argc, argv, mod)
rb_class_instance_methods(argc, argv, mod)
int argc;
VALUE *argv;
VALUE mod;
@ -394,7 +394,7 @@ class_instance_methods(argc, argv, mod)
}
VALUE
class_protected_instance_methods(argc, argv, mod)
rb_class_protected_instance_methods(argc, argv, mod)
int argc;
VALUE *argv;
VALUE mod;
@ -406,7 +406,7 @@ class_protected_instance_methods(argc, argv, mod)
}
VALUE
class_private_instance_methods(argc, argv, mod)
rb_class_private_instance_methods(argc, argv, mod)
int argc;
VALUE *argv;
VALUE mod;
@ -418,14 +418,14 @@ class_private_instance_methods(argc, argv, mod)
}
VALUE
obj_singleton_methods(obj)
rb_obj_singleton_methods(obj)
VALUE obj;
{
VALUE ary;
VALUE klass;
VALUE *p, *q, *pend;
ary = ary_new();
ary = rb_ary_new();
klass = CLASS_OF(obj);
while (klass && FL_TEST(klass, FL_SINGLETON)) {
st_foreach(RCLASS(klass)->m_tbl, ins_methods_i, ary);
@ -503,13 +503,13 @@ rb_singleton_class(obj)
VALUE obj;
{
if (rb_special_const_p(obj)) {
TypeError("cannot define singleton");
rb_raise(rb_eTypeError, "cannot define singleton");
}
if (FL_TEST(RBASIC(obj)->klass, FL_SINGLETON)) {
return RBASIC(obj)->klass;
}
RBASIC(obj)->klass = singleton_class_new(RBASIC(obj)->klass);
singleton_class_attached(RBASIC(obj)->klass, obj);
RBASIC(obj)->klass = rb_singleton_class_new(RBASIC(obj)->klass);
rb_singleton_class_attached(RBASIC(obj)->klass, obj);
return RBASIC(obj)->klass;
}
@ -540,7 +540,7 @@ rb_define_global_function(name, func, argc)
VALUE (*func)();
int argc;
{
rb_define_private_method(mKernel, name, func, argc);
rb_define_private_method(rb_mKernel, name, func, argc);
}
void
@ -557,7 +557,7 @@ rb_define_attr(klass, name, read, write)
char *name;
int read, write;
{
rb_attr(klass, rb_intern(name), read, write, FALSE);
rb_attr(klass, rb_intern(name), read, write, Qfalse);
}
#ifdef HAVE_STDARG_PROTOTYPES
@ -588,14 +588,14 @@ rb_scan_args(argc, argv, fmt, va_alist)
if (*p == '*') {
var = va_arg(vargs, VALUE*);
*var = ary_new4(argc, argv);
*var = rb_ary_new4(argc, argv);
return argc;
}
if (ISDIGIT(*p)) {
n = *p - '0';
if (n > argc)
ArgError("Wrong # of arguments (%d for %d)", argc, n);
rb_raise(rb_eArgError, "Wrong # of arguments (%d for %d)", argc, n);
for (i=0; i<n; i++) {
var = va_arg(vargs, VALUE*);
*var = argv[i];
@ -623,15 +623,15 @@ rb_scan_args(argc, argv, fmt, va_alist)
if(*p == '*') {
var = va_arg(vargs, VALUE*);
if (argc > i) {
*var = ary_new4(argc-i, argv+i);
*var = rb_ary_new4(argc-i, argv+i);
}
else {
*var = ary_new();
*var = rb_ary_new();
}
}
else if (*p == '\0') {
if (argc > i) {
ArgError("Wrong # of arguments(%d for %d)", argc, i);
rb_raise(rb_eArgError, "Wrong # of arguments(%d for %d)", argc, i);
}
}
else {
@ -642,6 +642,6 @@ rb_scan_args(argc, argv, fmt, va_alist)
return argc;
error:
Fatal("bad scan arg format: %s", fmt);
rb_fatal("bad scan arg format: %s", fmt);
return 0;
}

View file

@ -12,7 +12,7 @@
#include "ruby.h"
VALUE mComparable;
VALUE rb_mComparable;
static ID cmp;
@ -23,8 +23,8 @@ cmp_eq(x, y)
VALUE c = rb_funcall(x, cmp, 1, y);
int t = NUM2INT(c);
if (t == 0) return TRUE;
return FALSE;
if (t == 0) return Qtrue;
return Qfalse;
}
static VALUE
@ -34,8 +34,8 @@ cmp_gt(x, y)
VALUE c = rb_funcall(x, cmp, 1, y);
int t = NUM2INT(c);
if (t > 0) return TRUE;
return FALSE;
if (t > 0) return Qtrue;
return Qfalse;
}
static VALUE
@ -45,8 +45,8 @@ cmp_ge(x, y)
VALUE c = rb_funcall(x, cmp, 1, y);
int t = NUM2INT(c);
if (t >= 0) return TRUE;
return FALSE;
if (t >= 0) return Qtrue;
return Qfalse;
}
static VALUE
@ -56,8 +56,8 @@ cmp_lt(x, y)
VALUE c = rb_funcall(x, cmp, 1, y);
int t = NUM2INT(c);
if (t < 0) return TRUE;
return FALSE;
if (t < 0) return Qtrue;
return Qfalse;
}
static VALUE
@ -67,8 +67,8 @@ cmp_le(x, y)
VALUE c = rb_funcall(x, cmp, 1, y);
int t = NUM2INT(c);
if (t <= 0) return TRUE;
return FALSE;
if (t <= 0) return Qtrue;
return Qfalse;
}
static VALUE
@ -77,24 +77,24 @@ cmp_between(x, min, max)
{
VALUE c = rb_funcall(x, cmp, 1, min);
long t = NUM2LONG(c);
if (t < 0) return FALSE;
if (t < 0) return Qfalse;
c = rb_funcall(x, cmp, 1, max);
t = NUM2LONG(c);
if (t > 0) return FALSE;
return TRUE;
if (t > 0) return Qfalse;
return Qtrue;
}
void
Init_Comparable()
{
mComparable = rb_define_module("Comparable");
rb_define_method(mComparable, "==", cmp_eq, 1);
rb_define_method(mComparable, ">", cmp_gt, 1);
rb_define_method(mComparable, ">=", cmp_ge, 1);
rb_define_method(mComparable, "<", cmp_lt, 1);
rb_define_method(mComparable, "<=", cmp_le, 1);
rb_define_method(mComparable, "between?", cmp_between, 2);
rb_mComparable = rb_define_module("Comparable");
rb_define_method(rb_mComparable, "==", cmp_eq, 1);
rb_define_method(rb_mComparable, ">", cmp_gt, 1);
rb_define_method(rb_mComparable, ">=", cmp_ge, 1);
rb_define_method(rb_mComparable, "<", cmp_lt, 1);
rb_define_method(rb_mComparable, "<=", cmp_le, 1);
rb_define_method(rb_mComparable, "between?", cmp_between, 2);
cmp = rb_intern("<=>");
}

69
dir.c
View file

@ -57,7 +57,7 @@ char *getenv();
# include <sys/errno.h>
#endif
static VALUE cDir;
VALUE rb_cDir;
static void
free_dir(dir)
@ -80,7 +80,7 @@ dir_s_open(dir_class, dirname)
dirp = opendir(RSTRING(dirname)->ptr);
if (dirp == NULL) {
if (errno == EMFILE || errno == ENFILE) {
gc_gc();
rb_gc();
dirp = opendir(RSTRING(dirname)->ptr);
}
if (dirp == NULL) {
@ -90,7 +90,7 @@ dir_s_open(dir_class, dirname)
obj = Data_Wrap_Struct(dir_class, 0, free_dir, dirp);
if (iterator_p()) {
if (rb_iterator_p()) {
return rb_ensure(rb_yield, obj, dir_close, obj);
}
@ -100,7 +100,7 @@ dir_s_open(dir_class, dirname)
static void
dir_closed()
{
Fail("closed directory");
rb_raise(rb_eIOError, "closed directory");
}
#define GetDIR(obj, dirp) {\
@ -119,7 +119,7 @@ dir_read(dir)
errno = 0;
dp = readdir(dirp);
if (dp)
return str_taint(str_new(dp->d_name, NAMLEN(dp)));
return rb_str_taint(rb_str_new(dp->d_name, NAMLEN(dp)));
else if (errno == 0) { /* end of stream */
return Qnil;
}
@ -138,7 +138,7 @@ dir_each(dir)
GetDIR(dir, dirp);
for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
file = str_taint(str_new(dp->d_name, NAMLEN(dp)));
file = rb_str_taint(rb_str_new(dp->d_name, NAMLEN(dp)));
rb_yield(file);
}
return dir;
@ -154,7 +154,7 @@ dir_tell(dir)
#if !defined(__CYGWIN32__) && !defined(__BEOS__)
GetDIR(dir, dirp);
pos = telldir(dirp);
return int2inum(pos);
return rb_int2inum(pos);
#else
rb_notimplement();
#endif
@ -240,7 +240,7 @@ dir_s_getwd(dir)
if (getwd(path) == 0) rb_sys_fail(path);
#endif
return str_taint(str_new2(path));
return rb_str_taint(rb_str_new2(path));
}
static VALUE
@ -298,7 +298,7 @@ dir_s_rmdir(obj, dir)
if (rmdir(RSTRING(dir)->ptr) < 0)
rb_sys_fail(RSTRING(dir)->ptr);
return TRUE;
return Qtrue;
}
#define isdelim(c) ((c)==' '||(c)=='\t'||(c)=='\n'||(c)=='\0')
@ -317,7 +317,7 @@ push_globs(ary, s)
if (fnames == (char**)-1) rb_sys_fail(s);
ff = fnames;
while (*ff) {
ary_push(ary, str_taint(str_new2(*ff)));
rb_ary_push(ary, rb_str_taint(rb_str_new2(*ff)));
free(*ff);
ff++;
}
@ -384,9 +384,10 @@ dir_s_glob(dir, str)
Check_SafeStr(str);
if (RSTRING(str)->len > MAXPATHLEN) {
ArgError("pathname too long (%d bytes)", RSTRING(str)->len);
rb_raise(rb_eArgError, "pathname too long (%d bytes)",
RSTRING(str)->len);
}
ary = ary_new();
ary = rb_ary_new();
p = RSTRING(str)->ptr;
pend = p + RSTRING(str)->len;
@ -422,37 +423,37 @@ dir_foreach(io, dirname)
{
VALUE dir;
dir = rb_funcall(cDir, rb_intern("open"), 1, dirname);
dir = rb_funcall(rb_cDir, rb_intern("open"), 1, dirname);
return rb_ensure(dir_each, dir, dir_close, dir);
}
void
Init_Dir()
{
cDir = rb_define_class("Dir", cObject);
rb_cDir = rb_define_class("Dir", rb_cObject);
rb_include_module(cDir, mEnumerable);
rb_include_module(rb_cDir, rb_mEnumerable);
rb_define_singleton_method(cDir, "new", dir_s_open, 1);
rb_define_singleton_method(cDir, "open", dir_s_open, 1);
rb_define_singleton_method(cDir, "foreach", dir_foreach, 1);
rb_define_singleton_method(rb_cDir, "new", dir_s_open, 1);
rb_define_singleton_method(rb_cDir, "open", dir_s_open, 1);
rb_define_singleton_method(rb_cDir, "foreach", dir_foreach, 1);
rb_define_method(cDir,"read", dir_read, 0);
rb_define_method(cDir,"each", dir_each, 0);
rb_define_method(cDir,"rewind", dir_rewind, 0);
rb_define_method(cDir,"tell", dir_tell, 0);
rb_define_method(cDir,"seek", dir_seek, 1);
rb_define_method(cDir,"close", dir_close, 0);
rb_define_method(rb_cDir,"read", dir_read, 0);
rb_define_method(rb_cDir,"each", dir_each, 0);
rb_define_method(rb_cDir,"rewind", dir_rewind, 0);
rb_define_method(rb_cDir,"tell", dir_tell, 0);
rb_define_method(rb_cDir,"seek", dir_seek, 1);
rb_define_method(rb_cDir,"close", dir_close, 0);
rb_define_singleton_method(cDir,"chdir", dir_s_chdir, -1);
rb_define_singleton_method(cDir,"getwd", dir_s_getwd, 0);
rb_define_singleton_method(cDir,"pwd", dir_s_getwd, 0);
rb_define_singleton_method(cDir,"chroot", dir_s_chroot, 1);
rb_define_singleton_method(cDir,"mkdir", dir_s_mkdir, -1);
rb_define_singleton_method(cDir,"rmdir", dir_s_rmdir, 1);
rb_define_singleton_method(cDir,"delete", dir_s_rmdir, 1);
rb_define_singleton_method(cDir,"unlink", dir_s_rmdir, 1);
rb_define_singleton_method(rb_cDir,"chdir", dir_s_chdir, -1);
rb_define_singleton_method(rb_cDir,"getwd", dir_s_getwd, 0);
rb_define_singleton_method(rb_cDir,"pwd", dir_s_getwd, 0);
rb_define_singleton_method(rb_cDir,"chroot", dir_s_chroot, 1);
rb_define_singleton_method(rb_cDir,"mkdir", dir_s_mkdir, -1);
rb_define_singleton_method(rb_cDir,"rmdir", dir_s_rmdir, 1);
rb_define_singleton_method(rb_cDir,"delete", dir_s_rmdir, 1);
rb_define_singleton_method(rb_cDir,"unlink", dir_s_rmdir, 1);
rb_define_singleton_method(cDir,"glob", dir_s_glob, 1);
rb_define_singleton_method(cDir,"[]", dir_s_glob, 1);
rb_define_singleton_method(rb_cDir,"glob", dir_s_glob, 1);
rb_define_singleton_method(rb_cDir,"[]", dir_s_glob, 1);
}

43
dln.c
View file

@ -423,7 +423,7 @@ load_text_data(fd, hdrp, bss, disp)
}
static int
undef_print(key, value)
underb_f_print(key, value)
char *key, *value;
{
fprintf(stderr, " %s\n", key);
@ -434,7 +434,7 @@ static void
dln_print_undef()
{
fprintf(stderr, " Undefined symbols:\n");
st_foreach(undef_tbl, undef_print, NULL);
st_foreach(undef_tbl, underb_f_print, NULL);
}
static void
@ -830,7 +830,7 @@ load_1(fd, disp, need_init)
for (sym = syms; sym<end; sym++) {
char *name = sym->n_un.n_name;
if (name[0] == '_' && sym->n_value >= block) {
if (strcmp(name+1, "libs_to_be_linked") == 0) {
if (strcmp(name+1, "dln_libs_to_be_linked") == 0) {
libs_to_be_linked = (char**)sym->n_value;
}
else if (strcmp(name+1, buf) == 0) {
@ -885,11 +885,11 @@ search_undef(key, value, lib_tbl)
}
struct symdef {
int str_index;
int rb_str_index;
int lib_offset;
};
char *dln_library_path = DLN_DEFAULT_LIB_PATH;
char *dln_librrb_ary_path = DLN_DEFAULT_LIB_PATH;
static int
load_lib(lib)
@ -920,10 +920,10 @@ load_lib(lib)
/* library search path: */
/* look for environment variable DLN_LIBRARY_PATH first. */
/* then variable dln_library_path. */
/* then variable dln_librrb_ary_path. */
/* if path is still NULL, use "." for path. */
path = getenv("DLN_LIBRARY_PATH");
if (path == NULL) path = dln_library_path;
if (path == NULL) path = dln_librrb_ary_path;
file = dln_find_file(lib, path);
fd = open(file, O_RDONLY);
@ -952,7 +952,7 @@ load_lib(lib)
base = (struct symdef*)(data + 1);
name_base = (char*)(base + nsym) + sizeof(int);
while (nsym > 0) {
char *name = name_base + base->str_index;
char *name = name_base + base->rb_str_index;
st_insert(lib_tbl, name, base->lib_offset + sizeof(ahdr));
nsym--;
@ -1186,7 +1186,7 @@ aix_loaderror(char *pathname)
ERRBUF_APPEND("\n");
}
errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */
LoadError(errbuf);
rb_loaderror(errbuf);
return;
}
#endif
@ -1281,14 +1281,14 @@ dln_load(file)
lib = shl_load(file, flags, 0);
if (lib == NULL) {
extern int errno;
LoadError("%s - %s", strerror(errno), file);
rb_loaderror("%s - %s", strerror(errno), file);
}
shl_findsym(&lib, buf, TYPE_PROCEDURE, (void*)&init_fct);
if (init_fct == NULL) {
shl_findsym(&lib, buf, TYPE_UNDEFINED, (void*)&init_fct);
if (init_fct == NULL) {
errno = ENOSYM;
LoadError("%s - %s", strerror(ENOSYM), file);
rb_loaderror("%s - %s", strerror(ENOSYM), file);
}
}
(*init_fct)();
@ -1331,12 +1331,12 @@ dln_load(file)
/* Load object file, if return value ==0 , load failed*/
if(rld_load(NULL, NULL, object_files, NULL) == 0) {
LoadError("Failed to load %.200s", file);
rb_loaderror("Failed to load %.200s", file);
}
/* lookup the initial function */
if(rld_lookup(NULL, buf, &init_address) == 0) {
LoadError("Failed to lookup Init function %.200s",file);
rb_loaderror("Failed to lookup Init function %.200s", file);
}
/* Cannot call *init_address directory, so copy this value to
@ -1363,7 +1363,7 @@ dln_load(file)
LoadError("Failed to load %.200s", file);
}
NSLinkModule(obj_file, file, TRUE);
NSLinkModule(obj_file, file, Qtrue);
/* lookup the initial function */
@ -1394,7 +1394,7 @@ dln_load(file)
/* load extention module */
img_id = load_add_on(file);
if (img_id <= 0) {
LoadError("Failed to load %.200s", file);
rb_loaderror("Failed to load %.200s", file);
}
/* find symbol for module initialize function. */
@ -1416,12 +1416,12 @@ dln_load(file)
if ((B_BAD_IMAGE_ID == err_stat) || (B_BAD_INDEX == err_stat)) {
unload_add_on(img_id);
LoadError("Failed to lookup Init function %.200s", file);
rb_loaderror("Failed to lookup Init function %.200s", file);
}
else if (B_NO_ERROR != err_stat) {
char errmsg[] = "Internal of BeOS version. %.200s (symbol_name = %s)";
unload_add_on(img_id);
LoadError(errmsg, strerror(err_stat), buf);
rb_loaderror(errmsg, strerror(err_stat), buf);
}
/* call module initialize function. */
@ -1444,7 +1444,6 @@ dln_load(file)
CFragSymbolClass class;
void (*init_fct)();
char fullpath[MAXPATHLEN];
extern LoadError();
strcpy(fullpath, file);
@ -1453,7 +1452,7 @@ dln_load(file)
(void)FSMakeFSSpec(0, 0, fullpath, &libspec);
err = ResolveAliasFile(&libspec, 1, &isfolder, &didsomething);
if ( err ) {
LoadError("Unresolved Alias - %s", file);
rb_loaderror("Unresolved Alias - %s", file);
}
/* Load the fragment (or return the connID if it is already loaded */
@ -1463,14 +1462,14 @@ dln_load(file)
errMessage);
if ( err ) {
p2cstr(errMessage);
LoadError("%s - %s",errMessage , file);
rb_loaderror("%s - %s",errMessage , file);
}
/* Locate the address of the correct init function */
c2pstr(buf);
err = FindSymbol(connID, buf, &symAddr, &class);
if ( err ) {
LoadError("Unresolved symbols - %s" , file);
rb_loaderror("Unresolved symbols - %s" , file);
}
init_fct = (void (*)())symAddr;
@ -1487,7 +1486,7 @@ dln_load(file)
#endif
#if !defined(_AIX) && !defined(NeXT)
failed:
LoadError("%s - %s", dln_strerror(), file);
rb_loaderror("%s - %s", dln_strerror(), file);
#endif
}

102
enum.c
View file

@ -12,7 +12,7 @@
#include "ruby.h"
VALUE mEnumerable;
VALUE rb_mEnumerable;
static ID id_each, id_eqq, id_cmp;
VALUE
@ -27,7 +27,7 @@ grep_i(i, arg)
VALUE i, *arg;
{
if (RTEST(rb_funcall(arg[0], id_eqq, 1, i))) {
ary_push(arg[1], i);
rb_ary_push(arg[1], i);
}
return Qnil;
}
@ -46,14 +46,14 @@ static VALUE
enum_grep(obj, pat)
VALUE obj, pat;
{
if (iterator_p()) {
if (rb_iterator_p()) {
rb_iterate(rb_each, obj, grep_iter_i, pat);
return obj;
}
else {
VALUE tmp, arg[2];
arg[0] = pat; arg[1] = tmp = ary_new();
arg[0] = pat; arg[1] = tmp = rb_ary_new();
rb_iterate(rb_each, obj, grep_i, (VALUE)arg);
return tmp;
@ -71,7 +71,7 @@ find_i(i, arg)
struct find_arg *arg;
{
if (RTEST(rb_yield(i))) {
arg->found = TRUE;
arg->found = Qtrue;
arg->val = i;
rb_iter_break();
}
@ -88,7 +88,7 @@ enum_find(argc, argv, obj)
VALUE if_none;
rb_scan_args(argc, argv, "01", &if_none);
arg.found = FALSE;
arg.found = Qfalse;
rb_iterate(rb_each, obj, find_i, (VALUE)&arg);
if (arg.found) {
return arg.val;
@ -104,7 +104,7 @@ find_all_i(i, tmp)
VALUE i, tmp;
{
if (RTEST(rb_yield(i))) {
ary_push(tmp, i);
rb_ary_push(tmp, i);
}
return Qnil;
}
@ -115,7 +115,7 @@ enum_find_all(obj)
{
VALUE tmp;
tmp = ary_new();
tmp = rb_ary_new();
rb_iterate(rb_each, obj, find_all_i, tmp);
return tmp;
@ -125,7 +125,7 @@ static VALUE
collect_i(i, tmp)
VALUE i, tmp;
{
ary_push(tmp, rb_yield(i));
rb_ary_push(tmp, rb_yield(i));
return Qnil;
}
@ -135,37 +135,17 @@ enum_collect(obj)
{
VALUE tmp;
tmp = ary_new();
tmp = rb_ary_new();
rb_iterate(rb_each, obj, collect_i, tmp);
return tmp;
}
static VALUE
reverse_i(i, tmp)
VALUE i, tmp;
{
ary_unshift(tmp, i);
return Qnil;
}
static VALUE
enum_reverse(obj)
VALUE obj;
{
VALUE tmp;
tmp = ary_new();
rb_iterate(rb_each, obj, reverse_i, tmp);
return tmp;
}
static VALUE
enum_all(i, ary)
VALUE i, ary;
{
ary_push(ary, i);
rb_ary_push(ary, i);
return Qnil;
}
@ -175,7 +155,7 @@ enum_to_a(obj)
{
VALUE ary;
ary = ary_new();
ary = rb_ary_new();
rb_iterate(rb_each, obj, enum_all, ary);
return ary;
@ -185,7 +165,7 @@ static VALUE
enum_sort(obj)
VALUE obj;
{
return ary_sort(enum_to_a(obj));
return rb_ary_sort(enum_to_a(obj));
}
static VALUE
@ -213,7 +193,7 @@ min_ii(i, min)
if (NIL_P(*min))
*min = i;
else {
cmp = rb_yield(assoc_new(i, *min));
cmp = rb_yield(rb_assoc_new(i, *min));
if (FIX2LONG(cmp) < 0)
*min = i;
}
@ -226,7 +206,7 @@ enum_min(obj)
{
VALUE min = Qnil;
rb_iterate(rb_each, obj, iterator_p()?min_ii:min_i, (VALUE)&min);
rb_iterate(rb_each, obj, rb_iterator_p()?min_ii:min_i, (VALUE)&min);
return min;
}
@ -255,7 +235,7 @@ max_ii(i, max)
if (NIL_P(*max))
*max = i;
else {
cmp = rb_yield(assoc_new(i, *max));
cmp = rb_yield(rb_assoc_new(i, *max));
if (FIX2LONG(cmp) > 0)
*max = i;
}
@ -268,7 +248,7 @@ enum_max(obj)
{
VALUE max = Qnil;
rb_iterate(rb_each, obj, iterator_p()?max_ii:max_i, (VALUE)&max);
rb_iterate(rb_each, obj, rb_iterator_p()?max_ii:max_i, (VALUE)&max);
return max;
}
@ -328,8 +308,8 @@ enum_member(obj, val)
iv.i = 0;
iv.v = val;
rb_iterate(rb_each, obj, member_i, (VALUE)&iv);
if (iv.i) return TRUE;
return FALSE;
if (iv.i) return Qtrue;
return Qfalse;
}
static VALUE
@ -341,7 +321,7 @@ length_i(i, length)
return Qnil;
}
VALUE
static VALUE
enum_length(obj)
VALUE obj;
{
@ -351,17 +331,24 @@ enum_length(obj)
return INT2FIX(length);
}
VALUE
rb_enum_length(obj)
VALUE obj;
{
return enum_length(obj);
}
static VALUE
each_with_index_i(val, indexp)
VALUE val;
int *indexp;
{
rb_yield(assoc_new(val, INT2FIX(*indexp)));
rb_yield(rb_assoc_new(val, INT2FIX(*indexp)));
(*indexp)++;
return Qnil;
}
VALUE
static VALUE
enum_each_with_index(obj)
VALUE obj;
{
@ -374,24 +361,23 @@ enum_each_with_index(obj)
void
Init_Enumerable()
{
mEnumerable = rb_define_module("Enumerable");
rb_mEnumerable = rb_define_module("Enumerable");
rb_define_method(mEnumerable,"to_a", enum_to_a, 0);
rb_define_method(rb_mEnumerable,"to_a", enum_to_a, 0);
rb_define_method(mEnumerable,"sort", enum_sort, 0);
rb_define_method(mEnumerable,"grep", enum_grep, 1);
rb_define_method(mEnumerable,"find", enum_find, -1);
rb_define_method(mEnumerable,"find_all", enum_find_all, 0);
rb_define_method(mEnumerable,"collect", enum_collect, 0);
rb_define_method(mEnumerable,"reverse", enum_reverse, 0);
rb_define_method(mEnumerable,"min", enum_min, 0);
rb_define_method(mEnumerable,"max", enum_max, 0);
rb_define_method(mEnumerable,"index", enum_index, 1);
rb_define_method(mEnumerable,"member?", enum_member, 1);
rb_define_method(mEnumerable,"include?", enum_member, 1);
rb_define_method(mEnumerable,"length", enum_length, 0);
rb_define_method(mEnumerable,"size", enum_length, 0);
rb_define_method(mEnumerable,"each_with_index", enum_each_with_index, 0);
rb_define_method(rb_mEnumerable,"sort", enum_sort, 0);
rb_define_method(rb_mEnumerable,"grep", enum_grep, 1);
rb_define_method(rb_mEnumerable,"find", enum_find, -1);
rb_define_method(rb_mEnumerable,"find_all", enum_find_all, 0);
rb_define_method(rb_mEnumerable,"collect", enum_collect, 0);
rb_define_method(rb_mEnumerable,"min", enum_min, 0);
rb_define_method(rb_mEnumerable,"max", enum_max, 0);
rb_define_method(rb_mEnumerable,"index", enum_index, 1);
rb_define_method(rb_mEnumerable,"member?", enum_member, 1);
rb_define_method(rb_mEnumerable,"include?", enum_member, 1);
rb_define_method(rb_mEnumerable,"length", enum_length, 0);
rb_define_method(rb_mEnumerable,"size", enum_length, 0);
rb_define_method(rb_mEnumerable,"each_with_index", enum_each_with_index, 0);
id_eqq = rb_intern("===");
id_each = rb_intern("each");

10
env.h
View file

@ -22,16 +22,16 @@ extern struct FRAME {
char *file;
int line;
int iter;
} *the_frame;
} *ruby_frame;
void gc_mark_frame _((struct FRAME *));
void rb_gc_mark_frame _((struct FRAME *));
extern struct SCOPE {
struct RBasic super;
ID *local_tbl;
VALUE *local_vars;
int flag;
} *the_scope;
} *ruby_scope;
#define SCOPE_ALLOCA 0
#define SCOPE_MALLOC 1
@ -39,7 +39,7 @@ extern struct SCOPE {
extern int rb_in_eval;
extern VALUE the_class;
extern VALUE ruby_class;
struct RVarmap {
struct RBasic super;
@ -47,6 +47,6 @@ struct RVarmap {
VALUE val;
struct RVarmap *next;
};
extern struct RVarmap *the_dyna_vars;
extern struct RVarmap *ruby_dyna_vars;
#endif /* ENV_H */

307
error.c
View file

@ -26,10 +26,7 @@
int sys_nerr = 256;
#endif
extern char *sourcefile;
extern int sourceline;
int nerrs;
int ruby_nerrs;
static void
err_snprintf(buf, len, fmt, args)
@ -37,11 +34,11 @@ err_snprintf(buf, len, fmt, args)
int len;
va_list args;
{
if (!sourcefile) {
if (!ruby_sourcefile) {
vsnprintf(buf, len, fmt, args);
}
else {
int n = snprintf(buf, len, "%s:%d: ", sourcefile, sourceline);
int n = snprintf(buf, len, "%s:%d: ", ruby_sourcefile, ruby_sourceline);
if (len > n) {
vsnprintf((char*)buf+n, len-n, fmt, args);
}
@ -62,9 +59,9 @@ err_print(fmt, args)
void
#ifdef HAVE_STDARG_PROTOTYPES
Error(char *fmt, ...)
rb_compile_error(char *fmt, ...)
#else
Error(fmt, va_alist)
rb_compile_error(fmt, va_alist)
char *fmt;
va_dcl
#endif
@ -74,14 +71,14 @@ Error(fmt, va_alist)
va_init_list(args, fmt);
err_print(fmt, args);
va_end(args);
nerrs++;
ruby_nerrs++;
}
void
#ifdef HAVE_STDARG_PROTOTYPES
Error_Append(char *fmt, ...)
rb_compile_error_append(char *fmt, ...)
#else
Error_Append(fmt, va_alist)
rb_compile_error_append(fmt, va_alist)
char *fmt;
va_dcl
#endif
@ -97,9 +94,9 @@ Error_Append(fmt, va_alist)
void
#ifdef HAVE_STDARG_PROTOTYPES
Warn(char *fmt, ...)
rb_warn(char *fmt, ...)
#else
Warn(fmt, va_alist)
rb_warn(fmt, va_alist)
char *fmt;
va_dcl
#endif
@ -114,12 +111,12 @@ Warn(fmt, va_alist)
va_end(args);
}
/* Warning() reports only in verbose mode */
/* rb_warning() reports only in verbose mode */
void
#ifdef HAVE_STDARG_PROTOTYPES
Warning(char *fmt, ...)
rb_warning(char *fmt, ...)
#else
Warning(fmt, va_alist)
rb_warning(fmt, va_alist)
char *fmt;
va_dcl
#endif
@ -127,7 +124,7 @@ Warning(fmt, va_alist)
char buf[BUFSIZ];
va_list args;
if (!RTEST(verbose)) return;
if (!RTEST(rb_verbose)) return;
snprintf(buf, BUFSIZ, "warning: %s", fmt);
@ -138,9 +135,9 @@ Warning(fmt, va_alist)
void
#ifdef HAVE_STDARG_PROTOTYPES
Bug(char *fmt, ...)
rb_bug(char *fmt, ...)
#else
Bug(fmt, va_alist)
rb_bug(fmt, va_alist)
char *fmt;
va_dcl
#endif
@ -205,68 +202,68 @@ rb_check_type(x, t)
etype = "Fixnum";
}
else if (rb_special_const_p(x)) {
etype = RSTRING(obj_as_string(x))->ptr;
etype = RSTRING(rb_obj_as_string(x))->ptr;
}
else {
etype = rb_class2name(CLASS_OF(x));
}
TypeError("wrong argument type %s (expected %s)",
etype, type->name);
rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)",
etype, type->name);
}
type++;
}
Bug("unknown type 0x%x", t);
rb_bug("unknown type 0x%x", t);
}
}
/* exception classes */
#include <errno.h>
VALUE eException;
VALUE eSystemExit, eInterrupt, eFatal;
VALUE eStandardError;
VALUE eRuntimeError;
VALUE eSyntaxError;
VALUE eTypeError;
VALUE eArgError;
VALUE eNameError;
VALUE eIndexError;
VALUE eLoadError;
VALUE eSecurityError;
VALUE eNotImpError;
VALUE rb_eException;
VALUE rb_eSystemExit, rb_eInterrupt, rb_eFatal;
VALUE rb_eStandardError;
VALUE rb_eRuntimeError;
VALUE rb_eSyntaxError;
VALUE rb_eTypeError;
VALUE rb_eArgError;
VALUE rb_eNameError;
VALUE rb_eIndexError;
VALUE rb_eLoadError;
VALUE rb_eSecurityError;
VALUE rb_eNotImpError;
VALUE eSystemCallError;
VALUE mErrno;
VALUE rb_eSystemCallError;
VALUE rb_mErrno;
VALUE
exc_new(etype, ptr, len)
rb_exc_new(etype, ptr, len)
VALUE etype;
char *ptr;
unsigned len;
{
VALUE exc = obj_alloc(etype);
VALUE exc = rb_obj_alloc(etype);
rb_iv_set(exc, "mesg", str_new(ptr, len));
rb_iv_set(exc, "mesg", rb_str_new(ptr, len));
return exc;
}
VALUE
exc_new2(etype, s)
rb_exc_new2(etype, s)
VALUE etype;
char *s;
{
return exc_new(etype, s, strlen(s));
return rb_exc_new(etype, s, strlen(s));
}
VALUE
exc_new3(etype, str)
rb_exc_new3(etype, str)
VALUE etype, str;
{
char *s;
int len;
s = str2cstr(str, &len);
return exc_new(etype, s, len);
return rb_exc_new(etype, s, len);
}
static VALUE
@ -278,7 +275,7 @@ exc_initialize(argc, argv, exc)
VALUE mesg;
if (rb_scan_args(argc, argv, "01", &mesg) == 0) {
mesg = str_new(0, 0);
mesg = rb_str_new(0, 0);
}
else {
STR2CSTR(mesg); /* ensure mesg can be converted to String */
@ -289,7 +286,7 @@ exc_initialize(argc, argv, exc)
}
static VALUE
exc_new_method(argc, argv, self)
exc_new(argc, argv, self)
int argc;
VALUE *argv;
VALUE self;
@ -301,8 +298,8 @@ exc_new_method(argc, argv, self)
while (FL_TEST(etype, FL_SINGLETON)) {
etype = RCLASS(etype)->super;
}
exc = obj_alloc(etype);
obj_call_init(exc);
exc = rb_obj_alloc(etype);
rb_obj_call_init(exc);
return exc;
}
@ -321,17 +318,17 @@ exc_inspect(exc)
VALUE str, klass;
klass = CLASS_OF(exc);
exc = obj_as_string(exc);
exc = rb_obj_as_string(exc);
if (RSTRING(exc)->len == 0) {
return str_dup(rb_class_path(klass));
return rb_str_dup(rb_class_path(klass));
}
str = str_new2("#<");
str = rb_str_new2("#<");
klass = rb_class_path(klass);
str_concat(str, klass);
str_cat(str, ":", 1);
str_concat(str, exc);
str_cat(str, ">", 1);
rb_str_concat(str, klass);
rb_str_cat(str, ":", 1);
rb_str_concat(str, exc);
rb_str_cat(str, ">", 1);
return str;
}
@ -353,13 +350,13 @@ check_backtrace(bt)
if (!NIL_P(bt)) {
int t = TYPE(bt);
if (t == T_STRING) return ary_new3(1, bt);
if (t == T_STRING) return rb_ary_new3(1, bt);
if (t != T_ARRAY) {
TypeError(err);
rb_raise(rb_eTypeError, err);
}
for (i=0;i<RARRAY(bt)->len;i++) {
if (TYPE(RARRAY(bt)->ptr[i]) != T_STRING) {
TypeError(err);
rb_raise(rb_eTypeError, err);
}
}
}
@ -379,34 +376,35 @@ exception(argc, argv)
VALUE *argv;
{
VALUE v = Qnil;
VALUE etype = eStandardError;
VALUE etype = rb_eStandardError;
int i;
ID id;
if (argc == 0) {
ArgError("wrong # of arguments");
rb_raise(rb_eArgError, "wrong # of arguments");
}
Warn("Exception() is now obsolete");
rb_warn("Exception() is now obsolete");
if (TYPE(argv[argc-1]) == T_CLASS) {
etype = argv[argc-1];
argc--;
if (!rb_funcall(etype, '<', 1, eException)) {
TypeError("exception should be subclass of Exception");
if (!rb_funcall(etype, '<', 1, rb_eException)) {
rb_raise(rb_eTypeError, "exception should be subclass of Exception");
}
}
for (i=0; i<argc; i++) { /* argument check */
id = rb_to_id(argv[i]);
if (!rb_id2name(id)) {
ArgError("argument needs to be symbol or string");
rb_raise(rb_eArgError, "argument needs to be symbol or string");
}
if (!rb_is_const_id(id)) {
ArgError("identifier `%s' needs to be constant", rb_id2name(id));
rb_raise(rb_eArgError, "identifier `%s' needs to be constant",
rb_id2name(id));
}
}
for (i=0; i<argc; i++) {
v = rb_define_class_under(the_class,
v = rb_define_class_under(ruby_class,
rb_id2name(rb_to_id(argv[i])),
eStandardError);
rb_eStandardError);
}
return v;
}
@ -479,7 +477,7 @@ set_syserr(i, name)
VALUE *list;
int ix, offset;
#endif
VALUE error = rb_define_class_under(mErrno, name, eSystemCallError);
VALUE error = rb_define_class_under(rb_mErrno, name, rb_eSystemCallError);
rb_define_const(error, "Errno", INT2FIX(i));
#ifdef __BEOS__
i -= B_GENERAL_ERROR_BASE;
@ -534,144 +532,87 @@ static void init_syserr _((void));
void
Init_Exception()
{
eException = rb_define_class("Exception", cObject);
rb_define_method(eException, "new", exc_new_method, -1);
rb_define_method(eException, "initialize", exc_initialize, -1);
rb_define_method(eException, "to_s", exc_to_s, 0);
rb_define_method(eException, "to_str", exc_to_s, 0);
rb_define_method(eException, "message", exc_to_s, 0);
rb_define_method(eException, "inspect", exc_inspect, 0);
rb_define_method(eException, "backtrace", exc_backtrace, 0);
rb_define_method(eException, "set_backtrace", exc_set_backtrace, 1);
rb_eException = rb_define_class("Exception", rb_cObject);
rb_define_method(rb_eException, "new", exc_new, -1);
rb_define_method(rb_eException, "initialize", exc_initialize, -1);
rb_define_method(rb_eException, "to_s", exc_to_s, 0);
rb_define_method(rb_eException, "to_str", exc_to_s, 0);
rb_define_method(rb_eException, "message", exc_to_s, 0);
rb_define_method(rb_eException, "inspect", exc_inspect, 0);
rb_define_method(rb_eException, "backtrace", exc_backtrace, 0);
rb_define_method(rb_eException, "set_backtrace", exc_set_backtrace, 1);
eSystemExit = rb_define_class("SystemExit", eException);
eFatal = rb_define_class("fatal", eException);
eInterrupt = rb_define_class("Interrupt", eException);
rb_eSystemExit = rb_define_class("SystemExit", rb_eException);
rb_eFatal = rb_define_class("fatal", rb_eException);
rb_eInterrupt = rb_define_class("Interrupt", rb_eException);
eStandardError = rb_define_class("StandardError", eException);
eSyntaxError = rb_define_class("SyntaxError", eStandardError);
eTypeError = rb_define_class("TypeError", eStandardError);
eArgError = rb_define_class("ArgumentError", eStandardError);
eNameError = rb_define_class("NameError", eStandardError);
eIndexError = rb_define_class("IndexError", eStandardError);
eLoadError = rb_define_class("LoadError", eStandardError);
rb_eStandardError = rb_define_class("StandardError", rb_eException);
rb_eSyntaxError = rb_define_class("SyntaxError", rb_eStandardError);
rb_eTypeError = rb_define_class("TypeError", rb_eStandardError);
rb_eArgError = rb_define_class("ArgumentError", rb_eStandardError);
rb_eNameError = rb_define_class("NameError", rb_eStandardError);
rb_eIndexError = rb_define_class("IndexError", rb_eStandardError);
rb_eLoadError = rb_define_class("LoadError", rb_eStandardError);
eRuntimeError = rb_define_class("RuntimeError", eStandardError);
eSecurityError = rb_define_class("SecurityError", eStandardError);
eNotImpError = rb_define_class("NotImplementError", eException);
rb_eRuntimeError = rb_define_class("RuntimeError", rb_eStandardError);
rb_eSecurityError = rb_define_class("SecurityError", rb_eStandardError);
rb_eNotImpError = rb_define_class("NotImplementError", rb_eException);
init_syserr();
rb_define_global_function("Exception", exception, -1);
}
#define RAISE_ERROR(klass,fmt) {\
va_list args;\
char buf[BUFSIZ];\
va_init_list(args,fmt);\
vsnprintf(buf, BUFSIZ, fmt, args);\
va_end(args);\
rb_raise(exc_new2(klass, buf));\
}
void
#ifdef HAVE_STDARG_PROTOTYPES
Raise(VALUE exc, char *fmt, ...)
rb_raise(VALUE exc, char *fmt, ...)
#else
Raise(exc, fmt, va_alist)
rb_raise(exc, fmt, va_alist)
VALUE exc;
char *fmt;
va_dcl
#endif
{
RAISE_ERROR(exc, fmt);
va_list args;
char buf[BUFSIZ];
va_init_list(args,fmt);
vsnprintf(buf, BUFSIZ, fmt, args);
va_end(args);
rb_exc_raise(rb_exc_new2(exc, buf));
}
void
#ifdef HAVE_STDARG_PROTOTYPES
TypeError(char *fmt, ...)
rb_loaderror(char *fmt, ...)
#else
TypeError(fmt, va_alist)
rb_loaderror(fmt, va_alist)
char *fmt;
va_dcl
#endif
{
RAISE_ERROR(eTypeError, fmt);
}
va_list args;
char buf[BUFSIZ];
void
#ifdef HAVE_STDARG_PROTOTYPES
ArgError(char *fmt, ...)
#else
ArgError(fmt, va_alist)
char *fmt;
va_dcl
#endif
{
RAISE_ERROR(eArgError, fmt);
}
void
#ifdef HAVE_STDARG_PROTOTYPES
NameError(char *fmt, ...)
#else
NameError(fmt, va_alist)
char *fmt;
va_dcl
#endif
{
RAISE_ERROR(eNameError, fmt);
}
void
#ifdef HAVE_STDARG_PROTOTYPES
IndexError(char *fmt, ...)
#else
IndexError(fmt, va_alist)
char *fmt;
va_dcl
#endif
{
RAISE_ERROR(eIndexError, fmt);
}
void
#ifdef HAVE_STDARG_PROTOTYPES
Fail(char *fmt, ...)
#else
Fail(fmt, va_alist)
char *fmt;
va_dcl
#endif
{
RAISE_ERROR(eRuntimeError, fmt);
va_init_list(args, fmt);
vsnprintf(buf, BUFSIZ, fmt, args);
va_end(args);
rb_exc_raise(rb_exc_new2(rb_eLoadError, buf));
}
void
rb_notimplement()
{
Raise(eNotImpError,
"The %s() function is unimplemented on this machine",
rb_id2name(the_frame->last_func));
rb_raise(rb_eNotImpError,
"The %s() function is unimplemented on this machine",
rb_id2name(ruby_frame->last_func));
}
void
#ifdef HAVE_STDARG_PROTOTYPES
LoadError(char *fmt, ...)
rb_fatal(char *fmt, ...)
#else
LoadError(fmt, va_alist)
char *fmt;
va_dcl
#endif
{
RAISE_ERROR(eLoadError, fmt);
}
void
#ifdef HAVE_STDARG_PROTOTYPES
Fatal(char *fmt, ...)
#else
Fatal(fmt, va_alist)
rb_fatal(fmt, va_alist)
char *fmt;
va_dcl
#endif
@ -684,7 +625,7 @@ Fatal(fmt, va_alist)
va_end(args);
rb_in_eval = 0;
rb_fatal(exc_new2(eFatal, buf));
rb_exc_fatal(rb_exc_new2(rb_eFatal, buf));
}
void
@ -702,7 +643,7 @@ rb_sys_fail(mesg)
err = strerror(errno);
if (mesg) {
buf = ALLOCA_N(char, strlen(err)+strlen(mesg)+1);
buf = ALLOCA_N(char, strlen(err)+strlen(mesg)+4);
sprintf(buf, "%s - %s", err, mesg);
}
else {
@ -740,10 +681,10 @@ rb_sys_fail(mesg)
else {
ee = syserr_list[n];
}
ee = exc_new2(ee, buf);
ee = rb_exc_new2(ee, buf);
#endif
rb_iv_set(ee, "errno", INT2FIX(n));
rb_raise(ee);
rb_exc_raise(ee);
}
static void
@ -752,10 +693,10 @@ init_syserr()
#ifdef __BEOS__
int i, ix, offset;
#endif
eSystemCallError = rb_define_class("SystemCallError", eStandardError);
rb_define_method(eSystemCallError, "errno", syserr_errno, 0);
rb_eSystemCallError = rb_define_class("SystemCallError", rb_eStandardError);
rb_define_method(rb_eSystemCallError, "errno", syserr_errno, 0);
mErrno = rb_define_module("Errno");
rb_mErrno = rb_define_module("Errno");
#ifdef __BEOS__
for (i = 0; syserr_index[i].n != 0; i++) {
ix = syserr_index[i].ix;
@ -1140,18 +1081,18 @@ static void
err_append(s)
char *s;
{
extern VALUE errinfo;
extern VALUE rb_errinfo;
if (rb_in_eval) {
if (NIL_P(errinfo)) {
errinfo = exc_new2(eSyntaxError, s);
if (NIL_P(rb_errinfo)) {
rb_errinfo = rb_exc_new2(rb_eSyntaxError, s);
}
else {
VALUE str = str_to_str(errinfo);
VALUE str = rb_str_to_str(rb_errinfo);
str_cat(str, "\n", 1);
str_cat(str, s, strlen(s));
errinfo = exc_new3(eSyntaxError, str);
rb_str_cat(str, "\n", 1);
rb_str_cat(str, s, strlen(s));
rb_errinfo = rb_exc_new3(rb_eSyntaxError, str);
}
}
else {

2527
eval.c

File diff suppressed because it is too large Load diff

View file

@ -41,7 +41,7 @@ struct windata {
static void
no_window()
{
Fail("already closed window");
rb_raise(rb_eRuntimeError, "already closed window");
}
#define GetWINDOW(obj, winp) {\
@ -69,7 +69,7 @@ prep_window(class, window)
struct windata *winp;
if (window == NULL) {
Fail("failed to create window");
rb_raise(rb_eRuntimeError, "failed to create window");
}
obj = Data_Make_Struct(class, struct windata, 0, free_window, winp);
@ -86,7 +86,7 @@ curses_init_screen()
{
initscr();
if (stdscr == 0) {
Fail("cannot initialize curses");
rb_raise(rb_eRuntimeError, "cannot initialize curses");
}
clear();
rb_stdscr = prep_window(cWindow, stdscr);
@ -129,9 +129,9 @@ curses_closed()
{
#ifdef HAVE_ISENDWIN
if (isendwin()) {
return TRUE;
return Qtrue;
}
return FALSE;
return Qfalse;
#else
rb_notimplement();
#endif
@ -354,7 +354,7 @@ curses_getstr(obj)
{
char rtn[1024]; /* This should be big enough.. I hope */
getstr(rtn);
return str_taint(str_new2(rtn));
return rb_str_taint(rb_str_new2(rtn));
}
/* def delch */
@ -404,7 +404,7 @@ window_s_new(class, lines, cols, top, left)
window = newwin(NUM2INT(lines), NUM2INT(cols), NUM2INT(top), NUM2INT(left));
wclear(window);
w = prep_window(class, window);
obj_call_init(w);
rb_obj_call_init(w);
return w;
}
@ -723,7 +723,7 @@ window_getstr(obj)
GetWINDOW(obj, winp);
wgetstr(winp->window, rtn);
return str_taint(str_new2(rtn));
return rb_str_taint(rb_str_new2(rtn));
}
/* def delch */
@ -789,7 +789,7 @@ Init_curses()
rb_define_module_function(mCurses, "lines", curses_lines, 0);
rb_define_module_function(mCurses, "cols", curses_cols, 0);
cWindow = rb_define_class_under(mCurses, "Window", cObject);
cWindow = rb_define_class_under(mCurses, "Window", rb_cObject);
rb_define_singleton_method(cWindow, "new", window_s_new, 4);
rb_define_method(cWindow, "subwin", window_subwin, 4);
rb_define_method(cWindow, "close", window_close, 0);

View file

@ -21,7 +21,7 @@
VALUE cDBM;
extern VALUE mEnumerable;
extern VALUE rb_mEnumerable;
struct dbmdata {
int di_size;
@ -31,7 +31,7 @@ struct dbmdata {
static void
closed_dbm()
{
Fail("closed DBM file");
rb_raise(rb_eRuntimeError, "closed DBM file");
}
#define GetDBM(obj, dbmp) {\
@ -86,7 +86,7 @@ fdbm_s_open(argc, argv, class)
obj = Data_Make_Struct(class,struct dbmdata,0,free_dbm,dbmp);
dbmp->di_dbm = dbm;
dbmp->di_size = -1;
obj_call_init(obj);
rb_obj_call_init(obj);
return obj;
}
@ -123,7 +123,7 @@ fdbm_fetch(obj, keystr)
if (value.dptr == 0) {
return Qnil;
}
return str_taint(str_new(value.dptr, value.dsize));
return rb_str_taint(rb_str_new(value.dptr, value.dsize));
}
static VALUE
@ -135,9 +135,9 @@ fdbm_indexes(argc, argv, obj)
VALUE new;
int i;
new = ary_new2(argc);
new = rb_ary_new2(argc);
for (i=0; i<argc; i++) {
ary_push(new, fdbm_fetch(obj, argv[i]));
rb_ary_push(new, fdbm_fetch(obj, argv[i]));
}
return new;
@ -161,13 +161,13 @@ fdbm_delete(obj, keystr)
value = dbm_fetch(dbm, key);
if (value.dptr == 0) {
if (iterator_p()) rb_yield(keystr);
if (rb_iterator_p()) rb_yield(keystr);
return Qnil;
}
if (dbm_delete(dbm, key)) {
dbmp->di_size = -1;
Fail("dbm_delete failed");
rb_raise(rb_eRuntimeError, "dbm_delete failed");
}
else if (dbmp->di_size >= 0) {
dbmp->di_size--;
@ -193,9 +193,9 @@ fdbm_shift(obj)
val = dbm_fetch(dbm, key);
dbm_delete(dbm, key);
keystr = str_taint(str_new(key.dptr, key.dsize));
valstr = str_taint(str_new(val.dptr, val.dsize));
return assoc_new(keystr, valstr);
keystr = rb_str_taint(rb_str_new(key.dptr, key.dsize));
valstr = rb_str_taint(rb_str_new(val.dptr, val.dsize));
return rb_assoc_new(keystr, valstr);
}
static VALUE
@ -212,11 +212,11 @@ fdbm_delete_if(obj)
dbm = dbmp->di_dbm;
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
keystr = str_taint(str_new(key.dptr, key.dsize));
valstr = str_taint(str_new(val.dptr, val.dsize));
if (RTEST(rb_yield(assoc_new(keystr, valstr)))) {
keystr = rb_str_taint(rb_str_new(key.dptr, key.dsize));
valstr = rb_str_taint(rb_str_new(val.dptr, val.dsize));
if (RTEST(rb_yield(rb_assoc_new(keystr, valstr)))) {
if (dbm_delete(dbm, key)) {
Fail("dbm_delete failed");
rb_raise(rb_eRuntimeError, "dbm_delete failed");
}
}
}
@ -237,7 +237,7 @@ fdbm_clear(obj)
dbmp->di_size = -1;
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
if (dbm_delete(dbm, key)) {
Fail("dbm_delete failed");
rb_raise(rb_eRuntimeError, "dbm_delete failed");
}
}
return obj;
@ -251,15 +251,15 @@ fdbm_invert(obj)
struct dbmdata *dbmp;
DBM *dbm;
VALUE keystr, valstr;
VALUE hash = hash_new();
VALUE hash = rb_hash_new();
GetDBM(obj, dbmp);
dbm = dbmp->di_dbm;
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
keystr = str_taint(str_new(key.dptr, key.dsize));
valstr = str_taint(str_new(val.dptr, val.dsize));
hash_aset(hash, valstr, keystr);
keystr = rb_str_taint(rb_str_new(key.dptr, key.dsize));
valstr = rb_str_taint(rb_str_new(val.dptr, val.dsize));
rb_hash_aset(hash, valstr, keystr);
}
return obj;
}
@ -279,7 +279,7 @@ update_i(pair, dbm)
{
Check_Type(pair, T_ARRAY);
if (RARRAY(pair)->len < 2) {
ArgError("pair must be [key, value]");
rb_raise(rb_eArgError, "pair must be [key, value]");
}
fdbm_store(dbm, RARRAY(pair)->ptr[0], RARRAY(pair)->ptr[1]);
return Qnil;
@ -316,14 +316,14 @@ fdbm_store(obj, keystr, valstr)
}
rb_secure(4);
keystr = obj_as_string(keystr);
keystr = rb_obj_as_string(keystr);
key.dptr = RSTRING(keystr)->ptr;
key.dsize = RSTRING(keystr)->len;
if (NIL_P(valstr)) return fdbm_delete(obj, keystr);
valstr = obj_as_string(valstr);
valstr = rb_obj_as_string(valstr);
val.dptr = RSTRING(valstr)->ptr;
val.dsize = RSTRING(valstr)->len;
@ -335,7 +335,7 @@ fdbm_store(obj, keystr, valstr)
dbm_clearerr(dbm);
#endif
if (errno == EPERM) rb_sys_fail(0);
Fail("dbm_store failed");
rb_raise(rb_eRuntimeError, "dbm_store failed");
}
return valstr;
@ -382,8 +382,8 @@ fdbm_empty_p(obj)
else {
i = dbmp->di_size;
}
if (i == 0) return TRUE;
return FALSE;
if (i == 0) return Qtrue;
return Qfalse;
}
static VALUE
@ -398,7 +398,7 @@ fdbm_each_value(obj)
dbm = dbmp->di_dbm;
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
rb_yield(str_taint(str_new(val.dptr, val.dsize)));
rb_yield(rb_str_taint(rb_str_new(val.dptr, val.dsize)));
}
return obj;
}
@ -414,7 +414,7 @@ fdbm_each_key(obj)
GetDBM(obj, dbmp);
dbm = dbmp->di_dbm;
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
rb_yield(str_taint(str_new(key.dptr, key.dsize)));
rb_yield(rb_str_taint(rb_str_new(key.dptr, key.dsize)));
}
return obj;
}
@ -433,9 +433,9 @@ fdbm_each_pair(obj)
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
keystr = str_taint(str_new(key.dptr, key.dsize));
valstr = str_taint(str_new(val.dptr, val.dsize));
rb_yield(assoc_new(keystr, valstr));
keystr = rb_str_taint(rb_str_new(key.dptr, key.dsize));
valstr = rb_str_taint(rb_str_new(val.dptr, val.dsize));
rb_yield(rb_assoc_new(keystr, valstr));
}
return obj;
@ -453,9 +453,9 @@ fdbm_keys(obj)
GetDBM(obj, dbmp);
dbm = dbmp->di_dbm;
ary = ary_new();
ary = rb_ary_new();
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
ary_push(ary, str_taint(str_new(key.dptr, key.dsize)));
rb_ary_push(ary, rb_str_taint(rb_str_new(key.dptr, key.dsize)));
}
return ary;
@ -473,10 +473,10 @@ fdbm_values(obj)
GetDBM(obj, dbmp);
dbm = dbmp->di_dbm;
ary = ary_new();
ary = rb_ary_new();
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
ary_push(ary, str_taint(str_new(val.dptr, val.dsize)));
rb_ary_push(ary, rb_str_taint(rb_str_new(val.dptr, val.dsize)));
}
return ary;
@ -497,8 +497,8 @@ fdbm_has_key(obj, keystr)
GetDBM(obj, dbmp);
dbm = dbmp->di_dbm;
val = dbm_fetch(dbm, key);
if (val.dptr) return TRUE;
return FALSE;
if (val.dptr) return Qtrue;
return Qfalse;
}
static VALUE
@ -519,9 +519,9 @@ fdbm_has_value(obj, valstr)
val = dbm_fetch(dbm, key);
if (val.dsize == RSTRING(valstr)->len &&
memcmp(val.dptr, RSTRING(valstr)->ptr, val.dsize) == 0)
return TRUE;
return Qtrue;
}
return FALSE;
return Qfalse;
}
static VALUE
@ -536,11 +536,11 @@ fdbm_to_a(obj)
GetDBM(obj, dbmp);
dbm = dbmp->di_dbm;
ary = ary_new();
ary = rb_ary_new();
for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
val = dbm_fetch(dbm, key);
ary_push(ary, assoc_new(str_taint(str_new(key.dptr, key.dsize)),
str_taint(str_new(val.dptr, val.dsize))));
rb_ary_push(ary, rb_assoc_new(rb_str_taint(rb_str_new(key.dptr, key.dsize)),
rb_str_taint(rb_str_new(val.dptr, val.dsize))));
}
return ary;
@ -548,8 +548,8 @@ fdbm_to_a(obj)
Init_dbm()
{
cDBM = rb_define_class("DBM", cObject);
rb_include_module(cDBM, mEnumerable);
cDBM = rb_define_class("DBM", rb_cObject);
rb_include_module(cDBM, rb_mEnumerable);
rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1);
rb_define_singleton_method(cDBM, "new", fdbm_s_open, -1);

View file

@ -37,7 +37,7 @@ etc_getlogin(obj)
#endif
if (login)
return str_new2(login);
return rb_str_new2(login);
return Qnil;
}
@ -47,36 +47,36 @@ setup_passwd(pwd)
struct passwd *pwd;
{
if (pwd == 0) rb_sys_fail("/etc/passwd");
return struct_new(sPasswd,
str_new2(pwd->pw_name),
str_new2(pwd->pw_passwd),
INT2FIX(pwd->pw_uid),
INT2FIX(pwd->pw_gid),
return rb_struct_new(sPasswd,
rb_str_new2(pwd->pw_name),
rb_str_new2(pwd->pw_passwd),
INT2FIX(pwd->pw_uid),
INT2FIX(pwd->pw_gid),
#ifdef PW_GECOS
str_new2(pwd->pw_gecos),
rb_str_new2(pwd->pw_gecos),
#endif
str_new2(pwd->pw_dir),
str_new2(pwd->pw_shell),
rb_str_new2(pwd->pw_dir),
rb_str_new2(pwd->pw_shell),
#ifdef PW_CHANGE
INT2FIX(pwd->pw_change),
INT2FIX(pwd->pw_change),
#endif
#ifdef PW_QUOTA
INT2FIX(pwd->pw_quota),
INT2FIX(pwd->pw_quota),
#endif
#ifdef PW_AGE
INT2FIX(pwd->pw_age),
INT2FIX(pwd->pw_age),
#endif
#ifdef PW_CLASS
str_new2(pwd->pw_class),
rb_str_new2(pwd->pw_class),
#endif
#ifdef PW_COMMENT
str_new2(pwd->pw_comment),
rb_str_new2(pwd->pw_comment),
#endif
#ifdef PW_EXPIRE
INT2FIX(pwd->pw_expire),
INT2FIX(pwd->pw_expire),
#endif
0 /*dummy*/
);
0 /*dummy*/
);
}
#endif
@ -98,7 +98,7 @@ etc_getpwuid(argc, argv, obj)
uid = getuid();
}
pwd = getpwuid(uid);
if (pwd == 0) Fail("can't find user for %d", uid);
if (pwd == 0) rb_raise(rb_eArgError, "can't find user for %d", uid);
return setup_passwd(pwd);
#else
return Qnil;
@ -114,7 +114,7 @@ etc_getpwnam(obj, nam)
Check_Type(nam, T_STRING);
pwd = getpwnam(RSTRING(nam)->ptr);
if (pwd == 0) Fail("can't find user for %s", RSTRING(nam)->ptr);
if (pwd == 0) rb_raise(rb_eArgError, "can't find user for %s", RSTRING(nam)->ptr);
return setup_passwd(pwd);
#else
return Qnil;
@ -128,7 +128,7 @@ etc_passwd(obj)
#if defined(HAVE_GETPWENT)
struct passwd *pw;
if (iterator_p()) {
if (rb_iterator_p()) {
setpwent();
while (pw = getpwent()) {
rb_yield(setup_passwd(pw));
@ -137,7 +137,7 @@ etc_passwd(obj)
return obj;
}
pw = getpwent();
if (pw == 0) Fail("can't fetch next -- /etc/passwd");
if (pw == 0) rb_raise(rb_eRuntimeError, "can't fetch next -- /etc/passwd");
return setup_passwd(pw);
#else
return Qnil;
@ -152,17 +152,17 @@ setup_group(grp)
VALUE mem;
char **tbl;
mem = ary_new();
mem = rb_ary_new();
tbl = grp->gr_mem;
while (*tbl) {
ary_push(mem, str_new2(*tbl));
rb_ary_push(mem, rb_str_new2(*tbl));
tbl++;
}
return struct_new(sGroup,
str_new2(grp->gr_name),
str_new2(grp->gr_passwd),
INT2FIX(grp->gr_gid),
mem);
return rb_struct_new(sGroup,
rb_str_new2(grp->gr_name),
rb_str_new2(grp->gr_passwd),
INT2FIX(grp->gr_gid),
mem);
}
#endif
@ -176,7 +176,7 @@ etc_getgrgid(obj, id)
gid = NUM2INT(id);
grp = getgrgid(gid);
if (grp == 0) Fail("can't find group for %d", gid);
if (grp == 0) rb_raise(rb_eArgError, "can't find group for %d", gid);
return setup_group(grp);
#else
return Qnil;
@ -192,7 +192,7 @@ etc_getgrnam(obj, nam)
Check_Type(nam, T_STRING);
grp = getgrnam(RSTRING(nam)->ptr);
if (grp == 0) Fail("can't find group for %s", RSTRING(nam)->ptr);
if (grp == 0) rb_raise(rb_eArgError, "can't find group for %s", RSTRING(nam)->ptr);
return setup_group(grp);
#else
return Qnil;
@ -206,7 +206,7 @@ etc_group(obj)
#ifdef HAVE_GETGRENT
struct group *grp;
if (iterator_p()) {
if (rb_iterator_p()) {
setgrent();
while (grp = getgrent()) {
rb_yield(setup_group(grp));
@ -237,32 +237,32 @@ Init_etc()
rb_define_module_function(mEtc, "getgrnam", etc_getgrnam, 1);
rb_define_module_function(mEtc, "group", etc_group, 0);
sPasswd = struct_define("Passwd",
"name", "passwd", "uid", "gid",
"gecos", "dir", "shell",
sPasswd = rb_struct_define("Passwd",
"name", "passwd", "uid", "gid",
"gecos", "dir", "shell",
#ifdef PW_CHANGE
"change",
"change",
#endif
#ifdef PW_QUOTA
"quota",
"quota",
#endif
#ifdef PW_AGE
"age",
"age",
#endif
#ifdef PW_CLASS
"class",
"class",
#endif
#ifdef PW_COMMENT
"comment",
"comment",
#endif
#ifdef PW_EXPIRE
"expire",
"expire",
#endif
0);
0);
rb_global_variable(&sPasswd);
#ifdef HAVE_GETGRENT
sGroup = struct_define("Group", "name", "passwd", "gid", "mem", 0);
sGroup = rb_struct_define("Group", "name", "passwd", "gid", "mem", 0);
rb_global_variable(&sGroup);
#endif
}

File diff suppressed because it is too large Load diff

View file

@ -1833,7 +1833,7 @@ kconv_kconv(argc, argv)
if (in_code == _NOCONV) return (VALUE)src;
}
dst = str_new(0, RSTRING(src)->len*3+10); /* large enough? */
dst = rb_str_new(0, RSTRING(src)->len*3+10); /* large enough? */
RSTRING(dst)->len = do_kconv(RSTRING(src)->ptr, RSTRING(dst)->ptr, RSTRING(dst)->len, out_code, in_code);
return dst;
@ -1847,7 +1847,7 @@ kconv_tojis(obj, src)
Check_Type(src, T_STRING);
dst = str_new(0, RSTRING(src)->len*3+10); /* large enough? */
dst = rb_str_new(0, RSTRING(src)->len*3+10); /* large enough? */
RSTRING(dst)->len = do_kconv(RSTRING(src)->ptr, RSTRING(dst)->ptr, RSTRING(dst)->len, _JIS, _AUTO);
return dst;
@ -1861,7 +1861,7 @@ kconv_toeuc(obj, src)
Check_Type(src, T_STRING);
dst = str_new(0, RSTRING(src)->len*3+10); /* large enough? */
dst = rb_str_new(0, RSTRING(src)->len*3+10); /* large enough? */
RSTRING(dst)->len = do_kconv(RSTRING(src)->ptr, RSTRING(dst)->ptr, RSTRING(dst)->len, _EUC, _AUTO);
return (VALUE)dst;
@ -1875,7 +1875,7 @@ kconv_tosjis(obj, src)
Check_Type(src, T_STRING);
dst = str_new(0, RSTRING(src)->len*3+10); /* large enough? */
dst = rb_str_new(0, RSTRING(src)->len*3+10); /* large enough? */
RSTRING(dst)->len = do_kconv(RSTRING(src)->ptr, RSTRING(dst)->ptr, RSTRING(dst)->len, _SJIS, _AUTO);
return dst;

View file

@ -42,7 +42,7 @@ md5_digest(obj)
ctx = *md5;
MD5Final(digest, &ctx);
return str_new(digest, 16);
return rb_str_new(digest, 16);
}
static VALUE
@ -77,14 +77,14 @@ md5_new(argc, argv, class)
if (!NIL_P(arg)) {
md5_update(obj, arg);
}
obj_call_init(obj);
rb_obj_call_init(obj);
return obj;
}
Init_md5()
{
cMD5 = rb_define_class("MD5", cObject);
cMD5 = rb_define_class("MD5", rb_cObject);
rb_define_singleton_method(cMD5, "new", md5_new, -1);

View file

@ -17,6 +17,7 @@ else
end
have_header("sys/un.h")
if have_func(test_func)
have_func("inet_aton")
have_func("hsterror")
unless have_func("gethostname")
have_func("uname")

File diff suppressed because it is too large Load diff

View file

@ -16,10 +16,10 @@
# include <Quickdraw.h>
#endif
/* for debug */
/* for rb_debug */
#define DUMP1(ARG1) if (debug) { fprintf(stderr, "tcltklib: %s\n", ARG1);}
#define DUMP2(ARG1, ARG2) if (debug) { fprintf(stderr, "tcltklib: ");\
#define DUMP1(ARG1) if (rb_debug) { fprintf(stderr, "tcltklib: %s\n", ARG1);}
#define DUMP2(ARG1, ARG2) if (rb_debug) { fprintf(stderr, "tcltklib: ");\
fprintf(stderr, ARG1, ARG2); fprintf(stderr, "\n"); }
/*
#define DUMP1(ARG1)
@ -56,7 +56,7 @@ void _timer_for_tcl (ClientData clientData)
timer->flag = 0;
CHECK_INTS;
#ifdef THREAD
if (!thread_critical) thread_schedule();
if (!rb_thread_critical) rb_thread_schedule();
#endif
timer->token = Tk_CreateTimerHandler(200, _timer_for_tcl,
@ -121,7 +121,7 @@ ip_ruby(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
/* ruby command has 1 arg. */
if (argc != 2) {
ArgError("wrong # of arguments (%d for 1)", argc);
rb_raise(rb_eArgError, "wrong # of arguments (%d for 1)", argc);
}
/* get C string from Tcl object */
@ -133,10 +133,10 @@ ip_ruby(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
/* evaluate the argument string by ruby */
DUMP2("rb_eval_string(%s)", arg);
old_trapflg = trap_immediate;
trap_immediate = 0;
old_trapflg = rb_trap_immediate;
rb_trap_immediate = 0;
res = rb_rescue(rb_eval_string, (VALUE)arg, ip_eval_rescue, (VALUE)&failed);
trap_immediate = old_trapflg;
rb_trap_immediate = old_trapflg;
Tcl_ResetResult(interp);
if (failed) {
@ -192,11 +192,11 @@ ip_new(VALUE self)
/* from Tcl_AppInit() */
DUMP1("Tcl_Init");
if (Tcl_Init(ptr->ip) == TCL_ERROR) {
Fail("Tcl_Init");
rb_raise(rb_eRuntimeError, "Tcl_Init");
}
DUMP1("Tk_Init");
if (Tk_Init(ptr->ip) == TCL_ERROR) {
Fail("Tk_Init");
rb_raise(rb_eRuntimeError, "Tk_Init");
}
DUMP1("Tcl_StaticPackage(\"Tk\")");
Tcl_StaticPackage(ptr->ip, "Tk", Tk_Init,
@ -234,12 +234,12 @@ ip_eval(VALUE self, VALUE str)
DUMP2("Tcl_Eval(%s)", buf);
ptr->return_value = Tcl_Eval(ptr->ip, buf);
if (ptr->return_value == TCL_ERROR) {
Fail(ptr->ip->result);
rb_raise(rb_eRuntimeError, ptr->ip->result);
}
DUMP2("(TCL_Eval result) %d", ptr->return_value);
/* pass back the result (as string) */
return(str_new2(ptr->ip->result));
return(rb_str_new2(ptr->ip->result));
}
@ -271,7 +271,7 @@ ip_toUTF8(VALUE self, VALUE str, VALUE encodename)
Tcl_FreeEncoding(encoding);
Tcl_DStringFree(&dstr);
return str_new2(buff2);
return rb_str_new2(buff2);
#endif
}
@ -303,7 +303,7 @@ ip_fromUTF8(VALUE self, VALUE str, VALUE encodename)
Tcl_FreeEncoding(encoding);
Tcl_DStringFree(&dstr);
return str_new2(buff2);
return rb_str_new2(buff2);
#endif
}
@ -330,7 +330,7 @@ ip_invoke(int argc, VALUE *argv, VALUE obj)
/* map from the command name to a C procedure */
if (!Tcl_GetCommandInfo(ptr->ip, cmd, &info)) {
NameError("invalid command name `%s'", cmd);
rb_raise(rb_eNameError, "invalid command name `%s'", cmd);
}
#if TCL_MAJOR_VERSION >= 8
object = info.isNativeObjectProc;
@ -379,11 +379,11 @@ ip_invoke(int argc, VALUE *argv, VALUE obj)
}
if (ptr->return_value == TCL_ERROR) {
Fail(ptr->ip->result);
rb_raise(rb_eRuntimeError, ptr->ip->result);
}
/* pass back the result (as string) */
return(str_new2(ptr->ip->result));
return(rb_str_new2(ptr->ip->result));
}
/* get return code from Tcl_Eval() */
@ -413,10 +413,10 @@ void Init_tcltklib()
extern VALUE rb_argv0; /* the argv[0] */
VALUE lib = rb_define_module("TclTkLib");
VALUE ip = rb_define_class("TclTkIp", cObject);
VALUE ip = rb_define_class("TclTkIp", rb_cObject);
eTkCallbackBreak = rb_define_class("TkCallbackBreak", eStandardError);
eTkCallbackContinue = rb_define_class("TkCallbackContinue",eStandardError);
eTkCallbackBreak = rb_define_class("TkCallbackBreak", rb_eStandardError);
eTkCallbackContinue = rb_define_class("TkCallbackContinue",rb_eStandardError);
rb_define_module_function(lib, "mainloop", lib_mainloop, 0);

View file

@ -22,24 +22,8 @@ tk_eval_cmd(argc, argv)
}
static VALUE
tk_s_new(argc, argv, class)
int argc;
VALUE *argv;
VALUE class;
{
VALUE obj = obj_alloc(class);
rb_funcall2(obj, rb_intern("initialize"), argc, argv);
if (iterator_p()) rb_yield_0(obj, obj);
return obj;
}
Init_tkutil()
{
VALUE mTK = rb_define_module("TkUtil");
VALUE cTK = rb_define_class("TkKernel", cObject);
rb_define_singleton_method(mTK, "eval_cmd", tk_eval_cmd, -1);
rb_define_singleton_method(cTK, "new", tk_s_new, -1);
}

500
file.c

File diff suppressed because it is too large Load diff

212
gc.c
View file

@ -20,7 +20,7 @@
#include <setjmp.h>
void re_free_registers _((struct re_registers*));
void io_fptr_finalize _((struct OpenFile*));
void rb_io_fptr_finalize _((struct OpenFile*));
#ifndef setjmp
#ifdef HAVE__SETJMP
@ -54,19 +54,19 @@ xmalloc(size)
void *mem;
if (size < 0) {
ArgError("negative allocation size (or too big)");
rb_raise(rb_eArgError, "negative allocation size (or too big)");
}
if (size == 0) size = 1;
malloc_memories += size;
if (malloc_memories > GC_MALLOC_LIMIT && alloc_objects > GC_NEWOBJ_LIMIT) {
gc_gc();
rb_gc();
}
mem = malloc(size);
if (!mem) {
gc_gc();
rb_gc();
mem = malloc(size);
if (!mem)
Fatal("failed to allocate memory");
rb_fatal("failed to allocate memory");
}
return mem;
@ -92,16 +92,16 @@ xrealloc(ptr, size)
void *mem;
if (size < 0) {
ArgError("negative re-allocation size");
rb_raise(rb_eArgError, "negative re-allocation size");
}
if (!ptr) return xmalloc(size);
malloc_memories += size;
mem = realloc(ptr, size);
if (!mem) {
gc_gc();
rb_gc();
mem = realloc(ptr, size);
if (!mem)
Fatal("failed to allocate memory(realloc)");
rb_fatal("failed to allocate memory(realloc)");
}
return mem;
@ -140,25 +140,25 @@ Cambridge, MA 02138
extern int rb_in_compile;
static int dont_gc;
VALUE
gc_s_enable()
static VALUE
gc_enable()
{
int old = dont_gc;
dont_gc = FALSE;
dont_gc = Qfalse;
return old;
}
VALUE
gc_s_disable()
static VALUE
gc_disable()
{
int old = dont_gc;
dont_gc = TRUE;
dont_gc = Qtrue;
return old;
}
VALUE mGC;
VALUE rb_mGC;
static struct gc_list {
VALUE *varptr;
@ -225,11 +225,11 @@ add_heap()
heaps = (heaps_used>0)?
(RVALUE**)realloc(heaps, heaps_length*sizeof(RVALUE)):
(RVALUE**)malloc(heaps_length*sizeof(RVALUE));
if (heaps == 0) Fatal("can't alloc memory");
if (heaps == 0) rb_fatal("can't alloc memory");
}
p = heaps[heaps_used++] = (RVALUE*)malloc(sizeof(RVALUE)*HEAP_SLOTS);
if (p == 0) Fatal("can't alloc memory");
if (p == 0) rb_fatal("add_heap: can't alloc memory");
pend = p + HEAP_SLOTS;
if (lomem == 0 || lomem > p) lomem = p;
if (himem < pend) himem = pend;
@ -255,14 +255,14 @@ rb_newobj()
alloc_objects++;
return obj;
}
if (dont_gc || prohibit_interrupt) add_heap();
else gc_gc();
if (dont_gc || rb_prohibit_interrupt) add_heap();
else rb_gc();
goto retry;
}
VALUE
data_object_alloc(klass, datap, dmark, dfree)
rb_data_object_alloc(klass, datap, dmark, dfree)
VALUE klass;
void *datap;
void (*dfree)();
@ -278,7 +278,7 @@ data_object_alloc(klass, datap, dmark, dfree)
}
extern st_table *rb_class_tbl;
VALUE *gc_stack_start;
VALUE *rb_gc_stack_start;
static int
looks_pointerp(ptr)
@ -288,16 +288,16 @@ looks_pointerp(ptr)
register RVALUE *heap_org;
register long i;
if (p < lomem || p > himem) return FALSE;
if (p < lomem || p > himem) return Qfalse;
/* check if p looks like a pointer */
for (i=0; i < heaps_used; i++) {
heap_org = heaps[i];
if (heap_org <= p && p < heap_org + HEAP_SLOTS
&& ((((char*)p)-((char*)heap_org))%sizeof(RVALUE)) == 0)
return TRUE;
return Qtrue;
}
return FALSE;
return Qfalse;
}
static void
@ -307,14 +307,14 @@ mark_locations_array(x, n)
{
while (n--) {
if (looks_pointerp(*x)) {
gc_mark(*x);
rb_gc_mark(*x);
}
x++;
}
}
void
gc_mark_locations(start, end)
rb_gc_mark_locations(start, end)
VALUE *start, *end;
{
VALUE *tmp;
@ -334,7 +334,7 @@ mark_entry(key, value)
ID key;
VALUE value;
{
gc_mark(value);
rb_gc_mark(value);
return ST_CONTINUE;
}
@ -351,8 +351,8 @@ mark_hashentry(key, value)
ID key;
VALUE value;
{
gc_mark(key);
gc_mark(value);
rb_gc_mark(key);
rb_gc_mark(value);
return ST_CONTINUE;
}
@ -365,16 +365,16 @@ mark_hash(tbl)
}
void
gc_mark_maybe(obj)
rb_gc_mark_maybe(obj)
void *obj;
{
if (looks_pointerp(obj)) {
gc_mark(obj);
rb_gc_mark(obj);
}
}
void
gc_mark(ptr)
rb_gc_mark(ptr)
void *ptr;
{
register RVALUE *obj = RANY(ptr);
@ -390,7 +390,7 @@ gc_mark(ptr)
switch (obj->as.basic.flags & T_MASK) {
case T_NIL:
case T_FIXNUM:
Bug("gc_mark() called for broken object");
rb_bug("rb_gc_mark() called for broken object");
break;
case T_NODE:
@ -399,7 +399,7 @@ gc_mark(ptr)
case NODE_FOR:
case NODE_ITER:
case NODE_CREF:
gc_mark(obj->as.node.u2.node);
rb_gc_mark(obj->as.node.u2.node);
/* fall through */
case NODE_BLOCK: /* 1,3 */
case NODE_ARRAY:
@ -413,7 +413,7 @@ gc_mark(ptr)
#ifdef C_ALLOCA
case NODE_ALLOCA:
#endif
gc_mark(obj->as.node.u1.node);
rb_gc_mark(obj->as.node.u1.node);
/* fall through */
case NODE_SUPER: /* 3 */
case NODE_FCALL:
@ -425,7 +425,7 @@ gc_mark(ptr)
case NODE_UNTIL:
case NODE_MATCH2:
case NODE_MATCH3:
gc_mark(obj->as.node.u1.node);
rb_gc_mark(obj->as.node.u1.node);
/* fall through */
case NODE_METHOD: /* 2 */
case NODE_NOT:
@ -447,7 +447,7 @@ gc_mark(ptr)
goto Top;
case NODE_SCOPE: /* 2,3 */
gc_mark(obj->as.node.u3.node);
rb_gc_mark(obj->as.node.u3.node);
obj = RANY(obj->as.node.u2.node);
goto Top;
@ -471,10 +471,10 @@ gc_mark(ptr)
default:
if (looks_pointerp(obj->as.node.u1.node)) {
gc_mark(obj->as.node.u1.node);
rb_gc_mark(obj->as.node.u1.node);
}
if (looks_pointerp(obj->as.node.u2.node)) {
gc_mark(obj->as.node.u2.node);
rb_gc_mark(obj->as.node.u2.node);
}
if (looks_pointerp(obj->as.node.u3.node)) {
obj = RANY(obj->as.node.u3.node);
@ -484,17 +484,17 @@ gc_mark(ptr)
return; /* no need to mark class. */
}
gc_mark(obj->as.basic.klass);
rb_gc_mark(obj->as.basic.klass);
switch (obj->as.basic.flags & T_MASK) {
case T_ICLASS:
gc_mark(obj->as.klass.super);
rb_gc_mark(obj->as.klass.super);
mark_tbl(obj->as.klass.iv_tbl);
mark_tbl(obj->as.klass.m_tbl);
break;
case T_CLASS:
case T_MODULE:
gc_mark(obj->as.klass.super);
rb_gc_mark(obj->as.klass.super);
mark_tbl(obj->as.klass.m_tbl);
mark_tbl(obj->as.klass.iv_tbl);
break;
@ -505,12 +505,13 @@ gc_mark(ptr)
VALUE *ptr = obj->as.array.ptr;
for (i=0; i < len; i++)
gc_mark(*ptr++);
rb_gc_mark(*ptr++);
}
break;
case T_HASH:
mark_hash(obj->as.hash.tbl);
rb_gc_mark(obj->as.hash.ifnone);
break;
case T_STRING:
@ -542,7 +543,7 @@ gc_mark(ptr)
break;
case T_VARMAP:
gc_mark(obj->as.varmap.val);
rb_gc_mark(obj->as.varmap.val);
obj = RANY(obj->as.varmap.next);
goto Top;
break;
@ -553,7 +554,7 @@ gc_mark(ptr)
VALUE *vars = &obj->as.scope.local_vars[-1];
while (n--) {
gc_mark_maybe(*vars);
rb_gc_mark(*vars);
vars++;
}
}
@ -565,14 +566,14 @@ gc_mark(ptr)
VALUE *ptr = obj->as.rstruct.ptr;
for (i=0; i < len; i++)
gc_mark(*ptr++);
rb_gc_mark(*ptr++);
}
break;
default:
Bug("gc_mark(): unknown data type 0x%x(0x%x) %s",
obj->as.basic.flags & T_MASK, obj,
looks_pointerp(obj)?"corrupted object":"non object");
rb_bug("rb_gc_mark(): unknown data type 0x%x(0x%x) %s",
obj->as.basic.flags & T_MASK, obj,
looks_pointerp(obj)?"corrupted object":"non object");
}
}
@ -588,11 +589,12 @@ gc_sweep()
int i;
if (rb_in_compile) {
/* sould not reclaim nodes during compilation */
for (i = 0; i < heaps_used; i++) {
p = heaps[i]; pend = p + HEAP_SLOTS;
while (p < pend) {
if (!(p->as.basic.flags&FL_MARK) && BUILTIN_TYPE(p) == T_NODE)
gc_mark(p);
rb_gc_mark(p);
p++;
}
}
@ -628,7 +630,7 @@ gc_sweep()
}
void
gc_force_recycle(p)
rb_gc_force_recycle(p)
VALUE p;
{
RANY(p)->as.free.flag = 0;
@ -647,11 +649,11 @@ obj_free(obj)
case T_FIXNUM:
case T_TRUE:
case T_FALSE:
Bug("obj_free() called for broken object");
rb_bug("obj_free() called for broken object");
break;
}
if (need_call_final) {
if (need_call_final && FL_TEST(obj, FL_FINALIZE)) {
run_final(obj);
}
switch (RANY(obj)->as.basic.flags & T_MASK) {
@ -705,7 +707,7 @@ obj_free(obj)
break;
case T_FILE:
if (RANY(obj)->as.file.fptr) {
io_fptr_finalize(RANY(obj)->as.file.fptr);
rb_io_fptr_finalize(RANY(obj)->as.file.fptr);
free(RANY(obj)->as.file.fptr);
}
break;
@ -742,22 +744,23 @@ obj_free(obj)
break;
default:
Bug("gc_sweep(): unknown data type %d", RANY(obj)->as.basic.flags & T_MASK);
rb_bug("gc_sweep(): unknown data type %d",
RANY(obj)->as.basic.flags & T_MASK);
}
}
void
gc_mark_frame(frame)
rb_gc_mark_frame(frame)
struct FRAME *frame;
{
int n = frame->argc;
VALUE *tbl = frame->argv;
while (n--) {
gc_mark_maybe(*tbl);
rb_gc_mark_maybe(*tbl);
tbl++;
}
gc_mark(frame->cbase);
rb_gc_mark(frame->cbase);
}
#ifdef __GNUC__
@ -796,7 +799,7 @@ int rb_setjmp (rb_jmp_buf);
#endif /* __GNUC__ */
void
gc_gc()
rb_gc()
{
struct gc_list *list;
struct FRAME *frame;
@ -812,52 +815,52 @@ gc_gc()
#endif
/* mark frame stack */
for (frame = the_frame; frame; frame = frame->prev) {
gc_mark_frame(frame);
for (frame = ruby_frame; frame; frame = frame->prev) {
rb_gc_mark_frame(frame);
}
gc_mark(the_scope);
gc_mark(the_dyna_vars);
rb_gc_mark(ruby_scope);
rb_gc_mark(ruby_dyna_vars);
FLUSH_REGISTER_WINDOWS;
/* This assumes that all registers are saved into the jmp_buf */
setjmp(save_regs_gc_mark);
mark_locations_array((VALUE*)&save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
gc_mark_locations(gc_stack_start, (VALUE*)&stack_end);
rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)&stack_end);
#if defined(THINK_C) || defined(__human68k__)
#ifndef __human68k__
mark_locations_array((VALUE*)((char*)save_regs_gc_mark+2),
sizeof(save_regs_gc_mark) / sizeof(VALUE *));
#endif
gc_mark_locations((VALUE*)((char*)gc_stack_start + 2),
rb_gc_mark_locations((VALUE*)((char*)rb_gc_stack_start + 2),
(VALUE*)((char*)&stack_end + 2));
#endif
#ifdef THREAD
gc_mark_threads();
rb_gc_mark_threads();
#endif
/* mark protected global variables */
for (list = Global_List; list; list = list->next) {
gc_mark(*list->varptr);
rb_gc_mark(*list->varptr);
}
gc_mark_global_tbl();
rb_gc_mark_global_tbl();
mark_tbl(rb_class_tbl);
gc_mark_trap_list();
rb_gc_mark_trap_list();
gc_sweep();
dont_gc--;
}
static VALUE
gc_method()
gc_start()
{
gc_gc();
rb_gc();
return Qnil;
}
void
init_stack()
Init_stack()
{
#ifdef __human68k__
extern void *_SEND;
@ -865,14 +868,14 @@ init_stack()
#else
VALUE start;
gc_stack_start = &start;
rb_gc_stack_start = &start;
#endif
}
void
init_heap()
Init_heap()
{
init_stack();
Init_stack();
add_heap();
}
@ -929,7 +932,7 @@ os_obj_of(of)
case T_CLASS:
if (FL_TEST(p, FL_SINGLETON)) continue;
default:
if (obj_is_kind_of((VALUE)p, of)) {
if (rb_obj_is_kind_of((VALUE)p, of)) {
rb_yield((VALUE)p);
n++;
}
@ -962,11 +965,11 @@ static VALUE
add_final(os, proc)
VALUE os, proc;
{
if (!obj_is_kind_of(proc, cProc)) {
ArgError("wrong type argument %s (Proc required)",
rb_class2name(CLASS_OF(proc)));
if (!rb_obj_is_kind_of(proc, rb_cProc)) {
rb_raise(rb_eArgError, "wrong type argument %s (Proc required)",
rb_class2name(CLASS_OF(proc)));
}
ary_push(finalizers, proc);
rb_ary_push(finalizers, proc);
return proc;
}
@ -974,7 +977,7 @@ static VALUE
rm_final(os, proc)
VALUE os, proc;
{
ary_delete(finalizers, proc);
rb_ary_delete(finalizers, proc);
return proc;
}
@ -999,16 +1002,14 @@ run_final(obj)
{
int i;
if (!FL_TEST(obj, FL_FINALIZE)) return;
obj = INT2NUM((long)obj); /* make obj into id */
for (i=0; i<RARRAY(finalizers)->len; i++) {
rb_eval_cmd(RARRAY(finalizers)->ptr[i], ary_new3(1,obj));
rb_eval_cmd(RARRAY(finalizers)->ptr[i], rb_ary_new3(1,obj));
}
}
void
gc_call_finalizer_at_exit()
rb_gc_call_finalizer_at_exit()
{
RVALUE *p, *pend;
int i;
@ -1017,7 +1018,8 @@ gc_call_finalizer_at_exit()
for (i = 0; i < heaps_used; i++) {
p = heaps[i]; pend = p + HEAP_SLOTS;
while (p < pend) {
run_final((VALUE)p);
if (FL_TEST(p, FL_FINALIZE))
run_final((VALUE)p);
p++;
}
}
@ -1041,15 +1043,15 @@ id2ref(obj, id)
unsigned long ptr = NUM2UINT(id);
if (FIXNUM_P(ptr)) return (VALUE)ptr;
if (ptr == TRUE) return TRUE;
if (ptr == FALSE) return FALSE;
if (ptr == Qtrue) return Qtrue;
if (ptr == Qfalse) return Qfalse;
if (ptr == Qnil) return Qnil;
if (!looks_pointerp(ptr)) {
IndexError("0x%x is not the id value", ptr);
rb_raise(rb_eIndexError, "0x%x is not the id value", ptr);
}
if (RANY(ptr)->as.free.flag == 0) {
IndexError("0x%x is recycled object", ptr);
rb_raise(rb_eIndexError, "0x%x is recycled object", ptr);
}
return (VALUE)ptr;
}
@ -1057,23 +1059,23 @@ id2ref(obj, id)
void
Init_GC()
{
VALUE mObSpace;
VALUE rb_mObSpace;
mGC = rb_define_module("GC");
rb_define_singleton_method(mGC, "start", gc_method, 0);
rb_define_singleton_method(mGC, "enable", gc_s_enable, 0);
rb_define_singleton_method(mGC, "disable", gc_s_disable, 0);
rb_define_method(mGC, "garbage_collect", gc_method, 0);
rb_mGC = rb_define_module("GC");
rb_define_singleton_method(rb_mGC, "start", gc_start, 0);
rb_define_singleton_method(rb_mGC, "enable", gc_enable, 0);
rb_define_singleton_method(rb_mGC, "disable", gc_disable, 0);
rb_define_method(rb_mGC, "garbage_collect", gc_start, 0);
mObSpace = rb_define_module("ObjectSpace");
rb_define_module_function(mObSpace, "each_object", os_each_obj, -1);
rb_define_module_function(mObSpace, "garbage_collect", gc_method, 0);
rb_define_module_function(mObSpace, "add_finalizer", add_final, 1);
rb_define_module_function(mObSpace, "remove_finalizer", rm_final, 1);
rb_define_module_function(mObSpace, "finalizers", finals, 0);
rb_define_module_function(mObSpace, "call_finalizer", call_final, 1);
rb_define_module_function(mObSpace, "_id2ref", id2ref, 1);
rb_mObSpace = rb_define_module("ObjectSpace");
rb_define_module_function(rb_mObSpace, "each_object", os_each_obj, -1);
rb_define_module_function(rb_mObSpace, "garbage_collect", gc_start, 0);
rb_define_module_function(rb_mObSpace, "add_finalizer", add_final, 1);
rb_define_module_function(rb_mObSpace, "remove_finalizer", rm_final, 1);
rb_define_module_function(rb_mObSpace, "finalizers", finals, 0);
rb_define_module_function(rb_mObSpace, "call_finalizer", call_final, 1);
rb_define_module_function(rb_mObSpace, "_id2ref", id2ref, 1);
rb_global_variable(&finalizers);
finalizers = ary_new();
finalizers = rb_ary_new();
}

456
hash.c

File diff suppressed because it is too large Load diff

416
intern.h
View file

@ -3,74 +3,72 @@
*/
/* array.c */
void memclear _((register VALUE*, register int));
VALUE assoc_new _((VALUE, VALUE));
VALUE ary_new _((void));
VALUE ary_new2 _((int));
VALUE ary_new3 __((int,...));
VALUE ary_new4 _((int, VALUE *));
VALUE ary_freeze _((VALUE));
VALUE ary_aref _((int, VALUE*, VALUE));
void ary_store _((VALUE, int, VALUE));
VALUE ary_push _((VALUE, VALUE));
VALUE ary_pop _((VALUE));
VALUE ary_shift _((VALUE));
VALUE ary_unshift _((VALUE, VALUE));
VALUE ary_entry _((VALUE, int));
VALUE ary_each _((VALUE));
VALUE ary_join _((VALUE, VALUE));
VALUE ary_to_s _((VALUE));
VALUE ary_print_on _((VALUE, VALUE));
VALUE ary_reverse _((VALUE));
VALUE ary_sort_bang _((VALUE));
VALUE ary_sort _((VALUE));
VALUE ary_delete _((VALUE, VALUE));
VALUE ary_delete_at _((VALUE, VALUE));
VALUE ary_plus _((VALUE, VALUE));
VALUE ary_concat _((VALUE, VALUE));
VALUE ary_assoc _((VALUE, VALUE));
VALUE ary_rassoc _((VALUE, VALUE));
VALUE ary_includes _((VALUE, VALUE));
void rb_mem_clear _((register VALUE*, register int));
VALUE rb_assoc_new _((VALUE, VALUE));
VALUE rb_ary_new _((void));
VALUE rb_ary_new2 _((int));
VALUE rb_ary_new3 __((int,...));
VALUE rb_ary_new4 _((int, VALUE *));
VALUE rb_ary_freeze _((VALUE));
VALUE rb_ary_aref _((int, VALUE*, VALUE));
void rb_ary_store _((VALUE, int, VALUE));
VALUE rb_ary_to_s _((VALUE));
VALUE rb_ary_push _((VALUE, VALUE));
VALUE rb_ary_pop _((VALUE));
VALUE rb_ary_shift _((VALUE));
VALUE rb_ary_unshift _((VALUE, VALUE));
VALUE rb_ary_entry _((VALUE, int));
VALUE rb_ary_each _((VALUE));
VALUE rb_ary_join _((VALUE, VALUE));
VALUE rb_ary_print_on _((VALUE, VALUE));
VALUE rb_ary_reverse _((VALUE));
VALUE rb_ary_sort _((VALUE));
VALUE rb_ary_sort_bang _((VALUE));
VALUE rb_ary_delete _((VALUE, VALUE));
VALUE rb_ary_delete_at _((VALUE, VALUE));
VALUE rb_ary_plus _((VALUE, VALUE));
VALUE rb_ary_concat _((VALUE, VALUE));
VALUE rb_ary_assoc _((VALUE, VALUE));
VALUE rb_ary_rassoc _((VALUE, VALUE));
VALUE rb_ary_includes _((VALUE, VALUE));
/* bignum.c */
VALUE big_clone _((VALUE));
void big_2comp _((VALUE));
VALUE big_norm _((VALUE));
VALUE uint2big _((unsigned long));
VALUE int2big _((long));
VALUE uint2inum _((unsigned long));
VALUE int2inum _((long));
VALUE str2inum _((char*, int));
VALUE big2str _((VALUE, int));
long big2long _((VALUE));
#define big2int(x) big2long(x)
unsigned long big2ulong _((VALUE));
#define big2uint(x) big2ulong(x)
VALUE big_to_i _((VALUE));
VALUE dbl2big _((double));
double big2dbl _((VALUE));
VALUE big_to_f _((VALUE));
VALUE big_plus _((VALUE, VALUE));
VALUE big_minus _((VALUE, VALUE));
VALUE big_mul _((VALUE, VALUE));
VALUE big_pow _((VALUE, VALUE));
VALUE big_and _((VALUE, VALUE));
VALUE big_or _((VALUE, VALUE));
VALUE big_xor _((VALUE, VALUE));
VALUE big_lshift _((VALUE, VALUE));
VALUE big_rand _((VALUE));
VALUE rb_big_clone _((VALUE));
void rb_big_2comp _((VALUE));
VALUE rb_big_norm _((VALUE));
VALUE rb_uint2big _((unsigned long));
VALUE rb_int2big _((long));
VALUE rb_uint2inum _((unsigned long));
VALUE rb_int2inum _((long));
VALUE rb_str2inum _((char*, int));
VALUE rb_big2str _((VALUE, int));
long rb_big2long _((VALUE));
#define rb_big2int(x) rb_big2long(x)
unsigned long rb_big2ulong _((VALUE));
#define rb_big2uint(x) rb_big2ulong(x)
VALUE rb_dbl2big _((double));
double rb_big2dbl _((VALUE));
VALUE rb_big_plus _((VALUE, VALUE));
VALUE rb_big_minus _((VALUE, VALUE));
VALUE rb_big_mul _((VALUE, VALUE));
VALUE rb_big_pow _((VALUE, VALUE));
VALUE rb_big_and _((VALUE, VALUE));
VALUE rb_big_or _((VALUE, VALUE));
VALUE rb_big_xor _((VALUE, VALUE));
VALUE rb_big_lshift _((VALUE, VALUE));
VALUE rb_big_rand _((VALUE));
/* class.c */
VALUE class_new _((VALUE));
VALUE singleton_class_new _((VALUE));
VALUE singleton_class_clone _((VALUE));
void singleton_class_attached _((VALUE,VALUE));
VALUE rb_class_new _((VALUE));
VALUE rb_singleton_class_new _((VALUE));
VALUE rb_singleton_class_clone _((VALUE));
void rb_singleton_class_attached _((VALUE,VALUE));
VALUE rb_define_class_id _((ID, VALUE));
VALUE module_new _((void));
VALUE rb_module_new _((void));
VALUE rb_define_module_id _((ID));
VALUE mod_included_modules _((VALUE));
VALUE mod_ancestors _((VALUE));
VALUE class_instance_methods _((int, VALUE*, VALUE));
VALUE class_private_instance_methods _((int, VALUE*, VALUE));
VALUE obj_singleton_methods _((VALUE));
VALUE rb_mod_included_modules _((VALUE));
VALUE rb_mod_ancestors _((VALUE));
VALUE rb_class_instance_methods _((int, VALUE*, VALUE));
VALUE rb_class_private_instance_methods _((int, VALUE*, VALUE));
VALUE rb_obj_singleton_methods _((VALUE));
void rb_define_method_id _((VALUE, ID, VALUE (*)(), int));
void rb_undef_method _((VALUE, char*));
void rb_define_protected_method _((VALUE, char*, VALUE (*)(), int));
@ -79,17 +77,18 @@ void rb_define_singleton_method _((VALUE,char*,VALUE(*)(),int));
void rb_define_private_method _((VALUE,char*,VALUE(*)(),int));
VALUE rb_singleton_class _((VALUE));
/* enum.c */
VALUE enum_length _((VALUE));
VALUE rb_enum_length _((VALUE));
/* error.c */
VALUE exc_new _((VALUE, char*, unsigned int));
VALUE exc_new2 _((VALUE, char*));
VALUE exc_new3 _((VALUE, VALUE));
void TypeError __((char*, ...)) NORETURN;
void ArgError __((char*, ...)) NORETURN;
void NameError __((char*, ...)) NORETURN;
void IndexError __((char*, ...)) NORETURN;
void LoadError __((char*, ...)) NORETURN;
extern int ruby_nerrs;
VALUE rb_exc_new _((VALUE, char*, unsigned int));
VALUE rb_exc_new2 _((VALUE, char*));
VALUE rb_exc_new3 _((VALUE, VALUE));
void rb_loaderror __((char*, ...)) NORETURN;
void rb_compile_error __((char*, ...));
void rb_compile_append __((char*, ...));
/* eval.c */
void rb_exc_raise _((VALUE)) NORETURN;
void rb_exc_fatal _((VALUE)) NORETURN;
void rb_remove_method _((VALUE, char*));
void rb_disable_super _((VALUE, char*));
void rb_enable_super _((VALUE, char*));
@ -97,133 +96,129 @@ void rb_clear_cache _((void));
void rb_alias _((VALUE, ID, ID));
void rb_attr _((VALUE,ID,int,int,int));
int rb_method_boundp _((VALUE, ID, int));
VALUE dyna_var_defined _((ID));
VALUE dyna_var_ref _((ID));
VALUE dyna_var_asgn _((ID, VALUE));
void ruby_init _((void));
void ruby_options _((int, char**));
void ruby_run _((void));
VALUE rb_dvar_defined _((ID));
VALUE rb_dvar_ref _((ID));
void rb_dvar_asgn _((ID, VALUE));
void rb_dvar_push _((ID, VALUE));
VALUE rb_eval_cmd _((VALUE, VALUE));
VALUE rb_trap_eval _((VALUE, int));
int rb_respond_to _((VALUE, ID));
void rb_raise _((VALUE));
void rb_fatal _((VALUE));
void rb_interrupt _((void));
int iterator_p _((void));
VALUE rb_yield_0 _((VALUE, volatile VALUE));
VALUE rb_apply _((VALUE, ID, VALUE));
VALUE rb_funcall2 _((VALUE, ID, int, VALUE*));
void rb_backtrace _((void));
ID rb_frame_last_func _((void));
VALUE f_load _((VALUE, VALUE));
VALUE rb_f_load _((VALUE, VALUE));
void rb_provide _((char*));
VALUE f_require _((VALUE, VALUE));
void obj_call_init _((VALUE));
VALUE class_new_instance _((int, VALUE*, VALUE));
VALUE f_lambda _((void));
VALUE rb_f_require _((VALUE, VALUE));
void rb_obj_call_init _((VALUE));
VALUE rb_class_new_instance _((int, VALUE*, VALUE));
VALUE rb_f_lambda _((void));
void rb_set_end_proc _((void (*)(),VALUE));
void gc_mark_threads _((void));
void thread_schedule _((void));
void thread_wait_fd _((int));
void thread_fd_writable _((int));
int thread_alone _((void));
void thread_sleep _((int));
void thread_sleep_forever _((void));
VALUE thread_create _((VALUE (*)(), void*));
void thread_interrupt _((void));
void thread_trap_eval _((VALUE, int));
int thread_select();
void thread_wait_for();
void rb_gc_mark_threads _((void));
void rb_thread_schedule _((void));
void rb_thread_wait_fd _((int));
void rb_thread_fd_writable _((int));
int rb_thread_alone _((void));
void rb_thread_sleep _((int));
void rb_thread_sleep_forever _((void));
VALUE rb_thread_create _((VALUE (*)(), void*));
int rb_thread_scope_shared_p _((void));
void rb_thread_interrupt _((void));
void rb_thread_trap_eval _((VALUE, int));
int rb_thread_select();
void rb_thread_wait_for();
/* file.c */
VALUE file_open _((char*, char*));
VALUE rb_file_open _((char*, char*));
int eaccess _((char*, int));
VALUE file_s_expand_path _((int, VALUE *));
VALUE rb_file_s_expand_path _((int, VALUE *));
/* gc.c */
void rb_global_variable _((VALUE*));
void gc_mark_locations _((VALUE*, VALUE*));
void gc_mark_maybe();
void gc_mark();
void gc_force_recycle();
void gc_gc _((void));
void init_stack _((void));
void init_heap _((void));
void rb_gc_mark_locations _((VALUE*, VALUE*));
void rb_gc_mark_maybe();
void rb_gc_mark();
void rb_gc_force_recycle();
void rb_gc _((void));
void rb_gc_call_finalizer_at_exit _((void));
/* hash.c */
VALUE hash_freeze _((VALUE));
VALUE rb_hash_freeze _((VALUE));
VALUE rb_hash _((VALUE));
VALUE hash_new _((void));
VALUE hash_aref _((VALUE, VALUE));
VALUE hash_aset _((VALUE, VALUE, VALUE));
int env_path_tainted _((void));
VALUE rb_hash_new _((void));
VALUE rb_hash_aref _((VALUE, VALUE));
VALUE rb_hash_aset _((VALUE, VALUE, VALUE));
int rb_env_path_tainted _((void));
/* io.c */
void eof_error _((void));
VALUE io_write _((VALUE, VALUE));
VALUE io_gets_method _((int, VALUE*, VALUE));
VALUE io_gets _((VALUE));
VALUE io_getc _((VALUE));
VALUE io_ungetc _((VALUE, VALUE));
VALUE io_close _((VALUE));
VALUE io_binmode _((VALUE));
int io_mode_flags _((char*));
VALUE io_reopen _((VALUE, VALUE));
VALUE f_gets _((void));
extern VALUE rb_fs;
extern VALUE rb_output_fs;
extern VALUE rb_rs;
extern VALUE rb_default_rs;
extern VALUE rb_output_rs;
VALUE rb_io_write _((VALUE, VALUE));
VALUE rb_io_gets_method _((int, VALUE*, VALUE));
VALUE rb_io_gets _((VALUE));
VALUE rb_io_getc _((VALUE));
VALUE rb_io_ungetc _((VALUE, VALUE));
VALUE rb_io_close _((VALUE));
VALUE rb_io_binmode _((VALUE));
int rb_io_mode_flags _((char*));
VALUE rb_io_reopen _((VALUE, VALUE));
VALUE rb_f_gets _((void));
void rb_str_setter _((VALUE, ID, VALUE*));
/* numeric.c */
void num_zerodiv _((void));
VALUE num_coerce_bin _((VALUE, VALUE));
VALUE float_new _((double));
VALUE flo_pow _((VALUE, VALUE));
VALUE num2fix _((VALUE));
VALUE fix2str _((VALUE, int));
VALUE fix_to_s _((VALUE));
VALUE num_upto _((VALUE, VALUE));
VALUE fix_upto _((VALUE, VALUE));
void rb_num_zerodiv _((void));
VALUE rb_num_coerce_bin _((VALUE, VALUE));
VALUE rb_float_new _((double));
VALUE rb_num2fix _((VALUE));
VALUE rb_fix2str _((VALUE, int));
VALUE rb_fix_upto _((VALUE, VALUE));
/* object.c */
VALUE rb_equal _((VALUE, VALUE));
int rb_eql _((VALUE, VALUE));
VALUE obj_equal _((VALUE, VALUE));
VALUE any_to_s _((VALUE));
VALUE rb_obj_equal _((VALUE, VALUE));
VALUE rb_any_to_s _((VALUE));
VALUE rb_inspect _((VALUE));
VALUE obj_is_instance_of _((VALUE, VALUE));
VALUE obj_is_kind_of _((VALUE, VALUE));
VALUE obj_alloc _((VALUE));
VALUE rb_obj_is_instance_of _((VALUE, VALUE));
VALUE rb_obj_is_kind_of _((VALUE, VALUE));
VALUE rb_obj_alloc _((VALUE));
VALUE rb_convert_type _((VALUE,int,char*,char*));
VALUE rb_Integer _((VALUE));
VALUE rb_Float _((VALUE));
VALUE rb_String _((VALUE));
VALUE rb_Array _((VALUE));
double num2dbl _((VALUE));
double rb_num2dbl _((VALUE));
/* parse.y */
extern int ruby_sourceline;
extern char *ruby_sourcefile;
int yyparse _((void));
void pushback _((int));
ID id_attrset _((ID));
void yyappend_print _((void));
void yywhile_loop _((int, int));
ID rb_id_attrset _((ID));
void rb_parser_append_print _((void));
void rb_parser_while_loop _((int, int));
int rb_is_const_id _((ID));
int rb_is_instance_id _((ID));
void local_var_append _((ID));
VALUE backref_get _((void));
void backref_set _((VALUE));
VALUE lastline_get _((void));
void lastline_set _((VALUE));
VALUE rb_backref_get _((void));
void rb_backref_set _((VALUE));
VALUE rb_lastline_get _((void));
void rb_lastline_set _((VALUE));
/* process.c */
int rb_proc_exec _((char*));
void rb_syswait _((int));
/* range.c */
VALUE range_new _((VALUE, VALUE));
VALUE range_beg_end _((VALUE, int*, int*));
VALUE rb_range_new _((VALUE, VALUE));
VALUE rb_range_beg_end _((VALUE, int*, int*));
/* re.c */
VALUE reg_nth_defined _((int, VALUE));
VALUE reg_nth_match _((int, VALUE));
VALUE reg_last_match _((VALUE));
VALUE reg_match_pre _((VALUE));
VALUE reg_match_post _((VALUE));
VALUE reg_match_last _((VALUE));
VALUE reg_new _((char*, int, int));
VALUE reg_match _((VALUE, VALUE));
VALUE reg_match2 _((VALUE));
int reg_options _((VALUE));
VALUE rb_reg_nth_defined _((int, VALUE));
VALUE rb_reg_nth_match _((int, VALUE));
VALUE rb_reg_last_match _((VALUE));
VALUE rb_reg_match_pre _((VALUE));
VALUE rb_reg_match_post _((VALUE));
VALUE rb_reg_match_last _((VALUE));
VALUE rb_reg_new _((char*, int, int));
VALUE rb_reg_match _((VALUE, VALUE));
VALUE rb_reg_match2 _((VALUE));
int rb_reg_options _((VALUE));
char*rb_get_kcode _((void));
void rb_set_kcode _((char*));
int rb_ignorecase_p _((void));
/* ruby.c */
void rb_load_file _((char*));
void ruby_script _((char*));
@ -233,72 +228,75 @@ void ruby_process_options _((int, char**));
void ruby_require_modules _((void));
void ruby_load_script _((void));
/* signal.c */
VALUE f_kill _((int, VALUE*));
void gc_mark_trap_list _((void));
VALUE rb_f_kill _((int, VALUE*));
void rb_gc_mark_trap_list _((void));
#ifdef POSIX_SIGNAL
#define posix_signal ruby_posix_signal
void posix_signal _((int, void (*)()));
#endif
void rb_trap_exit _((void));
void rb_trap_exec _((void));
/* sprintf.c */
VALUE f_sprintf _((int, VALUE*));
VALUE rb_f_sprintf _((int, VALUE*));
/* string.c */
VALUE str_new _((char*, unsigned int));
VALUE str_new2 _((char*));
VALUE str_new3 _((VALUE));
VALUE str_new4 _((VALUE));
VALUE obj_as_string _((VALUE));
VALUE str_to_str _((VALUE));
VALUE str_dup _((VALUE));
VALUE str_plus _((VALUE, VALUE));
VALUE str_times _((VALUE, VALUE));
VALUE str_substr _((VALUE, int, int));
void str_modify _((VALUE));
VALUE str_freeze _((VALUE));
VALUE str_dup_frozen _((VALUE));
VALUE str_taint _((VALUE));
VALUE str_tainted _((VALUE));
VALUE str_resize _((VALUE, int));
VALUE str_cat _((VALUE, char*, unsigned int));
VALUE str_concat _((VALUE, VALUE));
int str_hash _((VALUE));
int str_cmp _((VALUE, VALUE));
VALUE str_upto _((VALUE, VALUE));
VALUE str_inspect _((VALUE));
VALUE str_split _((VALUE, char*));
VALUE rb_str_new _((char*, unsigned int));
VALUE rb_str_new2 _((char*));
VALUE rb_str_new3 _((VALUE));
VALUE rb_str_new4 _((VALUE));
VALUE rb_obj_as_string _((VALUE));
VALUE rb_str_to_str _((VALUE));
VALUE rb_str_dup _((VALUE));
VALUE rb_str_plus _((VALUE, VALUE));
VALUE rb_str_times _((VALUE, VALUE));
VALUE rb_str_substr _((VALUE, int, int));
void rb_str_modify _((VALUE));
VALUE rb_str_freeze _((VALUE));
VALUE rb_str_dup_frozen _((VALUE));
VALUE rb_str_taint _((VALUE));
VALUE rb_str_tainted _((VALUE));
VALUE rb_str_resize _((VALUE, int));
VALUE rb_str_cat _((VALUE, char*, unsigned int));
VALUE rb_str_concat _((VALUE, VALUE));
int rb_str_hash _((VALUE));
int rb_str_cmp _((VALUE, VALUE));
VALUE rb_str_upto _((VALUE, VALUE));
VALUE rb_str_inspect _((VALUE));
VALUE rb_str_split _((VALUE, char*));
/* struct.c */
VALUE struct_new __((VALUE, ...));
VALUE struct_define __((char*, ...));
VALUE struct_alloc _((VALUE, VALUE));
VALUE struct_aref _((VALUE, VALUE));
VALUE struct_aset _((VALUE, VALUE, VALUE));
VALUE struct_getmember _((VALUE, ID));
VALUE rb_struct_new __((VALUE, ...));
VALUE rb_struct_define __((char*, ...));
VALUE rb_struct_alloc _((VALUE, VALUE));
VALUE rb_struct_aref _((VALUE, VALUE));
VALUE rb_struct_aset _((VALUE, VALUE, VALUE));
VALUE rb_struct_getmember _((VALUE, ID));
/* time.c */
VALUE time_new _((int, int));
/* util.c */
void add_suffix _((VALUE, char*));
unsigned long scan_oct _((char*, int, int*));
unsigned long scan_hex _((char*, int, int*));
VALUE rb_time_new _((int, int));
/* variable.c */
struct st_table *new_idhash _((void));
VALUE mod_name _((VALUE));
VALUE rb_mod_name _((VALUE));
VALUE rb_class_path _((VALUE));
void rb_set_class_path _((VALUE, VALUE, char*));
VALUE rb_path2class _((char*));
void rb_name_class _((VALUE, ID));
void rb_autoload _((char*, char*));
VALUE f_autoload _((VALUE, VALUE, VALUE));
void gc_mark_global_tbl _((void));
VALUE f_trace_var _((int, VALUE*));
VALUE f_untrace_var _((int, VALUE*));
VALUE rb_f_autoload _((VALUE, VALUE, VALUE));
void rb_gc_mark_global_tbl _((void));
VALUE rb_f_trace_var _((int, VALUE*));
VALUE rb_f_untrace_var _((int, VALUE*));
VALUE rb_gvar_set2 _((char*, VALUE));
VALUE f_global_variables _((void));
VALUE rb_f_global_variables _((void));
void rb_alias_variable _((ID, ID));
VALUE rb_ivar_get _((VALUE, ID));
VALUE rb_ivar_set _((VALUE, ID, VALUE));
VALUE rb_ivar_defined _((VALUE, ID));
VALUE obj_instance_variables _((VALUE));
VALUE mod_const_at _((VALUE, VALUE));
VALUE mod_constants _((VALUE));
VALUE mod_const_of _((VALUE, VALUE));
VALUE rb_obj_instance_variables _((VALUE));
VALUE rb_obj_remove_instance_variable _((VALUE, VALUE));
VALUE rb_mod_const_at _((VALUE, VALUE));
VALUE rb_mod_constants _((VALUE));
VALUE rb_mod_const_of _((VALUE, VALUE));
VALUE rb_mod_remove_const _((VALUE, VALUE));
int rb_const_defined_at _((VALUE, ID));
int rb_autoload_defined _((ID));
int rb_const_defined _((VALUE, ID));
/* version.c */
void ruby_show_version _((void));
void ruby_show_copyright _((void));

879
io.c

File diff suppressed because it is too large Load diff

View file

@ -267,6 +267,6 @@ class DEBUGGER__
CONTEXT = new
end
set_trace_func proc{|event, file, line, id, binding|
DEBUGGER__::CONTEXT.trace_func event, file, line, id, binding
set_trace_func proc{|event, file, line, id, binding, klass|
DEBUGGER__::CONTEXT.trace_func event, file, line, id, binding, klass
}

View file

@ -30,7 +30,7 @@ class << File
to.binmode
begin
while TRUE
while true
r = from.sysread(fsize)
rsize = r.size
w = 0
@ -40,9 +40,9 @@ class << File
end
end
rescue EOFError
ret = TRUE
ret = true
rescue
ret = FALSE
ret = false
ensure
to.close
from.close
@ -50,7 +50,7 @@ class << File
ret
end
def copy from, to, verbose = FALSE
def copy from, to, verbose = false
$stderr.print from, " -> ", catname(from, to), "\n" if verbose
syscopy from, to
end
@ -59,7 +59,7 @@ class << File
# move file
def move from, to, verbose = FALSE
def move from, to, verbose = false
to = catname(from, to)
$stderr.print from, " -> ", to, "\n" if verbose
@ -76,10 +76,10 @@ class << File
alias mv move
# compare two files
# TRUE: identical
# FALSE: not identical
# true: identical
# false: not identical
def compare from, to, verbose = FALSE
def compare from, to, verbose = false
$stderr.print from, " <=> ", to, "\n" if verbose
fsize = size(from)
fsize = 1024 if fsize < 512
@ -90,7 +90,7 @@ class << File
to = open(to, "r")
to.binmode
ret = FALSE
ret = false
fr = tr = ''
begin
@ -103,7 +103,7 @@ class << File
end
end
rescue
ret = FALSE
ret = false
ensure
to.close
from.close
@ -116,7 +116,7 @@ class << File
# unlink files safely
def safe_unlink(*files)
verbose = if files[-1].is_a? String then FALSE else files.pop end
verbose = if files[-1].is_a? String then false else files.pop end
begin
$stderr.print files.join(" "), "\n" if verbose
chmod 0777, *files
@ -129,7 +129,7 @@ class << File
alias rm_f safe_unlink
def makedirs(*dirs)
verbose = if dirs[-1].is_a? String then FALSE else dirs.pop end
verbose = if dirs[-1].is_a? String then false else dirs.pop end
# mode = if dirs[-1].is_a? Fixnum then dirs.pop else 0755 end
mode = 0755
for dir in dirs
@ -146,12 +146,12 @@ class << File
alias o_chmod chmod
def chmod(mode, *files)
verbose = if files[-1].is_a? String then FALSE else files.pop end
verbose = if files[-1].is_a? String then false else files.pop end
$stderr.printf "chmod %04o %s\n", mode, files.join(" ") if verbose
o_chmod mode, *files
end
def install(from, to, mode, verbose)
def install(from, to, mode = nil, verbose = false)
to = catname(from, to)
unless FileTest.exist? to and cmp from, to
cp from, to, verbose

View file

@ -22,7 +22,7 @@ class Tempfile < SimpleDelegator
File.unlink(path)
end
if File.exist?(path + '.lock')
File.rmdir(path + '.lock')
Dir.rmdir(path + '.lock')
end
print "done\n" if $DEBUG
}
@ -51,8 +51,8 @@ class Tempfile < SimpleDelegator
@clean_files = Tempfile.callback(tmpname)
ObjectSpace.define_finalizer(self, @clean_files)
@tmpname = tmpname
@tmpfile = File.open(tmpname, 'w+')
@tmpname = tmpname
super(@tmpfile)
Dir.rmdir(lock)
ensure

View file

@ -1548,10 +1548,16 @@ module TkTreatFont
end
end
class TkObject<TkKernel
class TkObject
include Tk
include TkTreatFont
def TkObject.new(*args, &block)
obj = super
obj.instance_eval(&block) if block
obj
end
def path
return @path
end

133
marshal.c
View file

@ -64,7 +64,7 @@ w_byte(c, arg)
struct dump_arg *arg;
{
if (arg->fp) putc(c, arg->fp);
else str_cat(arg->str, &c, 1);
else rb_str_cat(arg->str, &c, 1);
}
static void
@ -78,7 +78,7 @@ w_bytes(s, n, arg)
fwrite(s, 1, n, arg->fp);
}
else {
str_cat(arg->str, s, n);
rb_str_cat(arg->str, s, n);
}
}
@ -150,7 +150,7 @@ w_symbol(id, arg)
else {
w_byte(TYPE_SYMBOL, arg);
w_bytes(sym, strlen(sym), arg);
st_insert(arg->symbol, id, arg->symbol->num_entries);
st_add_direct(arg->symbol, id, arg->symbol->num_entries);
}
}
@ -165,7 +165,7 @@ w_unique(s, arg)
static void w_object _((VALUE,struct dump_arg*,int));
static int
hash_each(key, value, arg)
rb_hash_each(key, value, arg)
VALUE key, value;
struct dump_call_arg *arg;
{
@ -175,7 +175,7 @@ hash_each(key, value, arg)
}
static int
obj_each(id, value, arg)
rb_obj_each(id, value, arg)
ID id;
VALUE value;
struct dump_call_arg *arg;
@ -205,15 +205,15 @@ w_object(obj, arg, limit)
struct dump_call_arg c_arg;
if (limit == 0) {
Fail("exceed depth limit");
rb_raise(rb_eRuntimeError, "exceed depth limit");
}
if (obj == Qnil) {
w_byte(TYPE_NIL, arg);
}
else if (obj == TRUE) {
else if (obj == Qtrue) {
w_byte(TYPE_TRUE, arg);
}
else if (obj == FALSE) {
else if (obj == Qfalse) {
w_byte(TYPE_FALSE, arg);
}
else if (FIXNUM_P(obj)) {
@ -226,7 +226,7 @@ w_object(obj, arg, limit)
w_long(FIX2LONG(obj), arg);
}
else {
w_object(int2big(FIX2LONG(obj)), arg, limit);
w_object(rb_int2big(FIX2LONG(obj)), arg, limit);
return;
}
#endif
@ -244,7 +244,7 @@ w_object(obj, arg, limit)
return;
}
st_insert(arg->data, obj, arg->data->num_entries);
st_add_direct(arg->data, obj, arg->data->num_entries);
if (rb_respond_to(obj, s_dump)) {
VALUE v;
@ -252,7 +252,7 @@ w_object(obj, arg, limit)
w_unique(rb_class2name(CLASS_OF(obj)), arg);
v = rb_funcall(obj, s_dump, 1, limit);
if (TYPE(v) != T_STRING) {
TypeError("_dump_to must return String");
rb_raise(rb_eTypeError, "_dump_to must return String");
}
w_bytes(RSTRING(v)->ptr, RSTRING(v)->len, arg);
return;
@ -290,20 +290,20 @@ w_object(obj, arg, limit)
return;
case T_STRING:
w_uclass(obj, cString, arg);
w_uclass(obj, rb_cString, arg);
w_byte(TYPE_STRING, arg);
w_bytes(RSTRING(obj)->ptr, RSTRING(obj)->len, arg);
return;
case T_REGEXP:
w_uclass(obj, cRegexp, arg);
w_uclass(obj, rb_cRegexp, arg);
w_byte(TYPE_REGEXP, arg);
w_bytes(RREGEXP(obj)->str, RREGEXP(obj)->len, arg);
w_byte(reg_options(obj), arg);
w_byte(rb_reg_options(obj), arg);
return;
case T_ARRAY:
w_uclass(obj, cArray, arg);
w_uclass(obj, rb_cArray, arg);
w_byte(TYPE_ARRAY, arg);
{
int len = RARRAY(obj)->len;
@ -318,10 +318,10 @@ w_object(obj, arg, limit)
break;
case T_HASH:
w_uclass(obj, cHash, arg);
w_uclass(obj, rb_cHash, arg);
w_byte(TYPE_HASH, arg);
w_long(RHASH(obj)->tbl->num_entries, arg);
st_foreach(RHASH(obj)->tbl, hash_each, &c_arg);
st_foreach(RHASH(obj)->tbl, rb_hash_each, &c_arg);
break;
case T_STRUCT:
@ -336,7 +336,7 @@ w_object(obj, arg, limit)
w_long(len, arg);
mem = rb_ivar_get(CLASS_OF(obj), rb_intern("__member__"));
if (mem == Qnil) {
Fatal("non-initialized struct");
rb_raise(rb_eTypeError, "non-initialized struct");
}
for (i=0; i<len; i++) {
w_symbol(FIX2LONG(RARRAY(mem)->ptr[i]), arg);
@ -352,13 +352,13 @@ w_object(obj, arg, limit)
char *path;
if (FL_TEST(klass, FL_SINGLETON)) {
TypeError("singleton can't be dumped");
rb_raise(rb_eTypeError, "singleton can't be dumped");
}
path = rb_class2name(klass);
w_unique(path, arg);
if (ROBJECT(obj)->iv_tbl) {
w_long(ROBJECT(obj)->iv_tbl->num_entries, arg);
st_foreach(ROBJECT(obj)->iv_tbl, obj_each, &c_arg);
st_foreach(ROBJECT(obj)->iv_tbl, rb_obj_each, &c_arg);
}
else {
w_long(0, arg);
@ -367,7 +367,8 @@ w_object(obj, arg, limit)
break;
default:
TypeError("can't dump %s", rb_class2name(CLASS_OF(obj)));
rb_raise(rb_eTypeError, "can't dump %s",
rb_class2name(CLASS_OF(obj)));
break;
}
}
@ -411,21 +412,21 @@ marshal_dump(argc, argv)
else port = a1;
}
if (port) {
if (obj_is_kind_of(port, cIO)) {
if (rb_obj_is_kind_of(port, rb_cIO)) {
OpenFile *fptr;
io_binmode(port);
rb_io_binmode(port);
GetOpenFile(port, fptr);
io_writable(fptr);
rb_io_check_writable(fptr);
arg.fp = (fptr->f2) ? fptr->f2 : fptr->f;
}
else {
TypeError("instance of IO needed");
rb_raise(rb_eTypeError, "instance of IO needed");
}
}
else {
arg.fp = 0;
port = str_new(0, 0);
port = rb_str_new(0, 0);
arg.str = port;
}
@ -479,8 +480,8 @@ static void
long_toobig(size)
int size;
{
TypeError("long too big for this architecture (size %d, given %d)",
sizeof(long), size);
rb_raise(rb_eTypeError, "long too big for this architecture (size %d, given %d)",
sizeof(long), size);
}
static long
@ -554,7 +555,7 @@ r_symbol(arg)
if (st_lookup(arg->symbol, num, &id)) {
return id;
}
TypeError("bad symbol");
rb_raise(rb_eTypeError, "bad symbol");
}
r_bytes(buf, arg);
id = rb_intern(buf);
@ -578,7 +579,7 @@ r_string(arg)
int len;
r_bytes2(buf, len, arg);
return str_taint(str_new(buf, len));
return rb_str_taint(rb_str_new(buf, len));
}
static VALUE
@ -602,14 +603,14 @@ r_object(arg)
switch (type) {
case EOF:
eof_error();
rb_eof_error();
return Qnil;
case TYPE_LINK:
if (st_lookup(arg->data, r_long(arg), &v)) {
return v;
}
ArgError("dump format error (unlinked)");
rb_raise(rb_eArgError, "dump format error (unlinked)");
break;
case TYPE_UCLASS:
@ -617,7 +618,7 @@ r_object(arg)
VALUE c = rb_path2class(r_unique(arg));
v = r_object(arg);
if (rb_special_const_p(v)) {
ArgError("dump format error (user class)");
rb_raise(rb_eArgError, "dump format error (user class)");
}
RBASIC(v)->klass = c;
return v;
@ -627,10 +628,10 @@ r_object(arg)
return Qnil;
case TYPE_TRUE:
return TRUE;
return Qtrue;
case TYPE_FALSE:
return FALSE;
return Qfalse;
case TYPE_FIXNUM:
{
@ -646,7 +647,7 @@ r_object(arg)
char *buf;
r_bytes(buf, arg);
v = float_new(atof(buf));
v = rb_float_new(atof(buf));
return r_regist(v, arg);
}
@ -656,14 +657,14 @@ r_object(arg)
unsigned short *digits;
NEWOBJ(big, struct RBignum);
OBJSETUP(big, cBignum, T_BIGNUM);
OBJSETUP(big, rb_cBignum, T_BIGNUM);
big->sign = (r_byte(arg) == '+');
big->len = len = r_long(arg);
big->digits = digits = ALLOC_N(unsigned short, len);
while (len--) {
*digits++ = r_short(arg);
}
big = RBIGNUM(big_norm((VALUE)big));
big = RBIGNUM(rb_big_norm((VALUE)big));
if (TYPE(big) == T_BIGNUM) {
r_regist((VALUE)big, arg);
}
@ -681,16 +682,16 @@ r_object(arg)
r_bytes2(buf, len, arg);
options = r_byte(arg);
return r_regist(reg_new(buf, len, options), arg);
return r_regist(rb_reg_new(buf, len, options), arg);
}
case TYPE_ARRAY:
{
volatile int len = r_long(arg);
v = ary_new2(len);
v = rb_ary_new2(len);
r_regist(v, arg);
while (len--) {
ary_push(v, r_object(arg));
rb_ary_push(v, r_object(arg));
}
return v;
}
@ -699,12 +700,12 @@ r_object(arg)
{
int len = r_long(arg);
v = hash_new();
v = rb_hash_new();
r_regist(v, arg);
while (len--) {
VALUE key = r_object(arg);
VALUE value = r_object(arg);
hash_aset(v, key, value);
rb_hash_aset(v, key, value);
}
return v;
}
@ -719,26 +720,26 @@ r_object(arg)
klass = rb_path2class(r_unique(arg));
mem = rb_ivar_get(klass, rb_intern("__member__"));
if (mem == Qnil) {
Fatal("non-initialized struct");
rb_raise(rb_eTypeError, "non-initialized struct");
}
len = r_long(arg);
values = ary_new2(len);
values = rb_ary_new2(len);
for (i=0; i<len; i++) {
ary_push(values, Qnil);
rb_ary_push(values, Qnil);
}
v = struct_alloc(klass, values);
v = rb_struct_alloc(klass, values);
r_regist(v, arg);
for (i=0; i<len; i++) {
slot = r_symbol(arg);
if (RARRAY(mem)->ptr[i] != INT2FIX(slot)) {
TypeError("struct %s not compatible (:%s for :%s)",
rb_class2name(klass),
rb_id2name(slot),
rb_id2name(FIX2INT(RARRAY(mem)->ptr[i])));
rb_raise(rb_eTypeError, "struct %s not compatible (:%s for :%s)",
rb_class2name(klass),
rb_id2name(slot),
rb_id2name(FIX2INT(RARRAY(mem)->ptr[i])));
}
struct_aset(v, INT2FIX(i), r_object(arg));
rb_struct_aset(v, INT2FIX(i), r_object(arg));
}
return v;
}
@ -753,8 +754,8 @@ r_object(arg)
v = rb_funcall(klass, s_load, 1, r_string(arg));
return r_regist(v, arg);
}
TypeError("class %s needs to have method `_load_from'",
rb_class2name(klass));
rb_raise(rb_eTypeError, "class %s needs to have method `_load_from'",
rb_class2name(klass));
}
break;
@ -765,7 +766,7 @@ r_object(arg)
klass = rb_path2class(r_unique(arg));
len = r_long(arg);
v = obj_alloc(klass);
v = rb_obj_alloc(klass);
r_regist(v, arg);
if (len > 0) {
while (len--) {
@ -786,7 +787,7 @@ r_object(arg)
}
default:
ArgError("dump format error(0x%x)", type);
rb_raise(rb_eArgError, "dump format error(0x%x)", type);
break;
}
}
@ -819,10 +820,10 @@ marshal_load(argc, argv)
struct load_arg arg;
rb_scan_args(argc, argv, "11", &port, &proc);
if (obj_is_kind_of(port, cIO)) {
io_binmode(port);
if (rb_obj_is_kind_of(port, rb_cIO)) {
rb_io_binmode(port);
GetOpenFile(port, fptr);
io_readable(fptr);
rb_io_check_readable(fptr);
arg.fp = fptr->f;
}
else if (rb_respond_to(port, rb_intern("to_str"))) {
@ -833,13 +834,13 @@ marshal_load(argc, argv)
arg.end = arg.ptr + RSTRING(port)->len;
}
else {
TypeError("instance of IO needed");
rb_raise(rb_eTypeError, "instance of IO needed");
}
major = r_byte(&arg);
if (major == MARSHAL_MAJOR) {
if (r_byte(&arg) != MARSHAL_MINOR) {
Warn("Old marshal file format (can be read)");
rb_warn("Old marshal file format (can be read)");
}
arg.symbol = st_init_numtable();
arg.data = st_init_numtable();
@ -848,7 +849,7 @@ marshal_load(argc, argv)
v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg);
}
else {
TypeError("Old marshal file format (can't read)");
rb_raise(rb_eTypeError, "Old marshal file format (can't read)");
}
return v;
@ -857,13 +858,13 @@ marshal_load(argc, argv)
void
Init_marshal()
{
VALUE mMarshal = rb_define_module("Marshal");
VALUE rb_mMarshal = rb_define_module("Marshal");
s_dump = rb_intern("_dump_to");
s_load = rb_intern("_load_from");
rb_define_module_function(mMarshal, "dump", marshal_dump, -1);
rb_define_module_function(mMarshal, "load", marshal_load, -1);
rb_define_module_function(mMarshal, "restore", marshal_load, 1);
rb_define_module_function(rb_mMarshal, "dump", marshal_dump, -1);
rb_define_module_function(rb_mMarshal, "load", marshal_load, -1);
rb_define_module_function(rb_mMarshal, "restore", marshal_load, 1);
rb_provide("marshal.o"); /* for backward compatibility */
}

54
math.c
View file

@ -13,7 +13,7 @@
#include "ruby.h"
#include <math.h>
VALUE mMath;
VALUE rb_mMath;
#define Need_Float(x) (x) = rb_Float(x)
#define Need_Float2(x,y) {\
@ -26,7 +26,7 @@ math_atan2(obj, x, y)
VALUE obj, x, y;
{
Need_Float2(x, y);
return float_new(atan2(RFLOAT(x)->value, RFLOAT(y)->value));
return rb_float_new(atan2(RFLOAT(x)->value, RFLOAT(y)->value));
}
static VALUE
@ -35,7 +35,7 @@ math_cos(obj, x)
{
Need_Float(x);
return float_new(cos(RFLOAT(x)->value));
return rb_float_new(cos(RFLOAT(x)->value));
}
static VALUE
@ -44,7 +44,7 @@ math_sin(obj, x)
{
Need_Float(x);
return float_new(sin(RFLOAT(x)->value));
return rb_float_new(sin(RFLOAT(x)->value));
}
static VALUE
@ -53,7 +53,7 @@ math_tan(obj, x)
{
Need_Float(x);
return float_new(tan(RFLOAT(x)->value));
return rb_float_new(tan(RFLOAT(x)->value));
}
static VALUE
@ -61,7 +61,7 @@ math_exp(obj, x)
VALUE obj, x;
{
Need_Float(x);
return float_new(exp(RFLOAT(x)->value));
return rb_float_new(exp(RFLOAT(x)->value));
}
static VALUE
@ -69,7 +69,7 @@ math_log(obj, x)
VALUE obj, x;
{
Need_Float(x);
return float_new(log(RFLOAT(x)->value));
return rb_float_new(log(RFLOAT(x)->value));
}
static VALUE
@ -77,7 +77,7 @@ math_log10(obj, x)
VALUE obj, x;
{
Need_Float(x);
return float_new(log10(RFLOAT(x)->value));
return rb_float_new(log10(RFLOAT(x)->value));
}
static VALUE
@ -86,8 +86,8 @@ math_sqrt(obj, x)
{
Need_Float(x);
if (RFLOAT(x)->value < 0.0) ArgError("square root for negative number");
return float_new(sqrt(RFLOAT(x)->value));
if (RFLOAT(x)->value < 0.0) rb_raise(rb_eArgError, "square root for negative number");
return rb_float_new(sqrt(RFLOAT(x)->value));
}
static VALUE
@ -100,7 +100,7 @@ math_frexp(obj, x)
Need_Float(x);
d = frexp(RFLOAT(x)->value, &exp);
return assoc_new(float_new(d), INT2NUM(exp));
return rb_assoc_new(rb_float_new(d), INT2NUM(exp));
}
static VALUE
@ -110,36 +110,36 @@ math_ldexp(obj, x, n)
double d;
Need_Float(x);
return float_new(d = ldexp(RFLOAT(x)->value, NUM2INT(n)));
return rb_float_new(d = ldexp(RFLOAT(x)->value, NUM2INT(n)));
}
void
Init_Math()
{
mMath = rb_define_module("Math");
rb_mMath = rb_define_module("Math");
#ifdef M_PI
rb_define_const(mMath, "PI", float_new(M_PI));
rb_define_const(rb_mMath, "PI", rb_float_new(M_PI));
#else
rb_define_const(mMath, "PI", float_new(atan(1.0)*4.0));
rb_define_const(rb_mMath, "PI", rb_float_new(atan(1.0)*4.0));
#endif
#ifdef M_E
rb_define_const(mMath, "E", float_new(M_E));
rb_define_const(rb_mMath, "E", rb_float_new(M_E));
#else
rb_define_const(mMath, "E", float_new(exp(1.0)));
rb_define_const(rb_mMath, "E", rb_float_new(exp(1.0)));
#endif
rb_define_module_function(mMath, "atan2", math_atan2, 2);
rb_define_module_function(mMath, "cos", math_cos, 1);
rb_define_module_function(mMath, "sin", math_sin, 1);
rb_define_module_function(mMath, "tan", math_tan, 1);
rb_define_module_function(rb_mMath, "atan2", math_atan2, 2);
rb_define_module_function(rb_mMath, "cos", math_cos, 1);
rb_define_module_function(rb_mMath, "sin", math_sin, 1);
rb_define_module_function(rb_mMath, "tan", math_tan, 1);
rb_define_module_function(mMath, "exp", math_exp, 1);
rb_define_module_function(mMath, "log", math_log, 1);
rb_define_module_function(mMath, "log10", math_log10, 1);
rb_define_module_function(mMath, "sqrt", math_sqrt, 1);
rb_define_module_function(rb_mMath, "exp", math_exp, 1);
rb_define_module_function(rb_mMath, "log", math_log, 1);
rb_define_module_function(rb_mMath, "log10", math_log10, 1);
rb_define_module_function(rb_mMath, "sqrt", math_sqrt, 1);
rb_define_module_function(mMath, "frexp", math_frexp, 1);
rb_define_module_function(mMath, "ldexp", math_ldexp, 2);
rb_define_module_function(rb_mMath, "frexp", math_frexp, 1);
rb_define_module_function(rb_mMath, "ldexp", math_ldexp, 2);
}

183
node.h
View file

@ -217,98 +217,98 @@ typedef struct RNode {
#define nd_tlev u3.cnt
#define nd_tval u2.value
#define NEW_METHOD(n,x) node_newnode(NODE_METHOD,x,n,0)
#define NEW_FBODY(n,i,o) node_newnode(NODE_FBODY,n,i,o)
#define NEW_DEFN(i,a,d,p) node_newnode(NODE_DEFN,p,i,NEW_RFUNC(a,d))
#define NEW_DEFS(r,i,a,d) node_newnode(NODE_DEFS,r,i,NEW_RFUNC(a,d))
#define NEW_CFUNC(f,c) node_newnode(NODE_CFUNC,f,c,0)
#define NEW_METHOD(n,x) rb_node_newnode(NODE_METHOD,x,n,0)
#define NEW_FBODY(n,i,o) rb_node_newnode(NODE_FBODY,n,i,o)
#define NEW_DEFN(i,a,d,p) rb_node_newnode(NODE_DEFN,p,i,NEW_RFUNC(a,d))
#define NEW_DEFS(r,i,a,d) rb_node_newnode(NODE_DEFS,r,i,NEW_RFUNC(a,d))
#define NEW_CFUNC(f,c) rb_node_newnode(NODE_CFUNC,f,c,0)
#define NEW_RFUNC(b1,b2) NEW_SCOPE(block_append(b1,b2))
#define NEW_SCOPE(b) node_newnode(NODE_SCOPE,local_tbl(),(b),cur_cref)
#define NEW_BLOCK(a) node_newnode(NODE_BLOCK,a,0,0)
#define NEW_IF(c,t,e) node_newnode(NODE_IF,c,t,e)
#define NEW_UNLESS(c,t,e) node_newnode(NODE_IF,c,e,t)
#define NEW_CASE(h,b) node_newnode(NODE_CASE,h,b,0)
#define NEW_WHEN(c,t,e) node_newnode(NODE_WHEN,c,t,e)
#define NEW_OPT_N(b) node_newnode(NODE_OPT_N,0,b,0)
#define NEW_WHILE(c,b,n) node_newnode(NODE_WHILE,c,b,n)
#define NEW_UNTIL(c,b,n) node_newnode(NODE_UNTIL,c,b,n)
#define NEW_FOR(v,i,b) node_newnode(NODE_FOR,v,b,i)
#define NEW_ITER(v,i,b) node_newnode(NODE_ITER,v,b,i)
#define NEW_BREAK() node_newnode(NODE_BREAK,0,0,0)
#define NEW_NEXT() node_newnode(NODE_NEXT,0,0,0)
#define NEW_REDO() node_newnode(NODE_REDO,0,0,0)
#define NEW_RETRY() node_newnode(NODE_RETRY,0,0,0)
#define NEW_BEGIN(b) node_newnode(NODE_BEGIN,0,b,0)
#define NEW_RESCUE(b,res) node_newnode(NODE_RESCUE,b,res,0)
#define NEW_RESBODY(a,ex,n) node_newnode(NODE_RESBODY,n,ex,a)
#define NEW_ENSURE(b,en) node_newnode(NODE_ENSURE,b,0,en)
#define NEW_RET(s) node_newnode(NODE_RETURN,s,0,0)
#define NEW_YIELD(a) node_newnode(NODE_YIELD,a,0,0)
#define NEW_SCOPE(b) rb_node_newnode(NODE_SCOPE,local_tbl(),(b),cur_cref)
#define NEW_BLOCK(a) rb_node_newnode(NODE_BLOCK,a,0,0)
#define NEW_IF(c,t,e) rb_node_newnode(NODE_IF,c,t,e)
#define NEW_UNLESS(c,t,e) rb_node_newnode(NODE_IF,c,e,t)
#define NEW_CASE(h,b) rb_node_newnode(NODE_CASE,h,b,0)
#define NEW_WHEN(c,t,e) rb_node_newnode(NODE_WHEN,c,t,e)
#define NEW_OPT_N(b) rb_node_newnode(NODE_OPT_N,0,b,0)
#define NEW_WHILE(c,b,n) rb_node_newnode(NODE_WHILE,c,b,n)
#define NEW_UNTIL(c,b,n) rb_node_newnode(NODE_UNTIL,c,b,n)
#define NEW_FOR(v,i,b) rb_node_newnode(NODE_FOR,v,b,i)
#define NEW_ITER(v,i,b) rb_node_newnode(NODE_ITER,v,b,i)
#define NEW_BREAK() rb_node_newnode(NODE_BREAK,0,0,0)
#define NEW_NEXT() rb_node_newnode(NODE_NEXT,0,0,0)
#define NEW_REDO() rb_node_newnode(NODE_REDO,0,0,0)
#define NEW_RETRY() rb_node_newnode(NODE_RETRY,0,0,0)
#define NEW_BEGIN(b) rb_node_newnode(NODE_BEGIN,0,b,0)
#define NEW_RESCUE(b,res) rb_node_newnode(NODE_RESCUE,b,res,0)
#define NEW_RESBODY(a,ex,n) rb_node_newnode(NODE_RESBODY,n,ex,a)
#define NEW_ENSURE(b,en) rb_node_newnode(NODE_ENSURE,b,0,en)
#define NEW_RET(s) rb_node_newnode(NODE_RETURN,s,0,0)
#define NEW_YIELD(a) rb_node_newnode(NODE_YIELD,a,0,0)
#define NEW_LIST(a) NEW_ARRAY(a)
#define NEW_ARRAY(a) node_newnode(NODE_ARRAY,a,1,0)
#define NEW_ZARRAY() node_newnode(NODE_ZARRAY,0,0,0)
#define NEW_HASH(a) node_newnode(NODE_HASH,a,0,0)
#define NEW_NOT(a) node_newnode(NODE_NOT,0,a,0)
#define NEW_MASGN(l,r) node_newnode(NODE_MASGN,l,0,r)
#define NEW_GASGN(v,val) node_newnode(NODE_GASGN,v,val,rb_global_entry(v))
#define NEW_LASGN(v,val) node_newnode(NODE_LASGN,v,val,local_cnt(v))
#define NEW_DASGN(v,val) node_newnode(NODE_DASGN,v,val,0);
#define NEW_DASGN_PUSH(v,val) node_newnode(NODE_DASGN_PUSH,v,val,0);
#define NEW_IASGN(v,val) node_newnode(NODE_IASGN,v,val,0)
#define NEW_CASGN(v,val) node_newnode(NODE_CASGN,v,val,0)
#define NEW_OP_ASGN1(p,id,a) node_newnode(NODE_OP_ASGN1,p,id,a)
#define NEW_OP_ASGN2(r,i,o,val) node_newnode(NODE_OP_ASGN2,r,val,NEW_OP_ASGN22(i,o))
#define NEW_OP_ASGN22(i,o) node_newnode(NODE_OP_ASGN2,i,o,id_attrset(i))
#define NEW_OP_ASGN_OR(i,val) node_newnode(NODE_OP_ASGN_OR,i,val,0)
#define NEW_OP_ASGN_AND(i,val) node_newnode(NODE_OP_ASGN_AND,i,val,0)
#define NEW_GVAR(v) node_newnode(NODE_GVAR,v,0,rb_global_entry(v))
#define NEW_LVAR(v) node_newnode(NODE_LVAR,v,0,local_cnt(v))
#define NEW_DVAR(v) node_newnode(NODE_DVAR,v,0,0);
#define NEW_IVAR(v) node_newnode(NODE_IVAR,v,0,0)
#define NEW_CVAR(v) node_newnode(NODE_CVAR,v,0,0)
#define NEW_NTH_REF(n) node_newnode(NODE_NTH_REF,0,n,local_cnt('~'))
#define NEW_BACK_REF(n) node_newnode(NODE_BACK_REF,0,n,local_cnt('~'))
#define NEW_MATCH(c) node_newnode(NODE_MATCH,c,0,0)
#define NEW_MATCH2(n1,n2) node_newnode(NODE_MATCH2,n1,n2,0)
#define NEW_MATCH3(r,n2) node_newnode(NODE_MATCH3,r,n2,0)
#define NEW_LIT(l) node_newnode(NODE_LIT,l,0,0)
#define NEW_STR(s) node_newnode(NODE_STR,s,0,0)
#define NEW_DSTR(s) node_newnode(NODE_DSTR,s,0,0)
#define NEW_XSTR(s) node_newnode(NODE_XSTR,s,0,0)
#define NEW_DXSTR(s) node_newnode(NODE_DXSTR,s,0,0)
#define NEW_EVSTR(s,l) node_newnode(NODE_EVSTR,str_new(s,l),0,0)
#define NEW_CALL(r,m,a) node_newnode(NODE_CALL,r,m,a)
#define NEW_FCALL(m,a) node_newnode(NODE_FCALL,0,m,a)
#define NEW_VCALL(m) node_newnode(NODE_VCALL,0,m,0)
#define NEW_SUPER(a) node_newnode(NODE_SUPER,0,0,a)
#define NEW_ZSUPER() node_newnode(NODE_ZSUPER,0,0,0)
#define NEW_ARGS(f,o,r) node_newnode(NODE_ARGS,o,r,f)
#define NEW_BLOCK_ARG(v) node_newnode(NODE_BLOCK_ARG,v,0,local_cnt(v))
#define NEW_BLOCK_PASS(b) node_newnode(NODE_BLOCK_PASS,0,b,0)
#define NEW_ALIAS(n,o) node_newnode(NODE_ALIAS,0,n,o)
#define NEW_VALIAS(n,o) node_newnode(NODE_VALIAS,0,n,o)
#define NEW_UNDEF(i) node_newnode(NODE_UNDEF,0,i,0)
#define NEW_CLASS(n,b,s) node_newnode(NODE_CLASS,n,NEW_CBODY(b),s)
#define NEW_SCLASS(r,b) node_newnode(NODE_SCLASS,r,NEW_CBODY(b),0)
#define NEW_MODULE(n,b) node_newnode(NODE_MODULE,n,NEW_CBODY(b),0)
#define NEW_COLON2(c,i) node_newnode(NODE_COLON2,c,i,0)
#define NEW_COLON3(i) node_newnode(NODE_COLON3,0,i,0)
#define NEW_CREF0() (cur_cref=node_newnode(NODE_CREF,RNODE(the_frame->cbase)->nd_clss,0,0))
#define NEW_CREF() (cur_cref=node_newnode(NODE_CREF,0,0,cur_cref))
#define NEW_ARRAY(a) rb_node_newnode(NODE_ARRAY,a,1,0)
#define NEW_ZARRAY() rb_node_newnode(NODE_ZARRAY,0,0,0)
#define NEW_HASH(a) rb_node_newnode(NODE_HASH,a,0,0)
#define NEW_NOT(a) rb_node_newnode(NODE_NOT,0,a,0)
#define NEW_MASGN(l,r) rb_node_newnode(NODE_MASGN,l,0,r)
#define NEW_GASGN(v,val) rb_node_newnode(NODE_GASGN,v,val,rb_global_entry(v))
#define NEW_LASGN(v,val) rb_node_newnode(NODE_LASGN,v,val,local_cnt(v))
#define NEW_DASGN(v,val) rb_node_newnode(NODE_DASGN,v,val,0);
#define NEW_DASGN_PUSH(v,val) rb_node_newnode(NODE_DASGN_PUSH,v,val,0);
#define NEW_IASGN(v,val) rb_node_newnode(NODE_IASGN,v,val,0)
#define NEW_CASGN(v,val) rb_node_newnode(NODE_CASGN,v,val,0)
#define NEW_OP_ASGN1(p,id,a) rb_node_newnode(NODE_OP_ASGN1,p,id,a)
#define NEW_OP_ASGN2(r,i,o,val) rb_node_newnode(NODE_OP_ASGN2,r,val,NEW_OP_ASGN22(i,o))
#define NEW_OP_ASGN22(i,o) rb_node_newnode(NODE_OP_ASGN2,i,o,rb_id_attrset(i))
#define NEW_OP_ASGN_OR(i,val) rb_node_newnode(NODE_OP_ASGN_OR,i,val,0)
#define NEW_OP_ASGN_AND(i,val) rb_node_newnode(NODE_OP_ASGN_AND,i,val,0)
#define NEW_GVAR(v) rb_node_newnode(NODE_GVAR,v,0,rb_global_entry(v))
#define NEW_LVAR(v) rb_node_newnode(NODE_LVAR,v,0,local_cnt(v))
#define NEW_DVAR(v) rb_node_newnode(NODE_DVAR,v,0,0);
#define NEW_IVAR(v) rb_node_newnode(NODE_IVAR,v,0,0)
#define NEW_CVAR(v) rb_node_newnode(NODE_CVAR,v,0,0)
#define NEW_NTH_REF(n) rb_node_newnode(NODE_NTH_REF,0,n,local_cnt('~'))
#define NEW_BACK_REF(n) rb_node_newnode(NODE_BACK_REF,0,n,local_cnt('~'))
#define NEW_MATCH(c) rb_node_newnode(NODE_MATCH,c,0,0)
#define NEW_MATCH2(n1,n2) rb_node_newnode(NODE_MATCH2,n1,n2,0)
#define NEW_MATCH3(r,n2) rb_node_newnode(NODE_MATCH3,r,n2,0)
#define NEW_LIT(l) rb_node_newnode(NODE_LIT,l,0,0)
#define NEW_STR(s) rb_node_newnode(NODE_STR,s,0,0)
#define NEW_DSTR(s) rb_node_newnode(NODE_DSTR,s,0,0)
#define NEW_XSTR(s) rb_node_newnode(NODE_XSTR,s,0,0)
#define NEW_DXSTR(s) rb_node_newnode(NODE_DXSTR,s,0,0)
#define NEW_EVSTR(s,l) rb_node_newnode(NODE_EVSTR,rb_str_new(s,l),0,0)
#define NEW_CALL(r,m,a) rb_node_newnode(NODE_CALL,r,m,a)
#define NEW_FCALL(m,a) rb_node_newnode(NODE_FCALL,0,m,a)
#define NEW_VCALL(m) rb_node_newnode(NODE_VCALL,0,m,0)
#define NEW_SUPER(a) rb_node_newnode(NODE_SUPER,0,0,a)
#define NEW_ZSUPER() rb_node_newnode(NODE_ZSUPER,0,0,0)
#define NEW_ARGS(f,o,r) rb_node_newnode(NODE_ARGS,o,r,f)
#define NEW_BLOCK_ARG(v) rb_node_newnode(NODE_BLOCK_ARG,v,0,local_cnt(v))
#define NEW_BLOCK_PASS(b) rb_node_newnode(NODE_BLOCK_PASS,0,b,0)
#define NEW_ALIAS(n,o) rb_node_newnode(NODE_ALIAS,0,n,o)
#define NEW_VALIAS(n,o) rb_node_newnode(NODE_VALIAS,0,n,o)
#define NEW_UNDEF(i) rb_node_newnode(NODE_UNDEF,0,i,0)
#define NEW_CLASS(n,b,s) rb_node_newnode(NODE_CLASS,n,NEW_CBODY(b),s)
#define NEW_SCLASS(r,b) rb_node_newnode(NODE_SCLASS,r,NEW_CBODY(b),0)
#define NEW_MODULE(n,b) rb_node_newnode(NODE_MODULE,n,NEW_CBODY(b),0)
#define NEW_COLON2(c,i) rb_node_newnode(NODE_COLON2,c,i,0)
#define NEW_COLON3(i) rb_node_newnode(NODE_COLON3,0,i,0)
#define NEW_CREF0() (cur_cref=rb_node_newnode(NODE_CREF,RNODE(ruby_frame->cbase)->nd_clss,0,0))
#define NEW_CREF() (cur_cref=rb_node_newnode(NODE_CREF,0,0,cur_cref))
#define NEW_CBODY(b) (cur_cref->nd_body=NEW_SCOPE(b),cur_cref)
#define NEW_DOT2(b,e) node_newnode(NODE_DOT2,b,e,0)
#define NEW_DOT3(b,e) node_newnode(NODE_DOT3,b,e,0)
#define NEW_ATTRSET(a) node_newnode(NODE_ATTRSET,a,0,0)
#define NEW_SELF() node_newnode(NODE_SELF,0,0,0)
#define NEW_NIL() node_newnode(NODE_NIL,0,0,0)
#define NEW_TRUE() node_newnode(NODE_TRUE,0,0,0)
#define NEW_FALSE() node_newnode(NODE_FALSE,0,0,0)
#define NEW_DEFINED(e) node_newnode(NODE_DEFINED,e,0,0)
#define NEW_NEWLINE(n) node_newnode(NODE_NEWLINE,0,0,n)
#define NEW_DOT2(b,e) rb_node_newnode(NODE_DOT2,b,e,0)
#define NEW_DOT3(b,e) rb_node_newnode(NODE_DOT3,b,e,0)
#define NEW_ATTRSET(a) rb_node_newnode(NODE_ATTRSET,a,0,0)
#define NEW_SELF() rb_node_newnode(NODE_SELF,0,0,0)
#define NEW_NIL() rb_node_newnode(NODE_NIL,0,0,0)
#define NEW_TRUE() rb_node_newnode(NODE_TRUE,0,0,0)
#define NEW_FALSE() rb_node_newnode(NODE_FALSE,0,0,0)
#define NEW_DEFINED(e) rb_node_newnode(NODE_DEFINED,e,0,0)
#define NEW_NEWLINE(n) rb_node_newnode(NODE_NEWLINE,0,0,n)
#define NEW_PREEXE(b) NEW_SCOPE(b)
#define NEW_POSTEXE() node_newnode(NODE_POSTEXE,0,0,0)
#define NEW_POSTEXE() rb_node_newnode(NODE_POSTEXE,0,0,0)
NODE *node_newnode();
NODE *rb_node_newnode();
VALUE rb_method_booundp();
#define NOEX_PUBLIC 0
@ -317,14 +317,11 @@ VALUE rb_method_booundp();
#define NOEX_PRIVATE 2
#define NOEX_PROTECTED 4
NODE *compile_string _((char *, char *, int));
NODE *compile_file _((char *, VALUE, int));
NODE *rb_compile_string _((char *, char *, int));
NODE *rb_compile_file _((char *, VALUE, int));
void rb_add_method _((VALUE, ID, NODE *, int));
NODE *node_newnode();
enum node_type nodetype _((NODE *));
int nodeline _((NODE *));
NODE *rb_node_newnode();
struct global_entry *rb_global_entry _((ID));
VALUE rb_gvar_get _((struct global_entry *));

602
numeric.c

File diff suppressed because it is too large Load diff

585
object.c

File diff suppressed because it is too large Load diff

144
pack.c
View file

@ -84,10 +84,10 @@ pack_add_ptr(str, add)
{
#define STR_NO_ORIG FL_USER3 /* copied from string.c */
if (!RSTRING(str)->orig) {
RSTRING(str)->orig = ary_new();
RSTRING(str)->orig = rb_ary_new();
FL_SET(str, STR_NO_ORIG);
}
ary_push(RSTRING(str)->orig, add);
rb_ary_push(RSTRING(str)->orig, add);
}
static VALUE
@ -106,12 +106,12 @@ pack_pack(ary, fmt)
p = str2cstr(fmt, &plen);
pend = p + plen;
res = str_new(0, 0);
res = rb_str_new(0, 0);
items = RARRAY(ary)->len;
idx = 0;
#define NEXTFROM (items-- > 0 ? RARRAY(ary)->ptr[idx++] : (ArgError(toofew),0))
#define NEXTFROM (items-- > 0 ? RARRAY(ary)->ptr[idx++] : (rb_raise(rb_eArgError, toofew),0))
while (p < pend) {
type = *p++; /* get data type */
@ -137,7 +137,7 @@ pack_pack(ary, fmt)
plen = 0;
}
else {
from = obj_as_string(from);
from = rb_obj_as_string(from);
ptr = RSTRING(from)->ptr;
plen = RSTRING(from)->len;
}
@ -149,15 +149,15 @@ pack_pack(ary, fmt)
case 'a':
case 'A':
if (plen >= len)
str_cat(res, ptr, len);
rb_str_cat(res, ptr, len);
else {
str_cat(res, ptr, plen);
rb_str_cat(res, ptr, plen);
len -= plen;
while (len >= 10) {
str_cat(res, (type == 'A')?spc10:nul10, 10);
rb_str_cat(res, (type == 'A')?spc10:nul10, 10);
len -= 10;
}
str_cat(res, (type == 'A')?spc10:nul10, len);
rb_str_cat(res, (type == 'A')?spc10:nul10, len);
}
break;
@ -173,7 +173,7 @@ pack_pack(ary, fmt)
byte >>= 1;
else {
char c = byte & 0xff;
str_cat(res, &c, 1);
rb_str_cat(res, &c, 1);
byte = 0;
}
}
@ -181,7 +181,7 @@ pack_pack(ary, fmt)
char c;
byte >>= 7 - (len & 7);
c = byte & 0xff;
str_cat(res, &c, 1);
rb_str_cat(res, &c, 1);
}
}
break;
@ -197,7 +197,7 @@ pack_pack(ary, fmt)
byte <<= 1;
else {
char c = byte & 0xff;
str_cat(res, &c, 1);
rb_str_cat(res, &c, 1);
byte = 0;
}
}
@ -205,7 +205,7 @@ pack_pack(ary, fmt)
char c;
byte <<= 7 - (len & 7);
c = byte & 0xff;
str_cat(res, &c, 1);
rb_str_cat(res, &c, 1);
}
}
break;
@ -225,14 +225,14 @@ pack_pack(ary, fmt)
byte >>= 4;
else {
char c = byte & 0xff;
str_cat(res, &c, 1);
rb_str_cat(res, &c, 1);
byte = 0;
}
}
}
if (len & 1) {
char c = byte & 0xff;
str_cat(res, &c, 1);
rb_str_cat(res, &c, 1);
}
}
break;
@ -252,14 +252,14 @@ pack_pack(ary, fmt)
byte <<= 4;
else {
char c = byte & 0xff;
str_cat(res, &c, 1);
rb_str_cat(res, &c, 1);
byte = 0;
}
}
}
if (len & 1) {
char c = byte & 0xff;
str_cat(res, &c, 1);
rb_str_cat(res, &c, 1);
}
}
break;
@ -276,7 +276,7 @@ pack_pack(ary, fmt)
else {
c = NUM2INT(from);
}
str_cat(res, &c, sizeof(char));
rb_str_cat(res, &c, sizeof(char));
}
break;
@ -290,7 +290,7 @@ pack_pack(ary, fmt)
else {
s = NUM2INT(from);
}
str_cat(res, (char*)&s, sizeof(short));
rb_str_cat(res, (char*)&s, sizeof(short));
}
break;
@ -304,7 +304,7 @@ pack_pack(ary, fmt)
else {
i = NUM2UINT(from);
}
str_cat(res, (char*)&i, sizeof(int));
rb_str_cat(res, (char*)&i, sizeof(int));
}
break;
@ -318,7 +318,7 @@ pack_pack(ary, fmt)
else {
l = NUM2ULONG(from);
}
str_cat(res, (char*)&l, sizeof(long));
rb_str_cat(res, (char*)&l, sizeof(long));
}
break;
@ -332,7 +332,7 @@ pack_pack(ary, fmt)
s = NUM2INT(from);
}
s = htons(s);
str_cat(res, (char*)&s, sizeof(short));
rb_str_cat(res, (char*)&s, sizeof(short));
}
break;
@ -346,7 +346,7 @@ pack_pack(ary, fmt)
l = NUM2ULONG(from);
}
l = htonl(l);
str_cat(res, (char*)&l, sizeof(long));
rb_str_cat(res, (char*)&l, sizeof(long));
}
break;
@ -360,7 +360,7 @@ pack_pack(ary, fmt)
s = NUM2INT(from);
}
s = htovs(s);
str_cat(res, (char*)&s, sizeof(short));
rb_str_cat(res, (char*)&s, sizeof(short));
}
break;
@ -374,7 +374,7 @@ pack_pack(ary, fmt)
l = NUM2ULONG(from);
}
l = htovl(l);
str_cat(res, (char*)&l, sizeof(long));
rb_str_cat(res, (char*)&l, sizeof(long));
}
break;
@ -394,7 +394,7 @@ pack_pack(ary, fmt)
f = (float)NUM2INT(from);
break;
}
str_cat(res, (char*)&f, sizeof(float));
rb_str_cat(res, (char*)&f, sizeof(float));
}
break;
@ -414,23 +414,23 @@ pack_pack(ary, fmt)
d = (double)NUM2INT(from);
break;
}
str_cat(res, (char*)&d, sizeof(double));
rb_str_cat(res, (char*)&d, sizeof(double));
}
break;
case 'x':
grow:
while (len >= 10) {
str_cat(res, nul10, 10);
rb_str_cat(res, nul10, 10);
len -= 10;
}
str_cat(res, nul10, len);
rb_str_cat(res, nul10, len);
break;
case 'X':
shrink:
if (RSTRING(res)->len < len)
ArgError("X outside of string");
rb_raise(rb_eArgError, "X outside of string");
RSTRING(res)->len -= len;
RSTRING(res)->ptr[RSTRING(res)->len] = '\0';
break;
@ -443,12 +443,12 @@ pack_pack(ary, fmt)
break;
case '%':
ArgError("% may only be used in unpack");
rb_raise(rb_eArgError, "% may only be used in unpack");
break;
case 'u':
case 'm':
from = obj_as_string(NEXTFROM);
from = rb_obj_as_string(NEXTFROM);
ptr = RSTRING(from)->ptr;
plen = RSTRING(from)->len;
@ -481,7 +481,7 @@ pack_pack(ary, fmt)
t = STR2CSTR(from);
pack_add_ptr(res, from);
}
str_cat(res, (char*)&t, sizeof(char*));
rb_str_cat(res, (char*)&t, sizeof(char*));
}
break;
@ -512,7 +512,7 @@ encodes(str, s, len, type)
if (type == 'u') {
*hunk = len + ' ';
str_cat(str, hunk, 1);
rb_str_cat(str, hunk, 1);
padding = '`';
}
else {
@ -523,7 +523,7 @@ encodes(str, s, len, type)
hunk[1] = trans[077 & (((*s << 4) & 060) | ((s[1] >> 4) & 017))];
hunk[2] = trans[077 & (((s[1] << 2) & 074) | ((s[2] >> 6) & 03))];
hunk[3] = trans[077 & s[2]];
str_cat(str, hunk, 4);
rb_str_cat(str, hunk, 4);
s += 3;
len -= 3;
}
@ -536,7 +536,7 @@ encodes(str, s, len, type)
pend[-2] = padding;
pend[-1] = padding;
}
str_cat(str, "\n", 1);
rb_str_cat(str, "\n", 1);
}
static VALUE
@ -555,7 +555,7 @@ pack_unpack(str, fmt)
p = str2cstr(fmt, &len);
pend = p + len;
ary = ary_new();
ary = rb_ary_new();
while (p < pend) {
type = *p++;
if (*p == '*') {
@ -571,7 +571,7 @@ pack_unpack(str, fmt)
switch (type) {
case '%':
ArgError("% is not supported(yet)");
rb_raise(rb_eArgError, "% is not supported(yet)");
break;
case 'A':
@ -585,14 +585,14 @@ pack_unpack(str, fmt)
t--;
len--;
}
ary_push(ary, str_new(s, len));
rb_ary_push(ary, rb_str_new(s, len));
s += end;
}
break;
case 'a':
if (len > send - s) len = send - s;
ary_push(ary, str_new(s, len));
rb_ary_push(ary, rb_str_new(s, len));
s += len;
break;
@ -605,7 +605,7 @@ pack_unpack(str, fmt)
if (p[-1] == '*' || len > (send - s) * 8)
len = (send - s) * 8;
bits = 0;
ary_push(ary, bitstr = str_new(0, len));
rb_ary_push(ary, bitstr = rb_str_new(0, len));
t = RSTRING(bitstr)->ptr;
for (i=0; i<len; i++) {
if (i & 7) bits >>= 1;
@ -624,7 +624,7 @@ pack_unpack(str, fmt)
if (p[-1] == '*' || len > (send - s) * 8)
len = (send - s) * 8;
bits = 0;
ary_push(ary, bitstr = str_new(0, len));
rb_ary_push(ary, bitstr = rb_str_new(0, len));
t = RSTRING(bitstr)->ptr;
for (i=0; i<len; i++) {
if (i & 7) bits <<= 1;
@ -643,7 +643,7 @@ pack_unpack(str, fmt)
if (p[-1] == '*' || len > (send - s) * 2)
len = (send - s) * 2;
bits = 0;
ary_push(ary, bitstr = str_new(0, len));
rb_ary_push(ary, bitstr = rb_str_new(0, len));
t = RSTRING(bitstr)->ptr;
for (i=0; i<len; i++) {
if (i & 1)
@ -664,7 +664,7 @@ pack_unpack(str, fmt)
if (p[-1] == '*' || len > (send - s) * 2)
len = (send - s) * 2;
bits = 0;
ary_push(ary, bitstr = str_new(0, len));
rb_ary_push(ary, bitstr = rb_str_new(0, len));
t = RSTRING(bitstr)->ptr;
for (i=0; i<len; i++) {
if (i & 1)
@ -682,7 +682,7 @@ pack_unpack(str, fmt)
while (len-- > 0) {
int c = *s++;
if (c > (char)127) c-=256;
ary_push(ary, INT2FIX(c));
rb_ary_push(ary, INT2FIX(c));
}
break;
@ -691,7 +691,7 @@ pack_unpack(str, fmt)
len = send - s;
while (len-- > 0) {
unsigned char c = *s++;
ary_push(ary, INT2FIX(c));
rb_ary_push(ary, INT2FIX(c));
}
break;
@ -702,7 +702,7 @@ pack_unpack(str, fmt)
short tmp;
memcpy(&tmp, s, sizeof(short));
s += sizeof(short);
ary_push(ary, INT2FIX(tmp));
rb_ary_push(ary, INT2FIX(tmp));
}
break;
@ -713,7 +713,7 @@ pack_unpack(str, fmt)
unsigned short tmp;
memcpy(&tmp, s, sizeof(short));
s += sizeof(short);
ary_push(ary, INT2FIX(tmp));
rb_ary_push(ary, INT2FIX(tmp));
}
break;
@ -724,7 +724,7 @@ pack_unpack(str, fmt)
int tmp;
memcpy(&tmp, s, sizeof(int));
s += sizeof(int);
ary_push(ary, int2inum(tmp));
rb_ary_push(ary, rb_int2inum(tmp));
}
break;
@ -735,7 +735,7 @@ pack_unpack(str, fmt)
unsigned int tmp;
memcpy(&tmp, s, sizeof(int));
s += sizeof(int);
ary_push(ary, uint2inum(tmp));
rb_ary_push(ary, rb_uint2inum(tmp));
}
break;
@ -746,7 +746,7 @@ pack_unpack(str, fmt)
long tmp;
memcpy(&tmp, s, sizeof(long));
s += sizeof(long);
ary_push(ary, int2inum(tmp));
rb_ary_push(ary, rb_int2inum(tmp));
}
break;
@ -757,7 +757,7 @@ pack_unpack(str, fmt)
unsigned long tmp;
memcpy(&tmp, s, sizeof(long));
s += sizeof(long);
ary_push(ary, uint2inum(tmp));
rb_ary_push(ary, rb_uint2inum(tmp));
}
break;
@ -769,7 +769,7 @@ pack_unpack(str, fmt)
memcpy(&tmp, s, sizeof(short));
s += sizeof(short);
tmp = ntohs(tmp);
ary_push(ary, uint2inum(tmp));
rb_ary_push(ary, rb_uint2inum(tmp));
}
break;
@ -781,7 +781,7 @@ pack_unpack(str, fmt)
memcpy(&tmp, s, sizeof(long));
s += sizeof(long);
tmp = ntohl(tmp);
ary_push(ary, uint2inum(tmp));
rb_ary_push(ary, rb_uint2inum(tmp));
}
break;
@ -793,7 +793,7 @@ pack_unpack(str, fmt)
memcpy(&tmp, s, sizeof(short));
s += sizeof(short);
tmp = vtohs(tmp);
ary_push(ary, uint2inum(tmp));
rb_ary_push(ary, rb_uint2inum(tmp));
}
break;
@ -805,7 +805,7 @@ pack_unpack(str, fmt)
memcpy(&tmp, s, sizeof(long));
s += sizeof(long);
tmp = vtohl(tmp);
ary_push(ary, uint2inum(tmp));
rb_ary_push(ary, rb_uint2inum(tmp));
}
break;
@ -817,7 +817,7 @@ pack_unpack(str, fmt)
float tmp;
memcpy(&tmp, s, sizeof(float));
s += sizeof(float);
ary_push(ary, float_new((double)tmp));
rb_ary_push(ary, rb_float_new((double)tmp));
}
break;
@ -829,13 +829,13 @@ pack_unpack(str, fmt)
double tmp;
memcpy(&tmp, s, sizeof(double));
s += sizeof(double);
ary_push(ary, float_new(tmp));
rb_ary_push(ary, rb_float_new(tmp));
}
break;
case 'u':
{
VALUE str = str_new(0, (send - s)*3/4);
VALUE str = rb_str_new(0, (send - s)*3/4);
char *ptr = RSTRING(str)->ptr;
int total = 0;
@ -883,13 +883,13 @@ pack_unpack(str, fmt)
s += 2; /* possible checksum byte */
}
RSTRING(str)->len = total;
ary_push(ary, str);
rb_ary_push(ary, str);
}
break;
case 'm':
{
VALUE str = str_new(0, (send - s)*3/4);
VALUE str = rb_str_new(0, (send - s)*3/4);
char *ptr = RSTRING(str)->ptr;
int a,b,c,d;
static int first = 1;
@ -925,7 +925,7 @@ pack_unpack(str, fmt)
*ptr++ = b << 4 | c >> 2;
}
RSTRING(str)->len = ptr - RSTRING(str)->ptr;
ary_push(ary, str);
rb_ary_push(ary, str);
}
break;
@ -935,25 +935,25 @@ pack_unpack(str, fmt)
case 'X':
if (len > s - RSTRING(str)->ptr)
ArgError("X outside of string");
rb_raise(rb_eArgError, "X outside of string");
s -= len;
break;
case 'x':
if (len > send - s)
ArgError("x outside of string");
rb_raise(rb_eArgError, "x outside of string");
s += len;
break;
case 'P':
if (sizeof(char *) <= send - s) {
char *t;
VALUE str = str_new(0, 0);
VALUE str = rb_str_new(0, 0);
memcpy(&t, s, sizeof(char *));
s += sizeof(char *);
if (t)
str_cat(str, t, len);
ary_push(ary, str);
rb_str_cat(str, t, len);
rb_ary_push(ary, str);
}
break;
@ -965,12 +965,12 @@ pack_unpack(str, fmt)
break;
else {
char *t;
VALUE str = str_new(0, 0);
VALUE str = rb_str_new(0, 0);
memcpy(&t, s, sizeof(char *));
s += sizeof(char *);
if (t)
str_cat(str, t, strlen(t));
ary_push(ary, str);
rb_str_cat(str, t, strlen(t));
rb_ary_push(ary, str);
}
}
break;
@ -986,6 +986,6 @@ pack_unpack(str, fmt)
void
Init_pack()
{
rb_define_method(cArray, "pack", pack_pack, 1);
rb_define_method(cString, "unpack", pack_unpack, 1);
rb_define_method(rb_cArray, "pack", pack_pack, 1);
rb_define_method(rb_cString, "unpack", pack_unpack, 1);
}

449
parse.y

File diff suppressed because it is too large Load diff

172
process.c
View file

@ -30,7 +30,7 @@ struct timeval {
#endif /* NT */
#include <ctype.h>
struct timeval time_timeval _((VALUE));
struct timeval rb_time_timeval _((VALUE));
#ifdef HAVE_SYS_WAIT_H
# include <sys/wait.h>
@ -64,7 +64,7 @@ get_ppid()
#endif
}
VALUE last_status = Qnil;
VALUE rb_last_status = Qnil;
#if !defined(HAVE_WAITPID) && !defined(HAVE_WAIT4)
#define NO_WAITPID
@ -81,7 +81,7 @@ rb_waitpid(pid, flags, st)
#ifndef NO_WAITPID
#if defined(THREAD)
int oflags = flags;
if (!thread_alone()) { /* there're other threads to run */
if (!rb_thread_alone()) { /* there're other threads to run */
flags |= WNOHANG;
}
#endif
@ -95,7 +95,7 @@ rb_waitpid(pid, flags, st)
if (result < 0) {
if (errno == EINTR) {
#ifdef THREAD
thread_schedule();
rb_thread_schedule();
#endif
goto retry;
}
@ -104,20 +104,20 @@ rb_waitpid(pid, flags, st)
#ifdef THREAD
if (result == 0) {
if (oflags & WNOHANG) return 0;
thread_schedule();
if (thread_alone()) flags = oflags;
rb_thread_schedule();
if (rb_thread_alone()) flags = oflags;
goto retry;
}
#endif
#else /* NO_WAITPID */
if (pid_tbl && st_lookup(pid_tbl, pid, st)) {
last_status = INT2FIX(*st);
rb_last_status = INT2FIX(*st);
st_delete(pid_tbl, &pid, NULL);
return pid;
}
if (flags) {
ArgError("Can't do waitpid with flags");
rb_raise(rb_eArgError, "Can't do waitpid with flags");
}
for (;;) {
@ -125,7 +125,7 @@ rb_waitpid(pid, flags, st)
if (result < 0) {
if (errno == EINTR) {
#ifdef THREAD
thread_schedule();
rb_thread_schedule();
#endif
continue;
}
@ -138,11 +138,11 @@ rb_waitpid(pid, flags, st)
pid_tbl = st_init_numtable();
st_insert(pid_tbl, pid, st);
#ifdef THREAD
if (!thread_alone()) thread_schedule();
if (!thread_alone()) rb_thread_schedule();
#endif
}
#endif
last_status = INT2FIX(*st);
rb_last_status = INT2FIX(*st);
return result;
}
@ -166,7 +166,7 @@ wait_each(key, value, data)
#endif
static VALUE
f_wait()
rb_f_wait()
{
int pid, state;
#ifdef NO_WAITPID
@ -175,20 +175,20 @@ f_wait()
data.status = -1;
st_foreach(pid_tbl, wait_each, &data);
if (data.status != -1) {
last_status = data.status;
rb_last_status = data.status;
return INT2FIX(data.pid);
}
while ((pid = wait(&state)) < 0) {
if (errno == EINTR) {
#ifdef THREAD
thread_schedule();
rb_thread_schedule();
#endif
continue;
}
rb_sys_fail(0);
}
last_status = INT2FIX(state);
rb_last_status = INT2FIX(state);
#else
if ((pid = rb_waitpid(-1, 0, &state)) < 0)
rb_sys_fail(0);
@ -197,7 +197,7 @@ f_wait()
}
static VALUE
f_waitpid(obj, vpid, vflags)
rb_f_waitpid(obj, vpid, vflags)
VALUE obj, vpid, vflags;
{
int pid, flags, status;
@ -247,8 +247,8 @@ security(str)
{
if (rb_safe_level() > 0) {
#ifndef USE_CWGUSI
if (env_path_tainted()) {
Raise(eSecurityError, "Insecure PATH - %s", str);
if (rb_env_path_tainted()) {
rb_raise(rb_eSecurityError, "Insecure PATH - %s", str);
}
#endif
}
@ -496,7 +496,7 @@ proc_spawn(sv)
#endif /* __human68k__ */
static VALUE
f_exec(argc, argv)
rb_f_exec(argc, argv)
int argc;
VALUE *argv;
{
@ -505,7 +505,7 @@ f_exec(argc, argv)
if (TYPE(argv[0]) == T_ARRAY) {
if (RARRAY(argv[0])->len != 2) {
ArgError("wrong first argument");
rb_raise(rb_eArgError, "wrong first argument");
}
prog = RARRAY(argv[0])->ptr[0];
argv[0] = RARRAY(argv[0])->ptr[1];
@ -513,7 +513,7 @@ f_exec(argc, argv)
if (TYPE(argv[0]) == T_ARRAY) {
if (RARRAY(argv[0])->len != 2) {
ArgError("wrong first argument");
rb_raise(rb_eArgError, "wrong first argument");
}
prog = RARRAY(argv[0])->ptr[0];
argv[0] = RARRAY(argv[0])->ptr[1];
@ -534,7 +534,7 @@ f_exec(argc, argv)
}
static VALUE
f_fork(obj)
rb_f_fork(obj)
VALUE obj;
{
#if !defined(__human68k__)
@ -546,7 +546,7 @@ f_fork(obj)
#ifdef linux
after_exec();
#endif
if (iterator_p()) {
if (rb_iterator_p()) {
rb_yield(Qnil);
_exit(0);
}
@ -565,7 +565,7 @@ f_fork(obj)
}
static VALUE
f_exit_bang(obj, status)
rb_f_exit_bang(obj, status)
VALUE obj, status;
{
int code = -1;
@ -614,7 +614,7 @@ rb_syswait(pid)
}
static VALUE
f_system(argc, argv)
rb_f_system(argc, argv)
int argc;
VALUE *argv;
{
@ -624,18 +624,18 @@ f_system(argc, argv)
if (TYPE(argv[0]) == T_ARRAY) {
if (RARRAY(argv[0])->len != 2) {
ArgError("wrong first argument");
rb_raise(rb_eArgError, "wrong first argument");
}
argv[0] = RARRAY(argv[0])->ptr[0];
}
cmd = ary_join(ary_new4(argc, argv), str_new2(" "));
cmd = rb_ary_join(ary_new4(argc, argv), rb_str_new2(" "));
Check_SafeStr(cmd);
state = do_spawn(RSTRING(cmd)->ptr);
last_status = INT2FIX(state);
rb_last_status = INT2FIX(state);
if (state == 0) return TRUE;
return FALSE;
if (state == 0) return Qtrue;
return Qfalse;
#else
#if defined(DJGPP)
VALUE cmd;
@ -643,18 +643,18 @@ f_system(argc, argv)
if (TYPE(argv[0]) == T_ARRAY) {
if (RARRAY(argv[0])->len != 2) {
ArgError("wrong first argument");
rb_raise(rb_eArgError, "wrong first argument");
}
argv[0] = RARRAY(argv[0])->ptr[0];
}
cmd = ary_join(ary_new4(argc, argv), str_new2(" "));
cmd = rb_ary_join(ary_new4(argc, argv), rb_str_new2(" "));
Check_SafeStr(cmd);
state = system(RSTRING(cmd)->ptr);
last_status = INT2FIX(state);
rb_last_status = INT2FIX(state);
if (state == 0) return TRUE;
return FALSE;
if (state == 0) return Qtrue;
return Qfalse;
#else
#if defined(__human68k__)
VALUE prog = 0;
@ -665,13 +665,13 @@ f_system(argc, argv)
fflush(stdout);
fflush(stderr);
if (argc == 0) {
last_status = INT2FIX(0);
rb_last_status = INT2FIX(0);
return INT2FIX(0);
}
if (TYPE(argv[0]) == T_ARRAY) {
if (RARRAY(argv[0])->len != 2) {
ArgError("wrong first argument");
rb_raise(rb_eArgError, "wrong first argument");
}
prog = RARRAY(argv[0])->ptr[0];
argv[0] = RARRAY(argv[0])->ptr[1];
@ -683,8 +683,8 @@ f_system(argc, argv)
else {
state = proc_spawn_n(argc, argv, prog);
}
last_status = state == -1 ? INT2FIX(127) : INT2FIX(state);
return state == 0 ? TRUE : FALSE ;
rb_last_status = state == -1 ? INT2FIX(127) : INT2FIX(state);
return state == 0 ? Qtrue : Qfalse ;
#else
volatile VALUE prog = 0;
int pid;
@ -693,13 +693,13 @@ f_system(argc, argv)
fflush(stdout);
fflush(stderr);
if (argc == 0) {
last_status = INT2FIX(0);
rb_last_status = INT2FIX(0);
return INT2FIX(0);
}
if (TYPE(argv[0]) == T_ARRAY) {
if (RARRAY(argv[0])->len != 2) {
ArgError("wrong first argument");
rb_raise(rb_eArgError, "wrong first argument");
}
prog = RARRAY(argv[0])->ptr[0];
argv[0] = RARRAY(argv[0])->ptr[1];
@ -726,7 +726,7 @@ f_system(argc, argv)
case -1:
if (errno == EAGAIN) {
#ifdef THREAD
thread_sleep(1);
rb_thread_sleep(1);
#else
sleep(1);
#endif
@ -739,15 +739,15 @@ f_system(argc, argv)
rb_syswait(pid);
}
if (last_status == INT2FIX(0)) return TRUE;
return FALSE;
if (rb_last_status == INT2FIX(0)) return Qtrue;
return Qfalse;
#endif
#endif
#endif
}
static VALUE
f_sleep(argc, argv)
rb_f_sleep(argc, argv)
int argc;
VALUE *argv;
{
@ -756,10 +756,10 @@ f_sleep(argc, argv)
beg = time(0);
#ifdef THREAD
if (argc == 0) {
thread_sleep_forever();
rb_thread_sleep_forever();
}
else if (argc == 1) {
thread_wait_for(time_timeval(argv[0]));
rb_thread_wait_for(rb_time_timeval(argv[0]));
}
#else
if (argc == 0) {
@ -771,7 +771,7 @@ f_sleep(argc, argv)
struct timeval tv;
int n;
tv = time_timeval(argv[0]);
tv = rb_time_timeval(argv[0]);
TRAP_BEG;
n = select(0, 0, 0, 0, &tv);
TRAP_END;
@ -779,7 +779,7 @@ f_sleep(argc, argv)
}
#endif
else {
ArgError("wrong # of arguments");
rb_raise(rb_eArgError, "wrong # of arguments");
}
end = time(0) - beg;
@ -1022,9 +1022,7 @@ proc_setegid(obj, egid)
return egid;
}
VALUE mProcess;
extern VALUE f_kill();
VALUE rb_mProcess;
void
Init_process()
@ -1032,74 +1030,74 @@ Init_process()
#ifndef USE_CWGUSI
rb_define_virtual_variable("$$", get_pid, 0);
#endif
rb_define_readonly_variable("$?", &last_status);
rb_define_readonly_variable("$?", &rb_last_status);
#ifndef USE_CWGUSI
rb_define_global_function("exec", f_exec, -1);
rb_define_global_function("exec", rb_f_exec, -1);
#endif
#if !defined(NT) && !defined(USE_CWGUSI)
rb_define_global_function("fork", f_fork, 0);
rb_define_global_function("fork", rb_f_fork, 0);
#endif
rb_define_global_function("exit!", f_exit_bang, 1);
rb_define_global_function("exit!", rb_f_exit_bang, 1);
#ifndef USE_CWGUSI
rb_define_global_function("system", f_system, -1);
rb_define_global_function("system", rb_f_system, -1);
#endif
rb_define_global_function("sleep", f_sleep, -1);
rb_define_global_function("sleep", rb_f_sleep, -1);
mProcess = rb_define_module("Process");
rb_mProcess = rb_define_module("Process");
#if !defined(NT) && !defined(DJGPP)
#ifdef WNOHANG
rb_define_const(mProcess, "WNOHANG", INT2FIX(WNOHANG));
rb_define_const(rb_mProcess, "WNOHANG", INT2FIX(WNOHANG));
#else
rb_define_const(mProcess, "WNOHANG", INT2FIX(0));
rb_define_const(rb_mProcess, "WNOHANG", INT2FIX(0));
#endif
#ifdef WUNTRACED
rb_define_const(mProcess, "WUNTRACED", INT2FIX(WUNTRACED));
rb_define_const(rb_mProcess, "WUNTRACED", INT2FIX(WUNTRACED));
#else
rb_define_const(mProcess, "WUNTRACED", INT2FIX(0));
rb_define_const(rb_mProcess, "WUNTRACED", INT2FIX(0));
#endif
#endif
#if !defined(NT) && !defined(USE_CWGUSI)
rb_define_singleton_method(mProcess, "fork", f_fork, 0);
rb_define_singleton_method(rb_mProcess, "fork", rb_f_fork, 0);
#endif
rb_define_singleton_method(mProcess, "exit!", f_exit_bang, 1);
rb_define_singleton_method(rb_mProcess, "exit!", rb_f_exit_bang, 1);
#ifndef USE_CWGUSI
rb_define_module_function(mProcess, "kill", f_kill, -1);
rb_define_module_function(rb_mProcess, "kill", rb_f_kill, -1);
#endif
#ifndef NT
rb_define_module_function(mProcess, "wait", f_wait, 0);
rb_define_module_function(mProcess, "waitpid", f_waitpid, 2);
rb_define_module_function(rb_mProcess, "wait", rb_f_wait, 0);
rb_define_module_function(rb_mProcess, "waitpid", rb_f_waitpid, 2);
#ifndef USE_CWGUSI
rb_define_module_function(mProcess, "pid", get_pid, 0);
rb_define_module_function(mProcess, "ppid", get_ppid, 0);
rb_define_module_function(rb_mProcess, "pid", get_pid, 0);
rb_define_module_function(rb_mProcess, "ppid", get_ppid, 0);
#endif /* ifndef USE_CWGUSI */
#endif /* ifndef NT */
#if !defined(NT) && !defined(DJGPP) && !defined(__human68k__) && !defined(USE_CWGUSI)
rb_define_module_function(mProcess, "getpgrp", proc_getpgrp, -1);
rb_define_module_function(mProcess, "setpgrp", proc_setpgrp, -1);
rb_define_module_function(mProcess, "setpgid", proc_setpgid, 2);
rb_define_module_function(rb_mProcess, "getpgrp", proc_getpgrp, -1);
rb_define_module_function(rb_mProcess, "setpgrp", proc_setpgrp, -1);
rb_define_module_function(rb_mProcess, "setpgid", proc_setpgid, 2);
rb_define_module_function(mProcess, "setsid", proc_setsid, 0);
rb_define_module_function(rb_mProcess, "setsid", proc_setsid, 0);
rb_define_module_function(mProcess, "getpriority", proc_getpriority, 2);
rb_define_module_function(mProcess, "setpriority", proc_setpriority, 3);
rb_define_module_function(rb_mProcess, "getpriority", proc_getpriority, 2);
rb_define_module_function(rb_mProcess, "setpriority", proc_setpriority, 3);
#ifdef PRIO_PROCESS
rb_define_const(mProcess, "PRIO_PROCESS", INT2FIX(PRIO_PROCESS));
rb_define_const(mProcess, "PRIO_PGRP", INT2FIX(PRIO_PGRP));
rb_define_const(mProcess, "PRIO_USER", INT2FIX(PRIO_USER));
rb_define_const(rb_mProcess, "PRIO_PROCESS", INT2FIX(PRIO_PROCESS));
rb_define_const(rb_mProcess, "PRIO_PGRP", INT2FIX(PRIO_PGRP));
rb_define_const(rb_mProcess, "PRIO_USER", INT2FIX(PRIO_USER));
#endif
rb_define_module_function(mProcess, "uid", proc_getuid, 0);
rb_define_module_function(mProcess, "uid=", proc_setuid, 1);
rb_define_module_function(mProcess, "gid", proc_getgid, 0);
rb_define_module_function(mProcess, "gid=", proc_setgid, 1);
rb_define_module_function(mProcess, "euid", proc_geteuid, 0);
rb_define_module_function(mProcess, "euid=", proc_seteuid, 1);
rb_define_module_function(mProcess, "egid", proc_getegid, 0);
rb_define_module_function(mProcess, "egid=", proc_setegid, 1);
rb_define_module_function(rb_mProcess, "uid", proc_getuid, 0);
rb_define_module_function(rb_mProcess, "uid=", proc_setuid, 1);
rb_define_module_function(rb_mProcess, "gid", proc_getgid, 0);
rb_define_module_function(rb_mProcess, "gid=", proc_setgid, 1);
rb_define_module_function(rb_mProcess, "euid", proc_geteuid, 0);
rb_define_module_function(rb_mProcess, "euid=", proc_seteuid, 1);
rb_define_module_function(rb_mProcess, "egid", proc_getegid, 0);
rb_define_module_function(rb_mProcess, "egid=", proc_setegid, 1);
#endif
}

View file

@ -79,7 +79,7 @@ static char state[256];
#endif
static VALUE
f_srand(argc, argv, obj)
rb_f_srand(argc, argv, obj)
int argc;
VALUE *argv;
VALUE obj;
@ -112,38 +112,38 @@ f_srand(argc, argv, obj)
old = saved_seed;
saved_seed = seed;
return int2inum(old);
return rb_int2inum(old);
}
static VALUE
f_rand(obj, vmax)
rb_f_rand(obj, vmax)
VALUE obj, vmax;
{
long val, max;
switch (TYPE(vmax)) {
case T_BIGNUM:
return big_rand(vmax);
return rb_big_rand(vmax);
case T_FLOAT:
if (RFLOAT(vmax)->value > LONG_MAX || RFLOAT(vmax)->value < LONG_MIN)
return big_rand(dbl2big(RFLOAT(vmax)->value));
return rb_big_rand(rb_dbl2big(RFLOAT(vmax)->value));
break;
}
max = NUM2LONG(vmax);
if (max == 0) {
return float_new(RANDOM_NUMBER);
return rb_float_new(RANDOM_NUMBER);
}
val = max*RANDOM_NUMBER;
if (val < 0) val = -val;
return int2inum(val);
return rb_int2inum(val);
}
void
Init_Random()
{
rb_define_global_function("srand", f_srand, -1);
rb_define_global_function("rand", f_rand, 1);
rb_define_global_function("srand", rb_f_srand, -1);
rb_define_global_function("rand", rb_f_rand, 1);
}

68
range.c
View file

@ -12,7 +12,7 @@
#include "ruby.h"
static VALUE cRange;
VALUE rb_cRange;
static ID id_upto, id_cmp;
static ID id_beg, id_end;
@ -27,7 +27,7 @@ range_check(args)
static VALUE
range_failed()
{
ArgError("bad value for range");
rb_raise(rb_eArgError, "bad value for range");
}
static VALUE
@ -40,20 +40,20 @@ range_s_new(klass, first, last)
args[0] = first; args[1] = last;
rb_rescue(range_check, (VALUE)args, range_failed, 0);
obj = obj_alloc(klass);
obj = rb_obj_alloc(klass);
rb_ivar_set(obj, id_beg, first);
rb_ivar_set(obj, id_end, last);
obj_call_init(obj);
rb_obj_call_init(obj);
return obj;
}
VALUE
range_new(first, last)
rb_range_new(first, last)
VALUE first, last;
{
return range_s_new(cRange, first, last);
return range_s_new(rb_cRange, first, last);
}
static VALUE
@ -67,16 +67,16 @@ range_eqq(rng, obj)
if (FIXNUM_P(first) && FIXNUM_P(obj) && FIXNUM_P(last)) {
if (FIX2INT(first) <= FIX2INT(obj) && FIX2INT(obj) <= FIX2INT(last)) {
return TRUE;
return Qtrue;
}
return FALSE;
return Qfalse;
}
else {
if (RTEST(rb_funcall(first, rb_intern("<="), 1, obj)) &&
RTEST(rb_funcall(last, rb_intern(">="), 1, obj))) {
return TRUE;
return Qtrue;
}
return FALSE;
return Qfalse;
}
}
@ -102,7 +102,7 @@ range_each(obj)
e = rb_ivar_get(obj, id_end);
if (FIXNUM_P(b)) { /* fixnum is a special case(for performance) */
num_upto(b, e);
rb_fix_upto(b, e);
}
else {
struct upto_data data;
@ -137,17 +137,17 @@ range_last(obj)
}
VALUE
range_beg_end(range, begp, endp)
rb_range_beg_end(range, begp, endp)
VALUE range;
int *begp, *endp;
{
VALUE first, last;
if (!obj_is_kind_of(range, cRange)) return FALSE;
if (!rb_obj_is_kind_of(range, rb_cRange)) return Qfalse;
first = rb_ivar_get(range, id_beg); *begp = NUM2INT(first);
last = rb_ivar_get(range, id_end); *endp = NUM2INT(last);
return TRUE;
return Qtrue;
}
static VALUE
@ -156,10 +156,10 @@ range_to_s(range)
{
VALUE str, str2;
str = obj_as_string(rb_ivar_get(range, id_beg));
str2 = obj_as_string(rb_ivar_get(range, id_end));
str_cat(str, "..", 2);
str_cat(str, RSTRING(str2)->ptr, RSTRING(str2)->len);
str = rb_obj_as_string(rb_ivar_get(range, id_beg));
str2 = rb_obj_as_string(rb_ivar_get(range, id_end));
rb_str_cat(str, "..", 2);
rb_str_cat(str, RSTRING(str2)->ptr, RSTRING(str2)->len);
return str;
}
@ -172,14 +172,12 @@ range_inspect(range)
str = rb_inspect(rb_ivar_get(range, id_beg));
str2 = rb_inspect(rb_ivar_get(range, id_end));
str_cat(str, "..", 2);
str_cat(str, RSTRING(str2)->ptr, RSTRING(str2)->len);
rb_str_cat(str, "..", 2);
rb_str_cat(str, RSTRING(str2)->ptr, RSTRING(str2)->len);
return str;
}
VALUE enum_length();
static VALUE
range_length(rng)
VALUE rng;
@ -193,8 +191,8 @@ range_length(rng)
if (RTEST(rb_funcall(first, '>', 1, last))) {
return INT2FIX(0);
}
if (!obj_is_kind_of(first, cNumeric)) {
return enum_length(rng);
if (!rb_obj_is_kind_of(first, rb_cNumeric)) {
return rb_enum_length(rng);
}
size = rb_funcall(last, '-', 1, first);
size = rb_funcall(size, '+', 1, INT2FIX(1));
@ -205,18 +203,18 @@ range_length(rng)
void
Init_Range()
{
cRange = rb_define_class("Range", cObject);
rb_include_module(cRange, mEnumerable);
rb_define_singleton_method(cRange, "new", range_s_new, 2);
rb_define_method(cRange, "===", range_eqq, 1);
rb_define_method(cRange, "each", range_each, 0);
rb_define_method(cRange, "first", range_first, 0);
rb_define_method(cRange, "last", range_last, 0);
rb_define_method(cRange, "to_s", range_to_s, 0);
rb_define_method(cRange, "inspect", range_inspect, 0);
rb_cRange = rb_define_class("Range", rb_cObject);
rb_include_module(rb_cRange, rb_mEnumerable);
rb_define_singleton_method(rb_cRange, "new", range_s_new, 2);
rb_define_method(rb_cRange, "===", range_eqq, 1);
rb_define_method(rb_cRange, "each", range_each, 0);
rb_define_method(rb_cRange, "first", range_first, 0);
rb_define_method(rb_cRange, "last", range_last, 0);
rb_define_method(rb_cRange, "to_s", range_to_s, 0);
rb_define_method(rb_cRange, "inspect", range_inspect, 0);
rb_define_method(cRange, "length", range_length, 0);
rb_define_method(cRange, "size", range_length, 0);
rb_define_method(rb_cRange, "length", range_length, 0);
rb_define_method(rb_cRange, "size", range_length, 0);
id_upto = rb_intern("upto");
id_cmp = rb_intern("<=>");

396
re.c
View file

@ -13,7 +13,7 @@
#include "ruby.h"
#include "re.h"
static VALUE eRegxpError;
static VALUE rb_eRegxpError;
#define BEG(no) regs->beg[no]
#define END(no) regs->end[no]
@ -72,7 +72,7 @@ static char casetable[] = {
#define MIN(a,b) (((a)>(b))?(b):(a))
int
str_cicmp(str1, str2)
rb_str_cicmp(str1, str2)
VALUE str1, str2;
{
int len, i;
@ -134,13 +134,17 @@ kcode_none(reg)
FL_SET(reg, KCODE_FIXED);
}
static int curr_kcode;
static void
kcode_set_option(reg)
VALUE reg;
{
if (!FL_TEST(reg, KCODE_FIXED)) return;
switch ((RBASIC(reg)->flags & KCODE_MASK)) {
curr_kcode = RBASIC(reg)->flags & KCODE_MASK;
if (reg_kcode == curr_kcode) return;
switch (curr_kcode) {
case KCODE_NONE:
re_mbcinit(MBCTYPE_ASCII);
break;
@ -153,9 +157,10 @@ kcode_set_option(reg)
}
}
void
static void
kcode_reset_option()
{
if (reg_kcode == curr_kcode) return;
switch (reg_kcode) {
case KCODE_NONE:
re_mbcinit(MBCTYPE_ASCII);
@ -172,7 +177,7 @@ kcode_reset_option()
extern int rb_in_compile;
static void
reg_expr_str(str, s, len)
rb_reg_expr_str(str, s, len)
VALUE str;
char *s;
int len;
@ -189,18 +194,18 @@ reg_expr_str(str, s, len)
p++;
}
if (!slash) {
str_cat(str, s, len);
rb_str_cat(str, s, len);
}
else {
p = s;
while (p<pend) {
if (*p == '/') {
char c = '\\';
str_cat(str, &c, 1);
str_cat(str, p, 1);
rb_str_cat(str, &c, 1);
rb_str_cat(str, p, 1);
}
else {
str_cat(str, p, 1);
rb_str_cat(str, p, 1);
}
p++;
}
@ -208,27 +213,27 @@ reg_expr_str(str, s, len)
}
static VALUE
reg_desc(s, len, re)
rb_reg_desc(s, len, re)
char *s;
int len;
VALUE re;
{
VALUE str = str_new2("/");
reg_expr_str(str, s, len);
str_cat(str, "/", 1);
VALUE str = rb_str_new2("/");
rb_reg_expr_str(str, s, len);
rb_str_cat(str, "/", 1);
if (re) {
if (FL_TEST(re,REG_IGNORECASE))
str_cat(str, "i", 1);
if (FL_TEST(re,KCODE_FIXED)) {
if (FL_TEST(re, REG_IGNORECASE))
rb_str_cat(str, "i", 1);
if (FL_TEST(re, KCODE_FIXED)) {
switch ((RBASIC(re)->flags & KCODE_MASK)) {
case KCODE_NONE:
str_cat(str, "n", 1);
rb_str_cat(str, "n", 1);
break;
case KCODE_EUC:
str_cat(str, "e", 1);
rb_str_cat(str, "e", 1);
break;
case KCODE_SJIS:
str_cat(str, "s", 1);
rb_str_cat(str, "s", 1);
break;
}
}
@ -237,47 +242,47 @@ reg_desc(s, len, re)
}
static VALUE
reg_source(re)
rb_reg_source(re)
VALUE re;
{
VALUE str = str_new(0,0);
reg_expr_str(str, RREGEXP(re)->str, RREGEXP(re)->len);
VALUE str = rb_str_new(0,0);
rb_reg_expr_str(str, RREGEXP(re)->str,RREGEXP(re)->len);
return str;
}
static VALUE
reg_inspect(re)
rb_reg_inspect(re)
VALUE re;
{
return reg_desc(RREGEXP(re)->str, RREGEXP(re)->len, re);
return rb_reg_desc(RREGEXP(re)->str, RREGEXP(re)->len, re);
}
static void
reg_raise(s, len, err, re)
rb_reg_raise(s, len, err, re)
char *s;
int len;
char *err;
VALUE re;
{
VALUE desc = reg_desc(s, len, re);
VALUE desc = rb_reg_desc(s, len, re);
if (rb_in_compile)
Error("%s: %s", err, RSTRING(desc)->ptr);
rb_compile_error("%s: %s", err, RSTRING(desc)->ptr);
else
Raise(eRegxpError, "%s: %s", err, RSTRING(desc)->ptr);
rb_raise(rb_eRegxpError, "%s: %s", err, RSTRING(desc)->ptr);
}
static VALUE
reg_casefold_p(re)
rb_reg_casefold_p(re)
VALUE re;
{
if (FL_TEST(re, REG_IGNORECASE)) return TRUE;
return FALSE;
if (FL_TEST(re, REG_IGNORECASE)) return Qtrue;
return Qfalse;
}
static VALUE
reg_kcode_method(re)
rb_reg_kcode_method(re)
VALUE re;
{
char *kcode = "$KCODE";
@ -295,7 +300,7 @@ reg_kcode_method(re)
}
}
return str_new2(kcode);
return rb_str_new2(kcode);
}
static Regexp*
@ -322,21 +327,20 @@ make_regexp(s, len, flag)
rp->options = flag;
}
err = re_compile_pattern(s, (size_t)len, rp);
kcode_reset_option();
if (err != NULL) {
reg_raise(s, len, err, 0);
rb_reg_raise(s, len, err, 0);
}
return rp;
}
static VALUE cMatch;
static VALUE rb_cMatch;
static VALUE
match_alloc()
{
NEWOBJ(match, struct RMatch);
OBJSETUP(match, cMatch, T_MATCH);
OBJSETUP(match, rb_cMatch, T_MATCH);
match->str = 0;
match->regs = 0;
@ -351,7 +355,7 @@ match_clone(orig)
VALUE orig;
{
NEWOBJ(match, struct RMatch);
OBJSETUP(match, cMatch, T_MATCH);
OBJSETUP(match, rb_cMatch, T_MATCH);
match->str = RMATCH(orig)->str;
match->regs = 0;
@ -359,35 +363,33 @@ match_clone(orig)
match->regs = ALLOC(struct re_registers);
match->regs->allocated = 0;
re_copy_registers(match->regs, RMATCH(orig)->regs);
CLONESETUP(match, orig);
return (VALUE)match;
}
VALUE ignorecase;
static int ignorecase;
static int may_need_recompile;
static VALUE matchcache;
void
reg_prepare_re(reg)
static void
rb_reg_prepare_re(reg)
VALUE reg;
{
int casefold = RTEST(ignorecase);
int need_recompile = 0;
/* case-flag set for the object */
if (FL_TEST(reg, REG_IGNORECASE)) {
casefold = TRUE;
}
else if ((casefold && !FL_TEST(reg, REG_CASESTATE)) ||
(!casefold && FL_TEST(reg, REG_CASESTATE))) {
RREGEXP(reg)->ptr->fastmap_accurate = 0;
RBASIC(reg)->flags ^= REG_CASESTATE;
need_recompile = 1;
/* case-flag not set for the object */
if (!FL_TEST(reg, REG_IGNORECASE)) {
int state = FL_TEST(reg, REG_CASESTATE);
if ((ignorecase || state) && !(ignorecase && state)) {
RBASIC(reg)->flags ^= REG_CASESTATE;
need_recompile = 1;
}
}
if (FL_TEST(reg, KCODE_FIXED)) {
kcode_set_option(reg);
}
else if ((RBASIC(reg)->flags & KCODE_MASK) != reg_kcode) {
if (!FL_TEST(reg, KCODE_FIXED) &&
(RBASIC(reg)->flags & KCODE_MASK) != reg_kcode) {
need_recompile = 1;
RBASIC(reg)->flags &= ~KCODE_MASK;
RBASIC(reg)->flags |= reg_kcode;
@ -396,34 +398,50 @@ reg_prepare_re(reg)
if (need_recompile) {
char *err;
if (FL_TEST(reg, KCODE_FIXED))
kcode_set_option(reg);
RREGEXP(reg)->ptr->fastmap_accurate = 0;
err = re_compile_pattern(RREGEXP(reg)->str, RREGEXP(reg)->len, RREGEXP(reg)->ptr);
if (err != NULL) {
kcode_reset_option();
reg_raise(RREGEXP(reg)->str, RREGEXP(reg)->len, err, reg);
rb_reg_raise(RREGEXP(reg)->str, RREGEXP(reg)->len, err, reg);
}
}
}
int
reg_search(reg, str, start, reverse)
rb_reg_search(reg, str, start, reverse)
VALUE reg, str;
int start, reverse;
{
int result;
VALUE match = 0;
VALUE match;
struct re_registers *regs = 0;
int range;
if (start > RSTRING(str)->len) return -1;
reg_prepare_re(reg);
if (may_need_recompile)
rb_reg_prepare_re(reg);
if (matchcache) {
match = matchcache;
matchcache = 0;
if (FL_TEST(reg, KCODE_FIXED))
kcode_set_option(reg);
else if (reg_kcode != curr_kcode)
kcode_reset_option();
if (rb_thread_scope_shared_p()) {
match = Qnil;
}
else {
match = match_alloc();
match = rb_backref_get();
}
if (NIL_P(match)) {
if (matchcache) {
match = matchcache;
matchcache = 0;
}
else {
match = match_alloc();
}
}
regs = RMATCH(match)->regs;
@ -431,43 +449,42 @@ reg_search(reg, str, start, reverse)
range = -start;
}
else {
range = RSTRING(str)->len-start;
range = RSTRING(str)->len - start;
}
result = re_search(RREGEXP(reg)->ptr,RSTRING(str)->ptr,RSTRING(str)->len,
start, range, regs);
kcode_reset_option();
if (result == -2) {
reg_raise(RREGEXP(reg)->str, RREGEXP(reg)->len,
rb_reg_raise(RREGEXP(reg)->str, RREGEXP(reg)->len,
"Stack overfow in regexp matcher", reg);
}
if (result < 0) {
matchcache = match;
backref_set(Qnil);
rb_backref_set(Qnil);
}
else if (match) {
RMATCH(match)->str = str_new4(str);
backref_set(match);
else {
RMATCH(match)->str = rb_str_new4(str);
rb_backref_set(match);
}
return result;
}
VALUE
reg_nth_defined(nth, match)
rb_reg_nth_defined(nth, match)
int nth;
VALUE match;
{
if (NIL_P(match)) return Qnil;
if (nth >= RMATCH(match)->regs->num_regs) {
return FALSE;
return Qfalse;
}
if (RMATCH(match)->BEG(nth) == -1) return FALSE;
return TRUE;
if (RMATCH(match)->BEG(nth) == -1) return Qfalse;
return Qtrue;
}
VALUE
reg_nth_match(nth, match)
rb_reg_nth_match(nth, match)
int nth;
VALUE match;
{
@ -481,37 +498,37 @@ reg_nth_match(nth, match)
if (start == -1) return Qnil;
end = RMATCH(match)->END(nth);
len = end - start;
return str_new(RSTRING(RMATCH(match)->str)->ptr + start, len);
return rb_str_new(RSTRING(RMATCH(match)->str)->ptr + start, len);
}
VALUE
reg_last_match(match)
rb_reg_last_match(match)
VALUE match;
{
return reg_nth_match(0, match);
return rb_reg_nth_match(0, match);
}
VALUE
reg_match_pre(match)
rb_reg_match_pre(match)
VALUE match;
{
if (NIL_P(match)) return Qnil;
if (RMATCH(match)->BEG(0) == -1) return Qnil;
return str_new(RSTRING(RMATCH(match)->str)->ptr, RMATCH(match)->BEG(0));
return rb_str_new(RSTRING(RMATCH(match)->str)->ptr, RMATCH(match)->BEG(0));
}
VALUE
reg_match_post(match)
rb_reg_match_post(match)
VALUE match;
{
if (NIL_P(match)) return Qnil;
if (RMATCH(match)->BEG(0) == -1) return Qnil;
return str_new(RSTRING(RMATCH(match)->str)->ptr+RMATCH(match)->END(0),
return rb_str_new(RSTRING(RMATCH(match)->str)->ptr+RMATCH(match)->END(0),
RSTRING(RMATCH(match)->str)->len-RMATCH(match)->END(0));
}
VALUE
reg_match_last(match)
rb_reg_match_last(match)
VALUE match;
{
int i;
@ -522,31 +539,31 @@ reg_match_last(match)
for (i=RMATCH(match)->regs->num_regs-1; RMATCH(match)->BEG(i) == -1 && i > 0; i--)
;
if (i == 0) return Qnil;
return reg_nth_match(i, match);
return rb_reg_nth_match(i, match);
}
static VALUE
last_match_getter()
{
return reg_last_match(backref_get());
return rb_reg_last_match(rb_backref_get());
}
static VALUE
prematch_getter()
{
return reg_match_pre(backref_get());
return rb_reg_match_pre(rb_backref_get());
}
static VALUE
postmatch_getter()
{
return reg_match_post(backref_get());
return rb_reg_match_post(rb_backref_get());
}
static VALUE
last_paren_match_getter()
{
return reg_match_last(backref_get());
return rb_reg_match_last(rb_backref_get());
}
static VALUE
@ -554,13 +571,13 @@ match_to_a(match)
VALUE match;
{
struct re_registers *regs = RMATCH(match)->regs;
VALUE ary = ary_new2(regs->num_regs);
VALUE ary = rb_ary_new2(regs->num_regs);
char *ptr = RSTRING(RMATCH(match)->str)->ptr;
int i;
for (i=0; i<regs->num_regs; i++) {
if (regs->beg[i] == -1) ary_push(ary, Qnil);
else ary_push(ary, str_new(ptr+regs->beg[i],
if (regs->beg[i] == -1) rb_ary_push(ary, Qnil);
else rb_ary_push(ary, rb_str_new(ptr+regs->beg[i],
regs->end[i]-regs->beg[i]));
}
return ary;
@ -580,7 +597,7 @@ match_aref(argc, argv, match)
rb_scan_args(argc, argv, "11", &idx, &rest);
if (!NIL_P(rest) || !FIXNUM_P(idx) || FIX2INT(idx) < 0) {
return ary_aref(argc, argv, match_to_a(match));
return rb_ary_aref(argc, argv, match_to_a(match));
}
regs = RMATCH(match)->regs;
@ -589,23 +606,23 @@ match_aref(argc, argv, match)
if (i>=regs->num_regs) return Qnil;
ptr = RSTRING(RMATCH(match)->str)->ptr;
return str_new(ptr+regs->beg[i], regs->end[i]-regs->beg[i]);
return rb_str_new(ptr+regs->beg[i], regs->end[i]-regs->beg[i]);
}
static VALUE
match_to_s(match)
VALUE match;
{
VALUE str = reg_last_match(match);
VALUE str = rb_reg_last_match(match);
if (NIL_P(str)) return str_new(0,0);
if (NIL_P(str)) return rb_str_new(0,0);
return str;
}
VALUE cRegexp;
VALUE rb_cRegexp;
static VALUE
reg_new_1(klass, s, len, options)
rb_reg_new_1(klass, s, len, options)
VALUE klass;
char *s;
int len;
@ -639,8 +656,10 @@ reg_new_1(klass, s, len, options)
break;
}
kcode_set_option((VALUE)re);
if (RTEST(ignorecase)) {
if (options & ~0x3) {
kcode_set_option((VALUE)re);
}
if (ignorecase) {
options |= RE_OPTION_IGNORECASE;
FL_SET(re, REG_CASESTATE);
}
@ -652,39 +671,41 @@ reg_new_1(klass, s, len, options)
if (options & ~0x3) {
kcode_reset_option();
}
obj_call_init((VALUE)re);
rb_obj_call_init((VALUE)re);
return (VALUE)re;
}
VALUE
reg_new(s, len, options)
rb_reg_new(s, len, options)
char *s;
int len, options;
{
return reg_new_1(cRegexp, s, len, options);
return rb_reg_new_1(rb_cRegexp, s, len, options);
}
static int ign_cache;
static int case_cache;
static int kcode_cache;
static VALUE reg_cache;
VALUE
reg_regcomp(str)
rb_reg_regcomp(str)
VALUE str;
{
int ignc = RTEST(ignorecase);
if (reg_cache && RREGEXP(reg_cache)->len == RSTRING(str)->len
&& ign_cache == ignc
&& case_cache == ignorecase
&& kcode_cache == reg_kcode
&& memcmp(RREGEXP(reg_cache)->str, RSTRING(str)->ptr, RSTRING(str)->len) == 0)
return reg_cache;
ign_cache = ignc;
return reg_cache = reg_new(RSTRING(str)->ptr, RSTRING(str)->len, ignc);
case_cache = ignorecase;
kcode_cache = reg_kcode;
return reg_cache = rb_reg_new(RSTRING(str)->ptr, RSTRING(str)->len,
ignorecase);
}
static int
reg_cur_kcode(re)
rb_reg_cur_kcode(re)
VALUE re;
{
if (FL_TEST(re, KCODE_FIXED)) {
@ -694,58 +715,58 @@ reg_cur_kcode(re)
}
static VALUE
reg_equal(re1, re2)
rb_reg_equal(re1, re2)
VALUE re1, re2;
{
int min;
if (re1 == re2) return TRUE;
if (TYPE(re2) != T_REGEXP) return FALSE;
if (RREGEXP(re1)->len != RREGEXP(re2)->len) return FALSE;
if (re1 == re2) return Qtrue;
if (TYPE(re2) != T_REGEXP) return Qfalse;
if (RREGEXP(re1)->len != RREGEXP(re2)->len) return Qfalse;
min = RREGEXP(re1)->len;
if (min > RREGEXP(re2)->len) min = RREGEXP(re2)->len;
if (memcmp(RREGEXP(re1)->str, RREGEXP(re2)->str, min) == 0 &&
reg_cur_kcode(re1) == reg_cur_kcode(re2) &&
rb_reg_cur_kcode(re1) == rb_reg_cur_kcode(re2) &&
!(FL_TEST(re1,REG_IGNORECASE) ^ FL_TEST(re2,REG_IGNORECASE))) {
return TRUE;
return Qtrue;
}
return FALSE;
return Qfalse;
}
VALUE
reg_match(re, str)
rb_reg_match(re, str)
VALUE re, str;
{
int start;
if (NIL_P(str)) return FALSE;
str = str_to_str(str);
start = reg_search(re, str, 0, 0);
if (NIL_P(str)) return Qfalse;
str = rb_str_to_str(str);
start = rb_reg_search(re, str, 0, 0);
if (start < 0) {
return FALSE;
return Qfalse;
}
return INT2FIX(start);
}
VALUE
reg_match2(re)
rb_reg_match2(re)
VALUE re;
{
int start;
VALUE line = lastline_get();
VALUE line = rb_lastline_get();
if (TYPE(line) != T_STRING)
return FALSE;
return Qfalse;
start = reg_search(re, line, 0, 0);
start = rb_reg_search(re, line, 0, 0);
if (start < 0) {
return FALSE;
return Qfalse;
}
return INT2FIX(start);
}
static VALUE
reg_s_new(argc, argv, self)
rb_reg_s_new(argc, argv, self)
int argc;
VALUE *argv;
VALUE self;
@ -754,7 +775,7 @@ reg_s_new(argc, argv, self)
int flag = 0;
if (argc == 0 || argc > 3) {
ArgError("wrong # of argument");
rb_raise(rb_eArgError, "wrong # of argument");
}
if (argc >= 2 && RTEST(argv[1])) {
flag = RE_OPTION_IGNORECASE;
@ -779,19 +800,19 @@ reg_s_new(argc, argv, self)
src = argv[0];
if (TYPE(src) == T_REGEXP) {
return reg_new_1(self, RREGEXP(src)->str, RREGEXP(src)->len, flag);
return rb_reg_new_1(self, RREGEXP(src)->str, RREGEXP(src)->len, flag);
}
else {
char *p;
int len;
p = str2cstr(src, &len);
return reg_new_1(self, p, len, flag);
return rb_reg_new_1(self, p, len, flag);
}
}
static VALUE
reg_s_quote(re, str)
rb_reg_s_quote(re, str)
VALUE re, str;
{
char *s, *send, *t;
@ -821,11 +842,11 @@ reg_s_quote(re, str)
*t++ = *s;
}
return str_new(tmp, t - tmp);
return rb_str_new(tmp, t - tmp);
}
static int
reg_get_kcode(re)
rb_reg_get_kcode(re)
VALUE re;
{
int kcode = 0;
@ -845,7 +866,7 @@ reg_get_kcode(re)
}
int
reg_options(re)
rb_reg_options(re)
VALUE re;
{
int options = 0;
@ -853,21 +874,25 @@ reg_options(re)
if (FL_TEST(re, REG_IGNORECASE))
options |= RE_OPTION_IGNORECASE;
if (FL_TEST(re, KCODE_FIXED)) {
options |= reg_get_kcode(re);
options |= rb_reg_get_kcode(re);
}
return options;
}
static VALUE
reg_clone(re)
VALUE re;
rb_reg_clone(orig)
VALUE orig;
{
return reg_new_1(CLASS_OF(re), RREGEXP(re)->str, RREGEXP(re)->len,
reg_options(re));
VALUE reg;
reg = rb_reg_new_1(CLASS_OF(orig), RREGEXP(orig)->str, RREGEXP(orig)->len,
rb_reg_options(orig));
CLONESETUP(reg, orig);
return reg;
}
VALUE
reg_regsub(str, src, regs)
rb_reg_regsub(str, src, regs)
VALUE str, src;
struct re_registers *regs;
{
@ -888,8 +913,8 @@ reg_regsub(str, src, regs)
}
if (c != '\\' || s == e) continue;
if (!val) val = str_new(p, ss-p);
else str_cat(val, p, ss-p);
if (!val) val = rb_str_new(p, ss-p);
else rb_str_cat(val, p, ss-p);
c = *s++;
p = s;
@ -903,11 +928,11 @@ reg_regsub(str, src, regs)
break;
case '`':
str_cat(val, RSTRING(src)->ptr, BEG(0));
rb_str_cat(val, RSTRING(src)->ptr, BEG(0));
continue;
case '\'':
str_cat(val, RSTRING(src)->ptr+END(0), RSTRING(src)->len-END(0));
rb_str_cat(val, RSTRING(src)->ptr+END(0), RSTRING(src)->len-END(0));
continue;
case '+':
@ -917,23 +942,23 @@ reg_regsub(str, src, regs)
break;
case '\\':
str_cat(val, s-1, 1);
rb_str_cat(val, s-1, 1);
continue;
default:
str_cat(val, s-2, 2);
rb_str_cat(val, s-2, 2);
continue;
}
if (no >= 0) {
if (BEG(no) == -1) continue;
str_cat(val, RSTRING(src)->ptr+BEG(no), END(no)-BEG(no));
rb_str_cat(val, RSTRING(src)->ptr+BEG(no), END(no)-BEG(no));
}
}
if (p < e) {
if (!val) val = str_new(p, e-p);
else str_cat(val, p, e-p);
if (!val) val = rb_str_new(p, e-p);
else rb_str_cat(val, p, e-p);
}
if (!val) return str;
@ -956,7 +981,7 @@ rb_get_kcode()
static VALUE
kcode_getter()
{
return str_new2(rb_get_kcode());
return rb_str_new2(rb_get_kcode());
}
void
@ -992,13 +1017,34 @@ static void
kcode_setter(val)
struct RString *val;
{
may_need_recompile = 1;
rb_set_kcode(STR2CSTR(val));
}
static VALUE
ignorecase_getter()
{
return ignorecase?Qtrue:Qfalse;
}
static void
ignorecase_setter(val)
VALUE val;
{
may_need_recompile = 1;
ignorecase = RTEST(val);
}
int
rb_ignorecase_p()
{
return (int)ignorecase;
}
static VALUE
match_getter()
{
return backref_get();
return match_clone(rb_backref_get());
}
static void
@ -1006,13 +1052,13 @@ match_setter(val)
VALUE val;
{
Check_Type(val, T_MATCH);
backref_set(val);
rb_backref_set(val);
}
void
Init_Regexp()
{
eRegxpError = rb_define_class("RegxpError", eStandardError);
rb_eRegxpError = rb_define_class("RegxpError", rb_eStandardError);
re_set_syntax(RE_NO_BK_PARENS | RE_NO_BK_VBAR
| RE_INTERVALS
@ -1038,32 +1084,32 @@ Init_Regexp()
rb_define_virtual_variable("$'", postmatch_getter, 0);
rb_define_virtual_variable("$+", last_paren_match_getter, 0);
rb_define_variable("$=", &ignorecase);
rb_define_virtual_variable("$=", ignorecase_getter, ignorecase_setter);
rb_define_virtual_variable("$KCODE", kcode_getter, kcode_setter);
rb_define_virtual_variable("$-K", kcode_getter, kcode_setter);
cRegexp = rb_define_class("Regexp", cObject);
rb_define_singleton_method(cRegexp, "new", reg_s_new, -1);
rb_define_singleton_method(cRegexp, "compile", reg_s_new, -1);
rb_define_singleton_method(cRegexp, "quote", reg_s_quote, 1);
rb_cRegexp = rb_define_class("Regexp", rb_cObject);
rb_define_singleton_method(rb_cRegexp, "new", rb_reg_s_new, -1);
rb_define_singleton_method(rb_cRegexp, "compile", rb_reg_s_new, -1);
rb_define_singleton_method(rb_cRegexp, "quote", rb_reg_s_quote, 1);
rb_define_method(cRegexp, "clone", reg_clone, 0);
rb_define_method(cRegexp, "==", reg_equal, 1);
rb_define_method(cRegexp, "=~", reg_match, 1);
rb_define_method(cRegexp, "===", reg_match, 1);
rb_define_method(cRegexp, "~", reg_match2, 0);
rb_define_method(cRegexp, "inspect", reg_inspect, 0);
rb_define_method(cRegexp, "source", reg_source, 0);
rb_define_method(cRegexp, "casefold?", reg_casefold_p, 0);
rb_define_method(cRegexp, "kcode", reg_kcode_method, 0);
rb_define_method(rb_cRegexp, "clone", rb_reg_clone, 0);
rb_define_method(rb_cRegexp, "==", rb_reg_equal, 1);
rb_define_method(rb_cRegexp, "=~", rb_reg_match, 1);
rb_define_method(rb_cRegexp, "===", rb_reg_match, 1);
rb_define_method(rb_cRegexp, "~", rb_reg_match2, 0);
rb_define_method(rb_cRegexp, "inspect", rb_reg_inspect, 0);
rb_define_method(rb_cRegexp, "source", rb_reg_source, 0);
rb_define_method(rb_cRegexp, "casefold?", rb_reg_casefold_p, 0);
rb_define_method(rb_cRegexp, "kcode", rb_reg_kcode_method, 0);
rb_global_variable(&reg_cache);
rb_global_variable(&matchcache);
cMatch = rb_define_class("MatchingData", cData);
rb_define_method(cMatch, "clone", match_clone, 0);
rb_define_method(cMatch, "to_a", match_to_a, 0);
rb_define_method(cMatch, "[]", match_aref, -1);
rb_define_method(cMatch, "to_s", match_to_s, 0);
rb_define_method(cMatch, "inspect", any_to_s, 0);
rb_cMatch = rb_define_class("MatchingData", rb_cData);
rb_define_method(rb_cMatch, "clone", match_clone, 0);
rb_define_method(rb_cMatch, "to_a", match_to_a, 0);
rb_define_method(rb_cMatch, "[]", match_aref, -1);
rb_define_method(rb_cMatch, "to_s", match_to_s, 0);
rb_define_method(rb_cMatch, "inspect", rb_any_to_s, 0);
}

9
re.h
View file

@ -29,9 +29,8 @@ struct RMatch {
#define RMATCH(obj) (R_CAST(RMatch)(obj))
int str_cicmp _((VALUE, VALUE));
VALUE reg_regcomp _((VALUE));
int reg_search _((VALUE, VALUE, int, int));
VALUE reg_regsub _((VALUE, VALUE, struct re_registers *));
void reg_free _((Regexp *));
int rb_str_cicmp _((VALUE, VALUE));
VALUE rb_reg_regcomp _((VALUE));
int rb_reg_search _((VALUE, VALUE, int, int));
VALUE rb_reg_regsub _((VALUE, VALUE, struct re_registers *));
#endif

View file

@ -2239,6 +2239,7 @@ slow_match(little, lend, big, bend, translate)
if (c == 0xff)
c = *little++;
if (!trans_eq(*big++, c, translate)) break;
little++;
}
if (little == lend) return 1;
return 0;

192
ruby.c
View file

@ -28,9 +28,6 @@
#include "node.h"
#endif
void show_version();
void show_copyright();
#ifdef USE_CWGUSI
#include "macruby_missing.h"
#endif
@ -41,43 +38,38 @@ char *strrchr _((char*,char));
char *strstr _((char*,char*));
#endif
char *ruby_mktemp _((void));
#include "util.h"
#ifndef HAVE_STDLIB_H
char *getenv();
#endif
static int version, copyright;
VALUE debug = FALSE;
VALUE verbose = FALSE;
int tainting = FALSE;
static int sflag = FALSE;
VALUE rb_debug = Qfalse;
VALUE rb_verbose = Qfalse;
int tainting = Qfalse;
static int sflag = Qfalse;
char *inplace = FALSE;
char *ruby_inplace_mode = Qfalse;
char *strdup();
extern char *sourcefile;
extern int yydebug;
extern int nerrs;
static int xflag = FALSE;
extern VALUE RS, RS_default, ORS, FS;
static int xflag = Qfalse;
static void load_stdin _((void));
static void load_file _((char *, int));
static void forbid_setid _((char *));
static VALUE do_loop = FALSE, do_print = FALSE;
static VALUE do_check = FALSE, do_line = FALSE;
static VALUE do_split = FALSE;
static VALUE do_loop = Qfalse, do_print = Qfalse;
static VALUE do_check = Qfalse, do_line = Qfalse;
static VALUE do_split = Qfalse;
static char *script;
static int origargc;
static char **origargv;
extern int sourceline;
extern char *sourcefile;
#ifndef RUBY_LIB
#define RUBY_LIB "/usr/local/lib/ruby"
#endif
@ -110,24 +102,24 @@ addpath(path)
#endif
if (strchr(path, RUBY_LIB_SEP)) {
char *p, *s;
VALUE ary = ary_new();
VALUE ary = rb_ary_new();
p = path;
while (*p) {
while (*p == RUBY_LIB_SEP) p++;
if (s = strchr(p, RUBY_LIB_SEP)) {
ary_push(ary, str_new(p, (int)(s-p)));
rb_ary_push(ary, rb_str_new(p, (int)(s-p)));
p = s + 1;
}
else {
ary_push(ary, str_new2(p));
rb_ary_push(ary, rb_str_new2(p));
break;
}
}
rb_load_path = ary_plus(ary, rb_load_path);
rb_load_path = rb_ary_plus(ary, rb_load_path);
}
else {
ary_unshift(rb_load_path, str_new2(path));
rb_ary_unshift(rb_load_path, rb_str_new2(path));
}
}
@ -158,7 +150,7 @@ ruby_require_modules()
req_list_last = 0;
while (list) {
f_require(Qnil, str_new2(list->name));
rb_f_require(Qnil, rb_str_new2(list->name));
tmp = list->next;
free(list);
list = tmp;
@ -177,8 +169,8 @@ proc_options(argcp, argvp)
if (argc == 0) return;
version = FALSE;
do_search = FALSE;
version = Qfalse;
do_search = Qfalse;
script_given = 0;
e_tmpname = NULL;
@ -189,21 +181,21 @@ proc_options(argcp, argvp)
reswitch:
switch (*s) {
case 'a':
do_split = TRUE;
do_split = Qtrue;
s++;
goto reswitch;
case 'p':
do_print = TRUE;
do_print = Qtrue;
/* through */
case 'n':
do_loop = TRUE;
do_loop = Qtrue;
s++;
goto reswitch;
case 'd':
debug = TRUE;
verbose |= 1;
rb_debug = Qtrue;
rb_verbose |= 1;
s++;
goto reswitch;
@ -213,33 +205,33 @@ proc_options(argcp, argvp)
goto reswitch;
case 'v':
show_version();
verbose = 2;
ruby_show_version();
rb_verbose = 2;
case 'w':
verbose |= 1;
rb_verbose |= 1;
s++;
goto reswitch;
case 'c':
do_check = TRUE;
do_check = Qtrue;
s++;
goto reswitch;
case 's':
forbid_setid("-s");
sflag = TRUE;
sflag = Qtrue;
s++;
goto reswitch;
case 'l':
do_line = TRUE;
ORS = RS;
do_line = Qtrue;
rb_output_rs = rb_rs;
s++;
goto reswitch;
case 'S':
forbid_setid("-S");
do_search = TRUE;
do_search = Qtrue;
s++;
goto reswitch;
@ -247,10 +239,10 @@ proc_options(argcp, argvp)
forbid_setid("-e");
if (!e_fp) {
e_tmpname = ruby_mktemp();
if (!e_tmpname) Fatal("Can't mktemp");
if (!e_tmpname) rb_fatal("Can't mktemp");
e_fp = fopen(e_tmpname, "w");
if (!e_fp) {
Fatal("Cannot open temporary file: %s", e_tmpname);
rb_fatal("Cannot open temporary file: %s", e_tmpname);
}
if (script == 0) script = e_tmpname;
}
@ -274,15 +266,15 @@ proc_options(argcp, argvp)
case 'i':
forbid_setid("-i");
if (inplace) free(inplace);
inplace = strdup(s+1);
if (ruby_inplace_mode) free(ruby_inplace_mode);
ruby_inplace_mode = strdup(s+1);
break;
case 'x':
xflag = TRUE;
xflag = Qtrue;
s++;
if (*s && chdir(s) < 0) {
Fatal("Can't chdir to %s", s);
rb_fatal("Can't chdir to %s", s);
}
break;
@ -293,12 +285,12 @@ proc_options(argcp, argvp)
argc--,argv++;
}
if (*s && chdir(s) < 0) {
Fatal("Can't chdir to %s", s);
rb_fatal("Can't chdir to %s", s);
}
break;
case 'F':
FS = str_new2(s+1);
rb_fs = rb_str_new2(s+1);
break;
case 'K':
@ -317,7 +309,7 @@ proc_options(argcp, argvp)
if (numlen == 0) v = 1;
}
rb_set_safe_level(v);
tainting = TRUE;
tainting = Qtrue;
}
break;
@ -339,13 +331,13 @@ proc_options(argcp, argvp)
v = scan_oct(s, 4, &numlen);
s += numlen;
if (v > 0377) RS = Qnil;
if (v > 0377) rb_rs = Qnil;
else if (v == 0 && numlen >= 2) {
RS = str_new2("\n\n");
rb_rs = rb_str_new2("\n\n");
}
else {
c = v & 0xff;
RS = str_new(&c, 1);
rb_rs = rb_str_new(&c, 1);
}
}
goto reswitch;
@ -359,15 +351,15 @@ proc_options(argcp, argvp)
if (strcmp("copyright", s) == 0)
copyright = 1;
else if (strcmp("debug", s) == 0)
debug = 1;
rb_debug = 1;
else if (strcmp("version", s) == 0)
version = 1;
else if (strcmp("verbose", s) == 0)
verbose = 2;
rb_verbose = 2;
else if (strcmp("yydebug", s) == 0)
yydebug = 1;
else {
Fatal("Unrecognized long option: --%s",s);
rb_fatal("Unrecognized long option: --%s",s);
}
break;
@ -377,7 +369,7 @@ proc_options(argcp, argvp)
break;
default:
Fatal("Unrecognized switch: -%s",s);
rb_fatal("Unrecognized switch: -%s",s);
case 0:
break;
@ -389,24 +381,24 @@ proc_options(argcp, argvp)
if (e_fp) {
if (fflush(e_fp) || ferror(e_fp) || fclose(e_fp))
Fatal("Cannot write to temp file for -e");
rb_fatal("Cannot write to temp file for -e");
e_fp = NULL;
argc++, argv--;
argv[0] = e_tmpname;
}
if (version) {
show_version();
ruby_show_version();
exit(0);
}
if (copyright) {
show_copyright();
ruby_show_copyright();
}
Init_ext(); /* should be called here for some reason :-( */
if (script_given == FALSE) {
if (script_given == Qfalse) {
if (argc == 0) { /* no more args */
if (verbose == 3) exit(0);
if (rb_verbose == 3) exit(0);
script = "-";
load_stdin();
}
@ -434,9 +426,9 @@ proc_options(argcp, argvp)
argc--; argv++;
}
}
if (verbose) verbose = TRUE;
if (rb_verbose) rb_verbose = Qtrue;
xflag = FALSE;
xflag = Qfalse;
*argvp = argv;
*argcp = argc;
@ -452,10 +444,10 @@ proc_options(argcp, argvp)
argv[0][0] = '$';
if (s = strchr(argv[0], '=')) {
*s++ = '\0';
rb_gvar_set2(argv[0], str_new2(s));
rb_gvar_set2(argv[0], rb_str_new2(s));
}
else {
rb_gvar_set2(argv[0], TRUE);
rb_gvar_set2(argv[0], Qtrue);
}
argv[0][0] = '-';
}
@ -480,24 +472,24 @@ load_file(fname, script)
FILE *fp = fopen(fname, "r");
if (fp == NULL) {
LoadError("No such file to load -- %s", fname);
rb_raise(rb_eLoadError, "No such file to load -- %s", fname);
}
fclose(fp);
f = file_open(fname, "r");
f = rb_file_open(fname, "r");
}
if (script) {
VALUE c;
VALUE line;
VALUE rs = RS;
VALUE rs = rb_rs;
char *p;
RS = RS_default;
rb_rs = rb_default_rs;
if (xflag) {
forbid_setid("-x");
xflag = FALSE;
while (!NIL_P(line = io_gets(f))) {
xflag = Qfalse;
while (!NIL_P(line = rb_io_gets(f))) {
line_start++;
if (RSTRING(line)->len > 2
&& RSTRING(line)->ptr[0] == '#'
@ -507,13 +499,13 @@ load_file(fname, script)
}
}
}
RS = rs;
LoadError("No Ruby script found in input");
rb_rs = rs;
rb_raise(rb_eLoadError, "No Ruby script found in input");
}
c = io_getc(f);
c = rb_io_getc(f);
if (c == INT2FIX('#')) {
line = io_gets(f);
line = rb_io_gets(f);
line_start++;
if (RSTRING(line)->len > 2 && RSTRING(line)->ptr[0] == '!') {
@ -545,9 +537,9 @@ load_file(fname, script)
#ifndef USE_CWGUSI
execv(path, argv);
#endif
sourcefile = fname;
sourceline = 1;
Fatal("Can't exec %s", path);
ruby_sourcefile = fname;
ruby_sourceline = 1;
rb_fatal("Can't exec %s", path);
}
start_read:
@ -574,16 +566,16 @@ load_file(fname, script)
}
}
else if (!NIL_P(c)) {
io_ungetc(f, c);
rb_io_ungetc(f, c);
}
RS = rs;
rb_rs = rs;
}
compile_file(fname, f, line_start);
rb_compile_file(fname, f, line_start);
if (script) {
rb_define_global_const("DATA", f);
}
else if (f != rb_stdin) {
io_close(f);
rb_io_close(f);
}
}
@ -614,7 +606,7 @@ set_arg0(val, id)
int i;
static int len;
if (origargv == 0) Fail("$0 not initialized");
if (origargv == 0) rb_raise(rb_eRuntimeError, "$0 not initialized");
if (len == 0) {
s = origargv[0];
s += strlen(s);
@ -637,7 +629,7 @@ set_arg0(val, id)
while (++i < len)
*s++ = ' ';
}
rb_progname = str_taint(str_new2(origargv[0]));
rb_progname = rb_str_taint(rb_str_new2(origargv[0]));
}
void
@ -645,8 +637,8 @@ ruby_script(name)
char *name;
{
if (name) {
rb_progname = str_taint(str_new2(name));
sourcefile = name;
rb_progname = rb_str_taint(rb_str_new2(name));
ruby_sourcefile = name;
}
}
@ -673,11 +665,11 @@ forbid_setid(s)
char *s;
{
if (euid != uid)
Fatal("No %s allowed while running setuid", s);
rb_raise(rb_eSecurityError, "No %s allowed while running setuid", s);
if (egid != gid)
Fatal("No %s allowed while running setgid", s);
rb_raise(rb_eSecurityError, "No %s allowed while running setgid", s);
if (rb_safe_level() > 0)
Fatal("No %s allowed in tainted mode", s);
rb_raise(rb_eSecurityError, "No %s allowed in tainted mode", s);
}
#if defined(_WIN32) || defined(DJGPP)
@ -719,11 +711,11 @@ ruby_prog_init()
{
init_ids();
sourcefile = "ruby";
rb_define_variable("$VERBOSE", &verbose);
rb_define_variable("$-v", &verbose);
rb_define_variable("$DEBUG", &debug);
rb_define_variable("$-d", &debug);
ruby_sourcefile = "ruby";
rb_define_variable("$VERBOSE", &rb_verbose);
rb_define_variable("$-v", &rb_verbose);
rb_define_variable("$DEBUG", &rb_debug);
rb_define_variable("$-d", &rb_debug);
rb_define_readonly_variable("$-p", &do_print);
rb_define_readonly_variable("$-l", &do_line);
@ -760,7 +752,7 @@ ruby_prog_init()
rb_define_hooked_variable("$0", &rb_progname, 0, set_arg0);
rb_argv = ary_new();
rb_argv = rb_ary_new();
rb_define_readonly_variable("$*", &rb_argv);
rb_define_global_const("ARGV", rb_argv);
rb_define_readonly_variable("$-a", &do_split);
@ -788,7 +780,7 @@ ruby_set_argv(argc, argv)
else dln_argv0 = argv[0];
#endif
for (i=0; i < argc; i++) {
ary_push(rb_argv, str_taint(str_new2(argv[i])));
rb_ary_push(rb_argv, rb_str_taint(rb_str_new2(argv[i])));
}
}
@ -807,15 +799,15 @@ ruby_process_options(argc, argv)
ruby_script(script);
ruby_set_argv(argc, argv);
if (do_check && nerrs == 0) {
if (do_check && ruby_nerrs == 0) {
printf("Syntax OK\n");
exit(0);
}
if (do_print) {
yyappend_print();
rb_parser_append_print();
}
if (do_loop) {
yywhile_loop(do_line, do_split);
rb_parser_while_loop(do_line, do_split);
}
if (e_fp) {
fclose(e_fp);

273
ruby.h
View file

@ -18,9 +18,14 @@ extern "C" {
#endif
#include "config.h"
#include "defines.h"
#if 0
#ifndef RUBY_RENAME
#include "rename2.h"
#endif
#endif
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
#endif
@ -89,11 +94,6 @@ extern "C" {
#if SIZEOF_LONG != SIZEOF_VOIDP
---->> ruby requires sizeof(void*) == sizeof(long) to be compiled. <<----
# endif
/* INT, UINT, UCHAR are obsolete macro, do not use them. */
typedef long INT;
typedef unsigned long UINT;
typedef unsigned char UCHAR;
typedef unsigned long VALUE;
typedef unsigned int ID;
@ -121,8 +121,8 @@ typedef unsigned int ID;
#define FIXNUM_FLAG 0x01
#define INT2FIX(i) (VALUE)(((long)(i))<<1 | FIXNUM_FLAG)
VALUE int2inum _((long));
#define INT2NUM(v) int2inum(v)
VALUE rb_int2inum _((long));
#define INT2NUM(v) rb_int2inum(v)
#define FIX2LONG(x) RSHIFT((long)x,1)
#define FIX2ULONG(x) (((unsigned long)(x))>>1)
@ -132,13 +132,6 @@ VALUE int2inum _((long));
#define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f))
/* special contants - i.e. non-zero and non-fixnum constants */
#ifndef MACRUBY_PUBLIC_INTERFACE
# undef FALSE
# undef TRUE
# define FALSE 0
# define TRUE 2
# define NIL 4
#endif
#define Qfalse 0
#define Qtrue 2
#define Qnil 4
@ -146,7 +139,6 @@ VALUE int2inum _((long));
# define RTEST(v) rb_test_false_or_nil((VALUE)(v))
#define NIL_P(v) ((VALUE)(v) == Qnil)
VALUE rb_class_of _((VALUE));
#define CLASS_OF(v) rb_class_of((VALUE)(v))
#define T_NONE 0x00
@ -187,15 +179,15 @@ void rb_check_safe_str _((VALUE));
#define Check_SafeStr(v) rb_check_safe_str((VALUE)(v))
void rb_secure _((int));
long num2long _((VALUE));
unsigned long num2ulong _((VALUE));
#define NUM2LONG(x) (FIXNUM_P(x)?FIX2INT(x):num2long((VALUE)x))
#define NUM2ULONG(x) num2ulong((VALUE)x)
long rb_num2long _((VALUE));
unsigned long rb_num2ulong _((VALUE));
#define NUM2LONG(x) (FIXNUM_P(x)?FIX2INT(x):rb_num2long((VALUE)x))
#define NUM2ULONG(x) rb_num2ulong((VALUE)x)
#if SIZEOF_INT < SIZEOF_LONG
int num2int _((VALUE));
#define NUM2INT(x) (FIXNUM_P(x)?FIX2INT(x):num2int((VALUE)x))
int fix2int _((VALUE));
#define FIX2INT(x) fix2int((VALUE)x)
int rb_num2int _((VALUE));
#define NUM2INT(x) (FIXNUM_P(x)?FIX2INT(x):rb_num2int((VALUE)x))
int rb_fix2int _((VALUE));
#define FIX2INT(x) rb_fix2int((VALUE)x)
#define NUM2UINT(x) ((unsigned int)NUM2ULONG(x))
#define FIX2UINT(x) ((unsigned int)FIX2ULONG(x))
#else
@ -205,11 +197,12 @@ int fix2int _((VALUE));
#define FIX2UINT(x) FIX2ULONG(x)
#endif
double num2dbl _((VALUE));
#define NUM2DBL(x) num2dbl((VALUE)(x))
double rb_num2dbl _((VALUE));
#define NUM2DBL(x) rb_num2dbl((VALUE)(x))
char *str2cstr _((VALUE,int*));
#define STR2CSTR(x) str2cstr((VALUE)(x),0)
char *rb_str2cstr _((VALUE,int*));
#define str2cstr(x,l) rb_str2cstr((VALUE)(x),(l))
#define STR2CSTR(x) rb_str2cstr((VALUE)(x),0)
#define NUM2CHR(x) (((TYPE(x) == T_STRING)&&(RSTRING(x)->len>=1))?\
RSTRING(x)->ptr[0]:(char)NUM2INT(x))
@ -222,8 +215,8 @@ VALUE rb_newobj _((void));
RBASIC(obj)->flags = (t);\
}
#define CLONESETUP(clone,obj) {\
OBJSETUP(clone,singleton_class_clone(RBASIC(obj)->klass),RBASIC(obj)->flags);\
singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);\
OBJSETUP(clone,rb_singleton_class_clone(RBASIC(obj)->klass),RBASIC(obj)->flags);\
rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);\
}
struct RBasic {
@ -272,7 +265,7 @@ struct RHash {
struct RBasic basic;
struct st_table *tbl;
int iter_lev;
long status;
VALUE ifnone;
};
struct RFile {
@ -287,19 +280,19 @@ struct RData {
void *data;
};
extern VALUE cData;
extern VALUE rb_cData;
#define DATA_PTR(dta) (RDATA(dta)->data)
VALUE data_object_alloc _((VALUE,void*,void (*)(),void (*)()));
VALUE rb_data_object_alloc _((VALUE,void*,void (*)(),void (*)()));
#define Data_Make_Struct(klass,type,mark,free,sval) (\
sval = ALLOC(type),\
memset(sval, 0, sizeof(type)),\
data_object_alloc(klass,sval,mark,free)\
rb_data_object_alloc(klass,sval,mark,free)\
)
#define Data_Wrap_Struct(klass,mark,free,sval) (\
data_object_alloc(klass,sval,mark,free)\
rb_data_object_alloc(klass,sval,mark,free)\
)
#define Data_Get_Struct(obj,type,sval) {\
@ -358,49 +351,6 @@ struct RBignum {
#define FL_UNSET(x,f) if(FL_ABLE(x)){RBASIC(x)->flags &= ~(f);}
#define FL_REVERSE(x,f) if(FL_ABLE(x)){RBASIC(x)->flags ^= f;}
#if defined(__GNUC__) && __GNUC__ >= 2 && !defined(RUBY_NO_INLINE)
extern __inline__ int
rb_type(VALUE obj)
{
if (FIXNUM_P(obj)) return T_FIXNUM;
if (obj == Qnil) return T_NIL;
#ifdef MACRUBY_PUBLIC_INTERFACE
if (obj == RubyFALSE) return T_FALSE;
if (obj == RubyTRUE) return T_TRUE;
#else
if (obj == FALSE) return T_FALSE;
if (obj == TRUE) return T_TRUE;
#endif
return BUILTIN_TYPE(obj);
}
extern __inline__ int
rb_special_const_p(VALUE obj)
{
#ifdef MACRUBY_PUBLIC_INTERFACE
return (FIXNUM_P(obj)||obj == Qnil||obj == RubyFALSE||obj == RubyTRUE)?RubyTRUE:RubyFALSE;
#else
return (FIXNUM_P(obj)||obj == Qnil||obj == FALSE||obj == TRUE)?TRUE:FALSE;
#endif
}
extern __inline__ int
rb_test_false_or_nil(VALUE v)
{
#ifdef MACRUBY_PUBLIC_INTERFACE
return (v != Qnil) && (v != RubyFALSE);
return (v != Qnil) && (v != RubyFALSE);
#else
return (v != Qnil) && (v != FALSE);
return (v != Qnil) && (v != FALSE);
#endif
}
#else
int rb_type _((VALUE));
int rb_special_const_p _((VALUE));
int rb_test_false_or_nil _((VALUE));
#endif
void *xmalloc _((int));
void *xcalloc _((int,int));
void *xrealloc _((void*,int));
@ -458,89 +408,142 @@ void rb_const_set _((VALUE, ID, VALUE));
VALUE rb_equal _((VALUE,VALUE));
extern VALUE verbose, debug;
extern VALUE rb_verbose, rb_debug;
int rb_safe_level _((void));
void rb_set_safe_level _((int));
void Raise __((VALUE, char*, ...)) NORETURN;
void Fail __((char*, ...)) NORETURN;
void Fatal __((char*, ...)) NORETURN;
void Bug __((char*, ...)) NORETURN;
void rb_raise __((VALUE, char*, ...)) NORETURN;
void rb_fatal __((char*, ...)) NORETURN;
void rb_bug __((char*, ...)) NORETURN;
void rb_sys_fail _((char*)) NORETURN;
void rb_iter_break _((void)) NORETURN;
void rb_exit _((int)) NORETURN;
void rb_raise _((VALUE)) NORETURN;
void rb_fatal _((VALUE)) NORETURN;
void rb_notimplement _((void)) NORETURN;
void Error __((char*, ...));
void Warn __((char*, ...));
void Warning __((char*, ...)); /* reports if `-w' specified */
void rb_warn __((char*, ...));
void rb_warning __((char*, ...)); /* reports if `-w' specified */
VALUE rb_each _((VALUE));
VALUE rb_yield _((VALUE));
int iterator_p _((void));
int rb_iterator_p _((void));
VALUE rb_iterate _((VALUE(*)(),VALUE,VALUE(*)(),VALUE));
VALUE rb_rescue _((VALUE(*)(),VALUE,VALUE(*)(),VALUE));
VALUE rb_ensure _((VALUE(*)(),VALUE,VALUE(*)(),VALUE));
VALUE rb_catch _((char*,VALUE(*)(),VALUE));
void rb_throw _((char*,VALUE)) NORETURN;
extern VALUE mKernel;
extern VALUE mComparable;
extern VALUE mEnumerable;
extern VALUE mErrno;
extern VALUE mFileTest;
extern VALUE mGC;
extern VALUE mMath;
extern VALUE mProcess;
void ruby_init _((void));
void ruby_options _((int, char**));
void ruby_run _((void));
#ifdef __MACOS__ /* name conflict, AERegistory.h */
extern VALUE cRubyObject;
extern VALUE rb_mKernel;
extern VALUE rb_mComparable;
extern VALUE rb_mEnumerable;
extern VALUE rb_mErrno;
extern VALUE rb_mFileTest;
extern VALUE rb_mGC;
extern VALUE rb_mMath;
extern VALUE rb_mProcess;
extern VALUE rb_cObject;
extern VALUE rb_cArray;
extern VALUE rb_cBignum;
extern VALUE rb_cClass;
extern VALUE rb_cDir;
extern VALUE rb_cData;
extern VALUE rb_cFalseClass;
extern VALUE rb_cFile;
extern VALUE rb_cFixnum;
extern VALUE rb_cFloat;
extern VALUE rb_cHash;
extern VALUE rb_cInteger;
extern VALUE rb_cIO;
extern VALUE rb_cModule;
extern VALUE rb_cNilClass;
extern VALUE rb_cNumeric;
extern VALUE rb_cProc;
extern VALUE rb_cRange;
extern VALUE rb_cRegexp;
extern VALUE rb_cString;
extern VALUE rb_cThread;
extern VALUE rb_cTime;
extern VALUE rb_cTrueClass;
extern VALUE rb_cStruct;
extern VALUE rb_eException;
extern VALUE rb_eStandardError;
extern VALUE rb_eSystemExit, rb_eInterrupt, rb_eFatal;
extern VALUE rb_eArgError;
extern VALUE rb_eEOFError;
extern VALUE rb_eIndexError;
extern VALUE rb_eIOError;
extern VALUE rb_eLoadError;
extern VALUE rb_eNameError;
extern VALUE rb_eRuntimeError;
extern VALUE rb_eSecurityError;
extern VALUE rb_eSyntaxError;
extern VALUE rb_eSystemCallError;
extern VALUE rb_eTypeError;
extern VALUE rb_eZeroDiv;
extern VALUE rb_eNotImpError;
#if defined(__GNUC__) && __GNUC__ >= 2 && !defined(RUBY_NO_INLINE)
extern __inline__ VALUE rb_class_of _((VALUE));
extern __inline__ int rb_type _((VALUE));
extern __inline__ int rb_special_const_p _((VALUE));
extern __inline__ int rb_test_false_or_nil _((VALUE));
extern __inline__ VALUE
rb_class_of(VALUE obj)
{
if (FIXNUM_P(obj)) return rb_cFixnum;
if (obj == Qnil) return rb_cNilClass;
if (obj == Qfalse) return rb_cFalseClass;
if (obj == Qtrue) return rb_cTrueClass;
return RBASIC(obj)->klass;
}
extern __inline__ int
rb_type(VALUE obj)
{
if (FIXNUM_P(obj)) return T_FIXNUM;
if (obj == Qnil) return T_NIL;
if (obj == Qfalse) return T_FALSE;
if (obj == Qtrue) return T_TRUE;
return BUILTIN_TYPE(obj);
}
extern __inline__ int
rb_special_const_p(VALUE obj)
{
return (FIXNUM_P(obj)||obj == Qnil||obj == Qfalse||obj == Qtrue)?Qtrue:Qfalse;
}
extern __inline__ int
rb_test_false_or_nil(VALUE v)
{
#ifdef MACRUBY_PUBLIC_INTERFACE
return (v != Qnil) && (v != RubyFALSE);
return (v != Qnil) && (v != RubyFALSE);
#else
extern VALUE cObject;
return (v != Qnil) && (v != Qfalse);
return (v != Qnil) && (v != Qfalse);
#endif
}
#else
VALUE rb_class_of _((VALUE));
int rb_type _((VALUE));
int rb_special_const_p _((VALUE));
int rb_test_false_or_nil _((VALUE));
#endif
extern VALUE cArray;
extern VALUE cBignum;
extern VALUE cClass;
extern VALUE cData;
extern VALUE cFile;
extern VALUE cFixnum;
extern VALUE cFloat;
extern VALUE cHash;
extern VALUE cInteger;
extern VALUE cIO;
extern VALUE cModule;
extern VALUE cNumeric;
extern VALUE cProc;
extern VALUE cRegexp;
extern VALUE cString;
extern VALUE cThread;
extern VALUE cStruct;
extern VALUE eException;
extern VALUE eStandardError;
extern VALUE eSystemExit, eInterrupt, eFatal;
extern VALUE eArgError;
extern VALUE eEOFError;
extern VALUE eIndexError;
extern VALUE eIOError;
extern VALUE eLoadError;
extern VALUE eNameError;
extern VALUE eRuntimeError;
extern VALUE eSecurityError;
extern VALUE eSyntaxError;
extern VALUE eSystemCallError;
extern VALUE eTypeError;
extern VALUE eZeroDiv;
extern VALUE eNotImpError;
#include "intern.h"
#if defined(EXTLIB) && defined(USE_DLN_A_OUT)
/* hook for external modules */
static char *libs_to_be_linked[] = { EXTLIB, 0 };
static char *dln_libs_to_be_linked[] = { EXTLIB, 0 };
#endif
#if defined(__cplusplus)

View file

@ -33,7 +33,7 @@ typedef struct OpenFile {
#define FMODE_BINMODE 4
#define FMODE_SYNC 8
#define GetOpenFile(obj,fp) io_check_closed((fp) = RFILE(obj)->fptr)
#define GetOpenFile(obj,fp) rb_io_check_closed((fp) = RFILE(obj)->fptr)
#define MakeOpenFile(obj, fp) do {\
fp = RFILE(obj)->fptr = ALLOC(OpenFile);\
@ -49,10 +49,11 @@ typedef struct OpenFile {
FILE *rb_fopen _((char *, char *));
FILE *rb_fdopen _((int, char *));
void io_writable _((OpenFile *));
void io_readable _((OpenFile *));
void io_fptr_finalize _((OpenFile *));
void io_unbuffered _((OpenFile *));
void io_check_closed _((OpenFile *));
void rb_io_check_writable _((OpenFile *));
void rb_io_check_readable _((OpenFile *));
void rb_io_fptr_finalize _((OpenFile *));
void rb_io_unbuffered _((OpenFile *));
void rb_io_check_closed _((OpenFile *));
void rb_eof_error _((void));
#endif

View file

@ -10,44 +10,44 @@
#ifndef SIG_H
#define SIG_H
extern int trap_immediate;
#define TRAP_BEG (trap_immediate=1)
#define TRAP_END (trap_immediate=0)
extern int rb_trap_immediate;
#define TRAP_BEG (rb_trap_immediate=1)
#define TRAP_END (rb_trap_immediate=0)
extern int prohibit_interrupt;
#define DEFER_INTS {prohibit_interrupt++;}
#define ALLOW_INTS {prohibit_interrupt--; CHECK_INTS;}
#define ENABLE_INTS {prohibit_interrupt--;}
extern int rb_prohibit_interrupt;
#define DEFER_INTS {rb_prohibit_interrupt++;}
#define ALLOW_INTS {rb_prohibit_interrupt--; CHECK_INTS;}
#define ENABLE_INTS {rb_prohibit_interrupt--;}
extern int trap_pending;
void trap_restore_mask _((void));
extern int rb_trap_pending;
void rb_trap_restore_mask _((void));
#ifdef THREAD
extern int thread_critical;
void thread_schedule _((void));
extern int rb_thread_critical;
void rb_thread_schedule _((void));
#if defined(HAVE_SETITIMER) && !defined(__BOW__)
extern int thread_pending;
# define CHECK_INTS if (!prohibit_interrupt) {\
if (trap_pending) rb_trap_exec();\
if (thread_pending && !thread_critical) thread_schedule();\
extern int rb_thread_pending;
# define CHECK_INTS if (!rb_prohibit_interrupt) {\
if (rb_trap_pending) rb_trap_exec();\
if (rb_thread_pending && !rb_thread_critical) rb_thread_schedule();\
}
# else
/* pseudo preemptive thread switching */
extern int thread_tick;
extern int rb_thread_tick;
#define THREAD_TICK 500
# define CHECK_INTS if (!prohibit_interrupt) {\
if (trap_pending) rb_trap_exec();\
if (!thread_critical) {\
if (thread_tick-- <= 0) {\
thread_tick = THREAD_TICK;\
thread_schedule();\
# define CHECK_INTS if (!rb_prohibit_interrupt) {\
if (rb_trap_pending) rb_trap_exec();\
if (!rb_thread_critical) {\
if (rb_thread_tick-- <= 0) {\
rb_thread_tick = THREAD_TICK;\
rb_thread_schedule();\
}\
}\
}
# endif
#else
# define CHECK_INTS if (!prohibit_interrupt) {\
if (trap_pending) rb_trap_exec();\
# define CHECK_INTS if (!rb_prohibit_interrupt) {\
if (rb_trap_pending) rb_trap_exec();\
}
#endif

View file

@ -1,13 +1,13 @@
# word occurrence listing
# usege: ruby freq.rb file..
freq = {}
freq = Hash.new(0)
while gets
while sub!(/\w+/, '')
word = $&
freq[word] = freq.fetch(word, 0)+1
freq[word] += 1
end
end
for word in freq.keys.sort
printf("%s -- %d\n", word, freq[word])
for word in freq.keys.sort!
print word, " -- ", freq[word], "\n"
end

View file

@ -1,12 +1,12 @@
# word occurrence listing
# usege: ruby occur.rb file..
freq = {}
freq = Hash.new(0)
while gets()
for word in $_.split(/\W+/)
freq[word] +=1
freq[word] += 1
end
end
for word in freq.keys.sort
printf("%s -- %d\n", word, freq[word])
for word in freq.keys.sort!
print word, " -- ", freq[word], "\n"
end

View file

@ -142,7 +142,7 @@ The variable ruby-indent-level controls the amount of indentation.
(interactive)
(kill-all-local-variables)
(use-local-map ruby-mode-map)
(setq mode-name "ruby")
(setq mode-name "Ruby")
(setq major-mode 'ruby-mode)
(ruby-mode-variables)
(run-hooks 'ruby-mode-hook))
@ -464,6 +464,12 @@ The variable ruby-indent-level controls the amount of indentation.
(setq bol (point))
(end-of-line)
(skip-chars-backward " \t")
(and (re-search-backward "#" (save-excursion
(beginning-of-line)
(point)) t)
(setq state (ruby-parse-region parse-start (point)))
(nth 0 state)
(goto-char (nth 0 state)))
(or (bobp) (forward-char -1))
(and
(or (and (looking-at ruby-symbol-re)
@ -473,7 +479,7 @@ The variable ruby-indent-level controls the amount of indentation.
(goto-char (match-end 0))
(not (looking-at "[a-z_]"))))
(and (looking-at ruby-operator-re)
(or (not (or (eq ?/ (char-after (point)))))
(or (not (eq ?/ (char-after (point))))
(null (nth 0 (ruby-parse-region parse-start (point)))))
(not (eq (char-after (1- (point))) ?$))
(or (not (eq ?| (char-after (point))))

View file

@ -180,7 +180,7 @@ signm2signo(nm)
}
VALUE
f_kill(argc, argv)
rb_f_kill(argc, argv)
int argc;
VALUE *argv;
{
@ -194,13 +194,13 @@ f_kill(argc, argv)
rb_secure(2);
if (argc < 2)
ArgError("wrong # of arguments -- kill(sig, pid...)");
rb_raise(rb_eArgError, "wrong # of arguments -- kill(sig, pid...)");
switch (TYPE(argv[0])) {
case T_FIXNUM:
sig = FIX2UINT(argv[0]);
if (sig >= NSIG) {
s = rb_id2name(sig);
if (!s) ArgError("Bad signal");
if (!s) rb_raise(rb_eArgError, "Bad signal");
goto str_signal;
}
break;
@ -216,7 +216,7 @@ f_kill(argc, argv)
if (strncmp("SIG", s, 3) == 0)
s += 3;
if((sig = signm2signo(s)) == 0)
ArgError("Unrecognized signal name `%s'", s);
rb_raise(rb_eArgError, "Unrecognized signal name `%s'", s);
if (negative)
sig = -sig;
@ -224,7 +224,8 @@ f_kill(argc, argv)
break;
default:
ArgError("bad signal type %s", rb_class2name(CLASS_OF(argv[0])));
rb_raise(rb_eArgError, "bad signal type %s",
rb_class2name(CLASS_OF(argv[0])));
break;
}
@ -253,19 +254,19 @@ f_kill(argc, argv)
static VALUE trap_list[NSIG];
static int trap_pending_list[NSIG];
int trap_pending;
int trap_immediate;
int prohibit_interrupt;
int rb_trap_pending;
int rb_trap_immediate;
int rb_prohibit_interrupt;
void
gc_mark_trap_list()
rb_gc_mark_trap_list()
{
#ifndef MACOS_UNUSE_SIGNAL
int i;
for (i=0; i<NSIG; i++) {
if (trap_list[i])
gc_mark(trap_list[i]);
rb_gc_mark(trap_list[i]);
}
#endif /* MACOS_UNUSE_SIGNAL */
}
@ -286,8 +287,8 @@ posix_signal(signum, handler)
#endif
#ifdef THREAD
# define rb_interrupt thread_interrupt
# define rb_trap_eval thread_trap_eval
# define rb_interrupt rb_thread_interrupt
# define rb_trap_eval rb_thread_trap_eval
#endif
static RETSIGTYPE
@ -295,22 +296,22 @@ sighandle(sig)
int sig;
{
if (sig >= NSIG ||(sig != SIGINT && !trap_list[sig]))
Bug("trap_handler: Bad signal %d", sig);
rb_bug("trap_handler: Bad signal %d", sig);
#if !defined(POSIX_SIGNAL) && !defined(BSD_SIGNAL)
signal(sig, sighandle);
#endif
if (trap_immediate) {
trap_immediate = 0;
if (rb_trap_immediate) {
rb_trap_immediate = 0;
if (sig == SIGINT && !trap_list[SIGINT]) {
rb_interrupt();
}
rb_trap_eval(trap_list[sig], sig);
trap_immediate = 1;
rb_trap_immediate = 1;
}
else {
trap_pending++;
rb_trap_pending++;
trap_pending_list[sig]++;
}
}
@ -320,7 +321,7 @@ static RETSIGTYPE
sigbus(sig)
int sig;
{
Bug("Bus Error");
rb_bug("Bus Error");
}
#endif
@ -329,7 +330,7 @@ static RETSIGTYPE
sigsegv(sig)
int sig;
{
Bug("Segmentation fault");
rb_bug("Segmentation fault");
}
#endif
@ -338,7 +339,7 @@ rb_trap_exit()
{
#ifndef MACOS_UNUSE_SIGNAL
if (trap_list[0])
rb_eval_cmd(trap_list[0], ary_new3(1, INT2FIX(0)));
rb_eval_cmd(trap_list[0], rb_ary_new3(1, INT2FIX(0)));
#endif
}
@ -359,7 +360,7 @@ rb_trap_exec()
}
}
#endif /* MACOS_UNUSE_SIGNAL */
trap_pending = 0;
rb_trap_pending = 0;
}
struct trap_arg {
@ -436,17 +437,17 @@ trap(arg)
s += 3;
sig = signm2signo(s);
if (sig == 0 && strcmp(s, "EXIT") != 0)
ArgError("Invalid signal SIG%s", s);
rb_raise(rb_eArgError, "Invalid signal SIG%s", s);
}
else {
sig = NUM2INT(arg->sig);
}
if (sig < 0 || sig > NSIG) {
ArgError("Invalid signal no %d", sig);
rb_raise(rb_eArgError, "Invalid signal no %d", sig);
}
#if defined(THREAD) && defined(HAVE_SETITIMER) && !defined(__BOW__)
if (sig == SIGVTALRM) {
ArgError("SIGVTALRM reserved for Thread; cannot set handler");
rb_raise(rb_eArgError, "SIGVTALRM reserved for Thread; cannot set handler");
}
#endif
if (func == SIG_DFL) {
@ -503,7 +504,7 @@ trap_ensure(arg)
#endif
void
trap_restore_mask()
rb_trap_restore_mask()
{
#ifndef NT
# ifdef HAVE_SIGPROCMASK
@ -515,7 +516,7 @@ trap_restore_mask()
}
static VALUE
f_trap(argc, argv)
rb_f_trap(argc, argv)
int argc;
VALUE *argv;
{
@ -523,12 +524,12 @@ f_trap(argc, argv)
rb_secure(2);
if (argc == 0 || argc > 2) {
ArgError("wrong # of arguments -- trap(sig, cmd)/trap(sig){...}");
rb_raise(rb_eArgError, "wrong # of arguments -- trap(sig, cmd)/trap(sig){...}");
}
arg.sig = argv[0];
if (argc == 1) {
arg.cmd = f_lambda();
arg.cmd = rb_f_lambda();
}
else if (argc == 2) {
arg.cmd = argv[1];
@ -553,7 +554,7 @@ void
Init_signal()
{
#ifndef MACOS_UNUSE_SIGNAL
rb_define_global_function("trap", f_trap, -1);
rb_define_global_function("trap", rb_f_trap, -1);
#ifdef POSIX_SIGNAL
posix_signal(SIGINT, sighandle);
#else

View file

@ -100,7 +100,7 @@ remove_sign_bits(str, base)
return str;
}
double big2dbl _((VALUE));
double rb_big2dbl _((VALUE));
#define FNONE 0
#define FSHARP 1
@ -125,10 +125,10 @@ double big2dbl _((VALUE));
}
#define GETARG() \
((argc == 0)?(ArgError("too few argument."),0):(argc--,((argv++)[0])))
((argc == 0)?(rb_raise(rb_eArgError, "too few argument."),0):(argc--,((argv++)[0])))
VALUE
f_sprintf(argc, argv)
rb_f_sprintf(argc, argv)
int argc;
VALUE *argv;
{
@ -165,9 +165,9 @@ f_sprintf(argc, argv)
switch (*p) {
default:
if (ISPRINT(*p))
ArgError("malformed format string - %%%c", *p);
rb_raise(rb_eArgError, "malformed format string - %%%c", *p);
else
ArgError("malformed format string");
rb_raise(rb_eArgError, "malformed format string");
break;
case ' ':
@ -203,13 +203,13 @@ f_sprintf(argc, argv)
width = 10 * width + (*p - '0');
}
if (p >= end) {
ArgError("malformed format string - %%[0-9]");
rb_raise(rb_eArgError, "malformed format string - %%[0-9]");
}
goto retry;
case '*':
if (flags & FWIDTH) {
ArgError("width given twice");
rb_raise(rb_eArgError, "width given twice");
}
flags |= FWIDTH;
@ -224,7 +224,7 @@ f_sprintf(argc, argv)
case '.':
if (flags & FPREC) {
ArgError("precision given twice");
rb_raise(rb_eArgError, "precision given twice");
}
prec = 0;
@ -242,7 +242,7 @@ f_sprintf(argc, argv)
prec = 10 * prec + (*p - '0');
}
if (p >= end) {
ArgError("malformed format string - %%.[0-9]");
rb_raise(rb_eArgError, "malformed format string - %%.[0-9]");
}
if (prec > 0)
flags |= FPREC;
@ -275,7 +275,7 @@ f_sprintf(argc, argv)
VALUE arg = GETARG();
int len;
str = obj_as_string(arg);
str = rb_obj_as_string(arg);
len = RSTRING(str)->len;
if (flags&FPREC) {
if (prec < len) {
@ -356,12 +356,12 @@ f_sprintf(argc, argv)
v = FIX2LONG(val);
break;
case T_FLOAT:
val = dbl2big(RFLOAT(val)->value);
val = rb_dbl2big(RFLOAT(val)->value);
if (FIXNUM_P(val)) goto bin_retry;
bignum = 1;
break;
case T_STRING:
val = str2inum(RSTRING(val)->ptr, 10);
val = rb_str2inum(RSTRING(val)->ptr, 10);
goto bin_retry;
case T_BIGNUM:
bignum = 1;
@ -377,7 +377,7 @@ f_sprintf(argc, argv)
else if (*p == 'b') base = 2;
if (!bignum) {
if (base == 2) {
val = int2big(v);
val = rb_int2big(v);
goto bin_retry;
}
if (sign) {
@ -429,7 +429,7 @@ f_sprintf(argc, argv)
}
if (sign) {
val = big2str(val, base);
val = rb_big2str(val, base);
s = RSTRING(val)->ptr;
if (s[0] == '-') {
s++;
@ -447,14 +447,14 @@ f_sprintf(argc, argv)
goto format_integer;
}
if (!RBIGNUM(val)->sign) {
val = big_clone(val);
big_2comp(val);
val = rb_big_clone(val);
rb_big_2comp(val);
}
val = big2str(val, base);
val = rb_big2str(val, base);
s = RSTRING(val)->ptr;
if (*s == '-') {
remove_sign_bits(++s, base);
val = str_new(0, 3+strlen(s));
val = rb_str_new(0, 3+strlen(s));
t = RSTRING(val)->ptr;
strcpy(t, "..");
t += 2;
@ -563,7 +563,7 @@ f_sprintf(argc, argv)
fval = RFLOAT(val)->value;
break;
case T_BIGNUM:
fval = big2dbl(val);
fval = rb_big2dbl(val);
break;
case T_STRING:
fval = atof(RSTRING(val)->ptr);
@ -585,10 +585,10 @@ f_sprintf(argc, argv)
}
sprint_exit:
if (RTEST(verbose) && argc > 1) {
ArgError("too many argument for format string");
if (RTEST(rb_verbose) && argc > 1) {
rb_raise(rb_eArgError, "too many argument for format string");
}
result = str_new(buf, blen);
result = rb_str_new(buf, blen);
free(buf);
return result;

14
st.c
View file

@ -84,12 +84,26 @@ st_init_numtable()
return st_init_table(&type_numhash);
}
st_table*
st_init_numtable_with_size(size)
int size;
{
return st_init_table_with_size(&type_numhash, size);
}
st_table*
st_init_strtable()
{
return st_init_table(&type_strhash);
}
st_table*
st_init_strtable_with_size(size)
int size;
{
return st_init_table_with_size(&type_strhash, size);
}
void
st_free_table(table)
st_table *table;

2
st.h
View file

@ -35,7 +35,9 @@ enum st_retval {ST_CONTINUE, ST_STOP, ST_DELETE};
st_table *st_init_table();
st_table *st_init_table_with_size();
st_table *st_init_numtable();
st_table *st_init_numtable_with_size();
st_table *st_init_strtable();
st_table *st_init_strtable_with_size();
int st_delete(), st_delete_safe(), st_insert();
int st_lookup(), st_find_or_add();
void st_foreach(), st_add_direct(), st_free_table();

1212
string.c

File diff suppressed because it is too large Load diff

250
struct.c
View file

@ -14,7 +14,7 @@
#include <stdio.h>
#endif
VALUE cStruct;
VALUE rb_cStruct;
static VALUE
class_of(obj)
@ -27,7 +27,7 @@ class_of(obj)
}
static VALUE
struct_s_members(obj)
rb_struct_s_members(obj)
VALUE obj;
{
VALUE member, ary;
@ -35,12 +35,12 @@ struct_s_members(obj)
member = rb_iv_get(obj, "__member__");
if (NIL_P(member)) {
Bug("non-initialized struct");
rb_bug("non-initialized struct");
}
ary = ary_new2(RARRAY(member)->len);
ary = rb_ary_new2(RARRAY(member)->len);
p = RARRAY(member)->ptr; pend = p + RARRAY(member)->len;
while (p < pend) {
ary_push(ary, str_new2(rb_id2name(FIX2INT(*p))));
rb_ary_push(ary, rb_str_new2(rb_id2name(FIX2INT(*p))));
p++;
}
@ -48,14 +48,14 @@ struct_s_members(obj)
}
static VALUE
struct_members(obj)
rb_struct_members(obj)
VALUE obj;
{
return struct_s_members(class_of(obj));
return rb_struct_s_members(class_of(obj));
}
VALUE
struct_getmember(obj, id)
rb_struct_getmember(obj, id)
VALUE obj;
ID id;
{
@ -64,7 +64,7 @@ struct_getmember(obj, id)
member = rb_iv_get(class_of(obj), "__member__");
if (NIL_P(member)) {
Bug("non-initialized struct");
rb_bug("non-initialized struct");
}
slot = INT2FIX(id);
for (i=0; i<RARRAY(member)->len; i++) {
@ -72,43 +72,43 @@ struct_getmember(obj, id)
return RSTRUCT(obj)->ptr[i];
}
}
NameError("%s is not struct member", rb_id2name(id));
rb_raise(rb_eNameError, "%s is not struct member", rb_id2name(id));
/* not reached */
}
static VALUE
struct_ref(obj)
rb_struct_ref(obj)
VALUE obj;
{
return struct_getmember(obj, rb_frame_last_func());
return rb_struct_getmember(obj, rb_frame_last_func());
}
static VALUE struct_ref0(obj) VALUE obj; {return RSTRUCT(obj)->ptr[0];}
static VALUE struct_ref1(obj) VALUE obj; {return RSTRUCT(obj)->ptr[1];}
static VALUE struct_ref2(obj) VALUE obj; {return RSTRUCT(obj)->ptr[2];}
static VALUE struct_ref3(obj) VALUE obj; {return RSTRUCT(obj)->ptr[3];}
static VALUE struct_ref4(obj) VALUE obj; {return RSTRUCT(obj)->ptr[4];}
static VALUE struct_ref5(obj) VALUE obj; {return RSTRUCT(obj)->ptr[5];}
static VALUE struct_ref6(obj) VALUE obj; {return RSTRUCT(obj)->ptr[6];}
static VALUE struct_ref7(obj) VALUE obj; {return RSTRUCT(obj)->ptr[7];}
static VALUE struct_ref8(obj) VALUE obj; {return RSTRUCT(obj)->ptr[8];}
static VALUE struct_ref9(obj) VALUE obj; {return RSTRUCT(obj)->ptr[9];}
static VALUE rb_struct_ref0(obj) VALUE obj; {return RSTRUCT(obj)->ptr[0];}
static VALUE rb_struct_ref1(obj) VALUE obj; {return RSTRUCT(obj)->ptr[1];}
static VALUE rb_struct_ref2(obj) VALUE obj; {return RSTRUCT(obj)->ptr[2];}
static VALUE rb_struct_ref3(obj) VALUE obj; {return RSTRUCT(obj)->ptr[3];}
static VALUE rb_struct_ref4(obj) VALUE obj; {return RSTRUCT(obj)->ptr[4];}
static VALUE rb_struct_ref5(obj) VALUE obj; {return RSTRUCT(obj)->ptr[5];}
static VALUE rb_struct_ref6(obj) VALUE obj; {return RSTRUCT(obj)->ptr[6];}
static VALUE rb_struct_ref7(obj) VALUE obj; {return RSTRUCT(obj)->ptr[7];}
static VALUE rb_struct_ref8(obj) VALUE obj; {return RSTRUCT(obj)->ptr[8];}
static VALUE rb_struct_ref9(obj) VALUE obj; {return RSTRUCT(obj)->ptr[9];}
VALUE (*ref_func[10])() = {
struct_ref0,
struct_ref1,
struct_ref2,
struct_ref3,
struct_ref4,
struct_ref5,
struct_ref6,
struct_ref7,
struct_ref8,
struct_ref9,
rb_struct_ref0,
rb_struct_ref1,
rb_struct_ref2,
rb_struct_ref3,
rb_struct_ref4,
rb_struct_ref5,
rb_struct_ref6,
rb_struct_ref7,
rb_struct_ref8,
rb_struct_ref9,
};
static VALUE
struct_set(obj, val)
rb_struct_set(obj, val)
VALUE obj, val;
{
VALUE member, slot;
@ -116,15 +116,15 @@ struct_set(obj, val)
member = rb_iv_get(class_of(obj), "__member__");
if (NIL_P(member)) {
Fatal("non-initialized struct");
rb_bug("non-initialized struct");
}
for (i=0; i<RARRAY(member)->len; i++) {
slot = RARRAY(member)->ptr[i];
if (id_attrset(FIX2INT(slot)) == rb_frame_last_func()) {
if (rb_id_attrset(FIX2INT(slot)) == rb_frame_last_func()) {
return RSTRUCT(obj)->ptr[i] = val;
}
}
NameError("not struct member");
rb_raise(rb_eNameError, "not struct member");
/* not reached */
}
@ -137,31 +137,31 @@ make_struct(name, member, klass)
int i;
if (NIL_P(name)) {
nstr = class_new(klass);
nstr = rb_class_new(klass);
}
else {
char *cname = STR2CSTR(name);
id = rb_intern(cname);
if (!rb_is_const_id(id)) {
NameError("identifier %s needs to be constant", cname);
rb_raise(rb_eNameError, "identifier %s needs to be constant", cname);
}
nstr = rb_define_class_under(klass, cname, klass);
}
rb_iv_set(nstr, "__size__", INT2FIX(RARRAY(member)->len));
rb_iv_set(nstr, "__member__", member);
rb_define_singleton_method(nstr, "new", struct_alloc, -2);
rb_define_singleton_method(nstr, "[]", struct_alloc, -2);
rb_define_singleton_method(nstr, "members", struct_s_members, 0);
rb_define_singleton_method(nstr, "new", rb_struct_alloc, -2);
rb_define_singleton_method(nstr, "[]", rb_struct_alloc, -2);
rb_define_singleton_method(nstr, "members", rb_struct_s_members, 0);
for (i=0; i< RARRAY(member)->len; i++) {
ID id = FIX2INT(RARRAY(member)->ptr[i]);
if (i<10) {
rb_define_method_id(nstr, id, ref_func[i], 0);
}
else {
rb_define_method_id(nstr, id, struct_ref, 0);
rb_define_method_id(nstr, id, rb_struct_ref, 0);
}
rb_define_method_id(nstr, id_attrset(id), struct_set, 1);
rb_define_method_id(nstr, rb_id_attrset(id), rb_struct_set, 1);
}
return nstr;
@ -177,9 +177,9 @@ make_struct(name, member, klass)
VALUE
#ifdef HAVE_STDARG_PROTOTYPES
struct_define(char *name, ...)
rb_struct_define(char *name, ...)
#else
struct_define(name, va_alist)
rb_struct_define(name, va_alist)
char *name;
va_dcl
#endif
@ -188,21 +188,21 @@ struct_define(name, va_alist)
VALUE nm, ary;
char *mem;
nm = str_new2(name);
ary = ary_new();
nm = rb_str_new2(name);
ary = rb_ary_new();
va_init_list(ar, name);
while (mem = va_arg(ar, char*)) {
ID slot = rb_intern(mem);
ary_push(ary, INT2FIX(slot));
rb_ary_push(ary, INT2FIX(slot));
}
va_end(ar);
return make_struct(nm, ary, cStruct);
return make_struct(nm, ary, rb_cStruct);
}
static VALUE
struct_s_def(argc, argv, klass)
rb_struct_s_def(argc, argv, klass)
int argc;
VALUE *argv;
{
@ -216,13 +216,13 @@ struct_s_def(argc, argv, klass)
RARRAY(rest)->ptr[i] = INT2FIX(id);
}
st = make_struct(name, rest, klass);
obj_call_init(st);
rb_obj_call_init(st);
return st;
}
VALUE
struct_alloc(klass, values)
rb_struct_alloc(klass, values)
VALUE klass, values;
{
VALUE size;
@ -230,8 +230,8 @@ struct_alloc(klass, values)
size = rb_iv_get(klass, "__size__");
n = FIX2INT(size);
if (n < RARRAY(values)->len) {
ArgError("struct size differs");
if (n != RARRAY(values)->len) {
rb_raise(rb_eArgError, "struct size differs");
}
else {
NEWOBJ(st, struct RStruct);
@ -240,8 +240,7 @@ struct_alloc(klass, values)
st->ptr = ALLOC_N(VALUE, n);
st->len = n;
MEMCPY(st->ptr, RARRAY(values)->ptr, VALUE, RARRAY(values)->len);
memclear(st->ptr+RARRAY(values)->len, n-RARRAY(values)->len);
obj_call_init((VALUE)st);
rb_obj_call_init((VALUE)st);
return (VALUE)st;
}
@ -250,32 +249,32 @@ struct_alloc(klass, values)
VALUE
#ifdef HAVE_STDARG_PROTOTYPES
struct_new(VALUE klass, ...)
rb_struct_new(VALUE klass, ...)
#else
struct_new(klass, va_alist)
rb_struct_new(klass, va_alist)
VALUE klass;
va_dcl
#endif
{
VALUE val, mem;
int size;
int size, i;
va_list args;
val = rb_iv_get(klass, "__size__");
size = FIX2INT(val);
mem = ary_new();
mem = rb_ary_new2(size);
va_init_list(args, klass);
while (size--) {
for (i=0; i<size; i++) {
val = va_arg(args, VALUE);
ary_push(mem, val);
rb_ary_store(mem, i, val);
}
va_end(args);
return struct_alloc(klass, mem);
return rb_struct_alloc(klass, mem);
}
static VALUE
struct_each(s)
rb_struct_each(s)
VALUE s;
{
int i;
@ -287,19 +286,14 @@ struct_each(s)
}
static VALUE
struct_to_s(s)
rb_struct_to_s(s)
VALUE s;
{
char *name, *buf;
name = rb_class2name(CLASS_OF(s));
buf = ALLOCA_N(char, strlen(name)+1);
sprintf(buf, "%s", name);
return str_new2(buf);
return rb_str_new2(rb_class2name(CLASS_OF(s)));
}
static VALUE
struct_inspect(s)
rb_struct_inspect(s)
VALUE s;
{
char *name = rb_class2name(CLASS_OF(s));
@ -308,40 +302,40 @@ struct_inspect(s)
member = rb_iv_get(CLASS_OF(s), "__member__");
if (NIL_P(member)) {
Fatal("non-initialized struct");
rb_bug("non-initialized struct");
}
str = str_new2("#<");
str_cat(str, name, strlen(name));
str_cat(str, " ", 1);
str = rb_str_new2("#<");
rb_str_cat(str, name, strlen(name));
rb_str_cat(str, " ", 1);
for (i=0; i<RSTRUCT(s)->len; i++) {
VALUE str2, slot;
char *p;
if (i > 0) {
str_cat(str, ", ", 2);
rb_str_cat(str, ", ", 2);
}
slot = RARRAY(member)->ptr[i];
p = rb_id2name(FIX2INT(slot));
str_cat(str, p, strlen(p));
str_cat(str, "=", 1);
rb_str_cat(str, p, strlen(p));
rb_str_cat(str, "=", 1);
str2 = rb_inspect(RSTRUCT(s)->ptr[i]);
str_cat(str, RSTRING(str2)->ptr, RSTRING(str2)->len);
rb_str_cat(str, RSTRING(str2)->ptr, RSTRING(str2)->len);
}
str_cat(str, ">", 1);
rb_str_cat(str, ">", 1);
return str;
}
static VALUE
struct_to_a(s)
rb_struct_to_a(s)
VALUE s;
{
return ary_new4(RSTRUCT(s)->len, RSTRUCT(s)->ptr);
return rb_ary_new4(RSTRUCT(s)->len, RSTRUCT(s)->ptr);
}
static VALUE
struct_clone(s)
rb_struct_clone(s)
VALUE s;
{
NEWOBJ(st, struct RStruct);
@ -355,7 +349,7 @@ struct_clone(s)
}
static VALUE
struct_aref_id(s, id)
rb_struct_aref_id(s, id)
VALUE s;
ID id;
{
@ -364,7 +358,7 @@ struct_aref_id(s, id)
member = rb_iv_get(CLASS_OF(s), "__member__");
if (NIL_P(member)) {
Bug("non-initialized struct");
rb_bug("non-initialized struct");
}
len = RARRAY(member)->len;
@ -373,30 +367,32 @@ struct_aref_id(s, id)
return RSTRUCT(s)->ptr[i];
}
}
NameError("no member '%s' in struct", rb_id2name(id));
rb_raise(rb_eNameError, "no member '%s' in struct", rb_id2name(id));
}
VALUE
struct_aref(s, idx)
rb_struct_aref(s, idx)
VALUE s, idx;
{
int i;
if (TYPE(idx) == T_STRING) {
return struct_aref_id(s, rb_to_id(idx));
return rb_struct_aref_id(s, rb_to_id(idx));
}
i = NUM2INT(idx);
if (i < 0) i = RSTRUCT(s)->len + i;
if (i < 0)
IndexError("offset %d too small for struct(size:%d)", i, RSTRUCT(s)->len);
rb_raise(rb_eIndexError, "offset %d too small for struct(size:%d)",
i, RSTRUCT(s)->len);
if (RSTRUCT(s)->len <= i)
IndexError("offset %d too large for struct(size:%d)", i, RSTRUCT(s)->len);
rb_raise(rb_eIndexError, "offset %d too large for struct(size:%d)",
i, RSTRUCT(s)->len);
return RSTRUCT(s)->ptr[i];
}
static VALUE
struct_aset_id(s, id, val)
rb_struct_aset_id(s, id, val)
VALUE s, val;
ID id;
{
@ -405,7 +401,7 @@ struct_aset_id(s, id, val)
member = rb_iv_get(CLASS_OF(s), "__member__");
if (NIL_P(member)) {
Bug("non-initialized struct");
rb_bug("non-initialized struct");
}
len = RARRAY(member)->len;
@ -415,66 +411,68 @@ struct_aset_id(s, id, val)
return val;
}
}
NameError("no member '%s' in struct", rb_id2name(id));
rb_raise(rb_eNameError, "no member '%s' in struct", rb_id2name(id));
}
VALUE
struct_aset(s, idx, val)
rb_struct_aset(s, idx, val)
VALUE s, idx, val;
{
int i;
if (TYPE(idx) == T_STRING) {
return struct_aset_id(s, rb_to_id(idx), val);
return rb_struct_aset_id(s, rb_to_id(idx), val);
}
i = NUM2INT(idx);
if (i < 0) i = RSTRUCT(s)->len + i;
if (i < 0)
IndexError("offset %d too small for struct(size:%d)", i, RSTRUCT(s)->len);
rb_raise(rb_eIndexError, "offset %d too small for struct(size:%d)",
i, RSTRUCT(s)->len);
if (RSTRUCT(s)->len <= i)
IndexError("offset %d too large for struct(size:%d)", i, RSTRUCT(s)->len);
rb_raise(rb_eIndexError, "offset %d too large for struct(size:%d)",
i, RSTRUCT(s)->len);
return RSTRUCT(s)->ptr[i] = val;
}
static VALUE
struct_equal(s, s2)
rb_struct_equal(s, s2)
VALUE s, s2;
{
int i;
if (TYPE(s2) != T_STRUCT) return FALSE;
if (CLASS_OF(s) != CLASS_OF(s2)) return FALSE;
if (TYPE(s2) != T_STRUCT) return Qfalse;
if (CLASS_OF(s) != CLASS_OF(s2)) return Qfalse;
if (RSTRUCT(s)->len != RSTRUCT(s2)->len) {
Bug("inconsistent struct"); /* should never happen */
rb_bug("inconsistent struct"); /* should never happen */
}
for (i=0; i<RSTRUCT(s)->len; i++) {
if (!rb_equal(RSTRUCT(s)->ptr[i], RSTRUCT(s2)->ptr[i])) return FALSE;
if (!rb_equal(RSTRUCT(s)->ptr[i], RSTRUCT(s2)->ptr[i])) return Qfalse;
}
return TRUE;
return Qtrue;
}
static VALUE
struct_eql(s, s2)
rb_struct_eql(s, s2)
VALUE s, s2;
{
int i;
if (TYPE(s2) != T_STRUCT) return FALSE;
if (CLASS_OF(s) != CLASS_OF(s2)) return FALSE;
if (TYPE(s2) != T_STRUCT) return Qfalse;
if (CLASS_OF(s) != CLASS_OF(s2)) return Qfalse;
if (RSTRUCT(s)->len != RSTRUCT(s2)->len) {
Bug("inconsistent struct"); /* should never happen */
rb_bug("inconsistent struct"); /* should never happen */
}
for (i=0; i<RSTRUCT(s)->len; i++) {
if (!rb_eql(RSTRUCT(s)->ptr[i], RSTRUCT(s2)->ptr[i])) return FALSE;
if (!rb_eql(RSTRUCT(s)->ptr[i], RSTRUCT(s2)->ptr[i])) return Qfalse;
}
return TRUE;
return Qtrue;
}
static VALUE
struct_hash(s)
rb_struct_hash(s)
VALUE s;
{
int i, h;
@ -489,25 +487,25 @@ struct_hash(s)
void
Init_Struct()
{
cStruct = rb_define_class("Struct", cObject);
rb_include_module(cStruct, mEnumerable);
rb_cStruct = rb_define_class("Struct", rb_cObject);
rb_include_module(rb_cStruct, rb_mEnumerable);
rb_define_singleton_method(cStruct, "new", struct_s_def, -1);
rb_define_singleton_method(rb_cStruct, "new", rb_struct_s_def, -1);
rb_define_method(cStruct, "clone", struct_clone, 0);
rb_define_method(rb_cStruct, "clone", rb_struct_clone, 0);
rb_define_method(cStruct, "==", struct_equal, 1);
rb_define_method(cStruct, "eql?", struct_eql, 1);
rb_define_method(cStruct, "hash", struct_hash, 0);
rb_define_method(rb_cStruct, "==", rb_struct_equal, 1);
rb_define_method(rb_cStruct, "eql?", rb_struct_eql, 1);
rb_define_method(rb_cStruct, "hash", rb_struct_hash, 0);
rb_define_method(cStruct, "to_s", struct_to_s, 0);
rb_define_method(cStruct, "inspect", struct_inspect, 0);
rb_define_method(cStruct, "to_a", struct_to_a, 0);
rb_define_method(cStruct, "values", struct_to_a, 0);
rb_define_method(rb_cStruct, "to_s", rb_struct_to_s, 0);
rb_define_method(rb_cStruct, "inspect", rb_struct_inspect, 0);
rb_define_method(rb_cStruct, "to_a", rb_struct_to_a, 0);
rb_define_method(rb_cStruct, "values", rb_struct_to_a, 0);
rb_define_method(cStruct, "each", struct_each, 0);
rb_define_method(cStruct, "[]", struct_aref, 1);
rb_define_method(cStruct, "[]=", struct_aset, 2);
rb_define_method(rb_cStruct, "each", rb_struct_each, 0);
rb_define_method(rb_cStruct, "[]", rb_struct_aref, 1);
rb_define_method(rb_cStruct, "[]=", rb_struct_aset, 2);
rb_define_method(cStruct, "members", struct_members, 0);
rb_define_method(rb_cStruct, "members", rb_struct_members, 0);
}

176
time.c
View file

@ -35,7 +35,7 @@ struct timeval {
#endif
#include <math.h>
static VALUE cTime;
VALUE rb_cTime;
#if defined(HAVE_TIMES) || defined(NT)
static VALUE S_Tms;
#endif
@ -66,7 +66,7 @@ time_s_now(klass)
if (gettimeofday(&(tobj->tv), 0) == -1) {
rb_sys_fail("gettimeofday");
}
obj_call_init(obj);
rb_obj_call_init(obj);
return obj;
}
@ -88,14 +88,14 @@ time_new_internal(klass, sec, usec)
}
VALUE
time_new(sec, usec)
rb_time_new(sec, usec)
int sec, usec;
{
return time_new_internal(cTime, sec, usec);
return time_new_internal(rb_cTime, sec, usec);
}
struct timeval
time_timeval(time)
rb_time_timeval(time)
VALUE time;
{
struct time_object *tobj;
@ -105,7 +105,7 @@ time_timeval(time)
case T_FIXNUM:
t.tv_sec = FIX2UINT(time);
if (t.tv_sec < 0)
ArgError("time must be positive");
rb_raise(rb_eArgError, "time must be positive");
t.tv_usec = 0;
break;
@ -114,7 +114,7 @@ time_timeval(time)
double seconds, microseconds;
if (RFLOAT(time)->value < 0.0)
ArgError("time must be positive");
rb_raise(rb_eArgError, "time must be positive");
seconds = floor(RFLOAT(time)->value);
microseconds = (RFLOAT(time)->value - seconds) * 1000000.0;
t.tv_sec = seconds;
@ -128,9 +128,9 @@ time_timeval(time)
break;
default:
if (!obj_is_kind_of(time, cTime)) {
TypeError("Can't convert %s into Time",
rb_class2name(CLASS_OF(time)));
if (!rb_obj_is_kind_of(time, rb_cTime)) {
rb_raise(rb_eTypeError, "Can't convert %s into Time",
rb_class2name(CLASS_OF(time)));
}
GetTimeval(time, tobj);
t = tobj->tv;
@ -145,7 +145,7 @@ time_s_at(klass, time)
{
struct timeval tv;
tv = time_timeval(time);
tv = rb_time_timeval(time);
return time_new_internal(klass, tv.tv_sec, tv.tv_usec);
}
@ -159,7 +159,7 @@ obj2int(obj)
VALUE obj;
{
if (TYPE(obj) == T_STRING) {
obj = str2inum(RSTRING(obj)->ptr, 10);
obj = rb_str2inum(RSTRING(obj)->ptr, 10);
}
return NUM2INT(obj);
@ -233,7 +233,7 @@ time_arg(argc, argv, args)
|| args[3] < 0 || args[3] > 23
|| args[4] < 0 || args[4] > 60
|| args[5] < 0 || args[5] > 61)
ArgError("argument out of range");
rb_raise(rb_eArgError, "argument out of range");
}
static VALUE time_gmtime _((VALUE));
@ -264,7 +264,7 @@ time_gm_or_local(argc, argv, gm_or_local, klass)
t = args[0];
while (diff = t - (tm->tm_year)) {
guess += diff * 364 * 24 * 3600;
if (guess < 0) ArgError("too far future");
if (guess < 0) rb_raise(rb_eArgError, "too far future");
tm = (*fn)(&guess);
if (!tm) goto error;
}
@ -284,7 +284,7 @@ time_gm_or_local(argc, argv, gm_or_local, klass)
return time_localtime(time);
error:
ArgError("gmtime/localtime error");
rb_raise(rb_eArgError, "gmtime/localtime error");
}
static VALUE
@ -312,7 +312,7 @@ time_to_i(time)
struct time_object *tobj;
GetTimeval(time, tobj);
return int2inum(tobj->tv.tv_sec);
return rb_int2inum(tobj->tv.tv_sec);
}
static VALUE
@ -322,7 +322,7 @@ time_to_f(time)
struct time_object *tobj;
GetTimeval(time, tobj);
return float_new((double)tobj->tv.tv_sec+(double)tobj->tv.tv_usec/1000000);
return rb_float_new((double)tobj->tv.tv_sec+(double)tobj->tv.tv_usec/1000000);
}
static VALUE
@ -362,7 +362,7 @@ time_cmp(time1, time2)
}
}
if (obj_is_instance_of(time2, cTime)) {
if (rb_obj_is_instance_of(time2, rb_cTime)) {
GetTimeval(time2, tobj2);
if (tobj1->tv.tv_sec == tobj2->tv.tv_sec) {
if (tobj1->tv.tv_usec == tobj2->tv.tv_usec) return INT2FIX(0);
@ -385,13 +385,13 @@ time_eql(time1, time2)
struct time_object *tobj1, *tobj2;
GetTimeval(time1, tobj1);
if (obj_is_instance_of(time2, cTime)) {
if (rb_obj_is_instance_of(time2, rb_cTime)) {
GetTimeval(time2, tobj2);
if (tobj1->tv.tv_sec == tobj2->tv.tv_sec) {
if (tobj1->tv.tv_usec == tobj2->tv.tv_usec) return TRUE;
if (tobj1->tv.tv_usec == tobj2->tv.tv_usec) return Qtrue;
}
}
return FALSE;
return Qfalse;
}
static VALUE
@ -454,7 +454,7 @@ time_asctime(time)
s = asctime(&(tobj->tm));
if (s[24] == '\n') s[24] = '\0';
return str_new2(s);
return rb_str_new2(s);
}
static VALUE
@ -478,7 +478,7 @@ time_to_s(time)
{
len = strftime(buf, 64, "%a %b %d %H:%M:%S %Z %Y", &(tobj->tm));
}
return str_new(buf, len);
return rb_str_new(buf, len);
}
static VALUE
@ -494,7 +494,7 @@ time_plus(time1, time2)
sec = tobj1->tv.tv_sec + nsec;
usec = tobj1->tv.tv_usec + (RFLOAT(time2)->value - (double)nsec)*1e6;
}
else if (obj_is_instance_of(time2, cTime)) {
else if (rb_obj_is_instance_of(time2, rb_cTime)) {
GetTimeval(time2, tobj2);
sec = tobj1->tv.tv_sec + tobj2->tv.tv_sec;
usec = tobj1->tv.tv_usec + tobj2->tv.tv_usec;
@ -508,7 +508,7 @@ time_plus(time1, time2)
sec++;
usec -= 1000000;
}
return time_new(sec, usec);
return rb_time_new(sec, usec);
}
static VALUE
@ -519,7 +519,7 @@ time_minus(time1, time2)
int sec, usec;
GetTimeval(time1, tobj1);
if (obj_is_instance_of(time2, cTime)) {
if (rb_obj_is_instance_of(time2, rb_cTime)) {
double f;
GetTimeval(time2, tobj2);
@ -527,7 +527,7 @@ time_minus(time1, time2)
f += (tobj1->tv.tv_usec - tobj2->tv.tv_usec)*1e-6;
return float_new(f);
return rb_float_new(f);
}
else if (TYPE(time2) == T_FLOAT) {
sec = tobj1->tv.tv_sec - (int)RFLOAT(time2)->value;
@ -542,7 +542,7 @@ time_minus(time1, time2)
sec--;
usec += 1000000;
}
return time_new(sec, usec);
return rb_time_new(sec, usec);
}
static VALUE
@ -607,7 +607,6 @@ time_mon(time)
if (tobj->tm_got == 0) {
time_localtime(time);
}
Warning("Time#month now start from 1 for January");
return INT2FIX(tobj->tm.tm_mon+1);
}
@ -621,7 +620,6 @@ time_year(time)
if (tobj->tm_got == 0) {
time_localtime(time);
}
Warning("Time#year now returns 19xx");
return INT2FIX(tobj->tm.tm_year+1900);
}
@ -661,8 +659,7 @@ time_isdst(time)
if (tobj->tm_got == 0) {
time_localtime(time);
}
Warning("Time#isdst now returns boolean value");
return tobj->tm.tm_isdst?TRUE:FALSE;
return tobj->tm.tm_isdst?Qtrue:Qfalse;
}
static VALUE
@ -679,7 +676,7 @@ time_zone(time)
}
len = strftime(buf, 10, "%Z", &(tobj->tm));
return str_new(buf, len);
return rb_str_new(buf, len);
}
static VALUE
@ -692,8 +689,7 @@ time_to_a(time)
if (tobj->tm_got == 0) {
time_localtime(time);
}
Warning("Time#to_a's return values are now changed");
return ary_new3(10,
return rb_ary_new3(10,
INT2FIX(tobj->tm.tm_sec),
INT2FIX(tobj->tm.tm_min),
INT2FIX(tobj->tm.tm_hour),
@ -702,7 +698,7 @@ time_to_a(time)
INT2FIX(tobj->tm.tm_year+1900),
INT2FIX(tobj->tm.tm_wday),
INT2FIX(tobj->tm.tm_yday),
tobj->tm.tm_isdst?TRUE:FALSE,
tobj->tm.tm_isdst?Qtrue:Qfalse,
time_zone(time));
}
@ -728,7 +724,7 @@ rb_strftime(buf, format, time)
return len;
}
ArgError("bad strftime format or result too long");
rb_raise(rb_eArgError, "bad strftime format or result too long");
}
static VALUE
@ -751,17 +747,17 @@ time_strftime(time, format)
/* Ruby string may contain \0's. */
char *p = fmt, *pe = fmt + len;
str = str_new(0, 0);
str = rb_str_new(0, 0);
while (p < pe) {
len = rb_strftime(&buf, p, &(tobj->tm));
str_cat(str, buf, len);
rb_str_cat(str, buf, len);
p += strlen(p) + 1;
if (len > SMALLBUF) free(buf);
}
return str;
}
len = rb_strftime(&buf, RSTRING(format)->ptr, &(tobj->tm));
str = str_new(buf, len);
str = rb_str_new(buf, len);
if (buf != buffer) free(buf);
return str;
}
@ -777,11 +773,11 @@ time_s_times(obj)
struct tms buf;
if (times(&buf) == -1) rb_sys_fail(0);
return struct_new(S_Tms,
float_new((double)buf.tms_utime / HZ),
float_new((double)buf.tms_stime / HZ),
float_new((double)buf.tms_cutime / HZ),
float_new((double)buf.tms_cstime / HZ));
return rb_struct_new(S_Tms,
rb_float_new((double)buf.tms_utime / HZ),
rb_float_new((double)buf.tms_stime / HZ),
rb_float_new((double)buf.tms_cutime / HZ),
rb_float_new((double)buf.tms_cstime / HZ));
#else
#ifdef NT
FILETIME create, exit, kernel, user;
@ -789,11 +785,11 @@ time_s_times(obj)
hProc = GetCurrentProcess();
GetProcessTimes(hProc,&create, &exit, &kernel, &user);
return struct_new(S_Tms,
float_new((double)(kernel.dwHighDateTime*2e32+kernel.dwLowDateTime)/2e6),
float_new((double)(user.dwHighDateTime*2e32+user.dwLowDateTime)/2e6),
float_new((double)0),
float_new((double)0));
return rb_struct_new(S_Tms,
rb_float_new((double)(kernel.dwHighDateTime*2e32+kernel.dwLowDateTime)/2e6),
rb_float_new((double)(user.dwHighDateTime*2e32+user.dwLowDateTime)/2e6),
rb_float_new((double)0),
rb_float_new((double)0));
#else
rb_notimplement();
#endif
@ -803,55 +799,55 @@ time_s_times(obj)
void
Init_Time()
{
cTime = rb_define_class("Time", cObject);
rb_include_module(cTime, mComparable);
rb_cTime = rb_define_class("Time", rb_cObject);
rb_include_module(rb_cTime, rb_mComparable);
rb_define_singleton_method(cTime, "now", time_s_now, 0);
rb_define_singleton_method(cTime, "new", time_s_now, 0);
rb_define_singleton_method(cTime, "at", time_s_at, 1);
rb_define_singleton_method(cTime, "gm", time_s_timegm, -1);
rb_define_singleton_method(cTime, "local", time_s_timelocal, -1);
rb_define_singleton_method(cTime, "mktime", time_s_timelocal, -1);
rb_define_singleton_method(rb_cTime, "now", time_s_now, 0);
rb_define_singleton_method(rb_cTime, "new", time_s_now, 0);
rb_define_singleton_method(rb_cTime, "at", time_s_at, 1);
rb_define_singleton_method(rb_cTime, "gm", time_s_timegm, -1);
rb_define_singleton_method(rb_cTime, "local", time_s_timelocal, -1);
rb_define_singleton_method(rb_cTime, "mktime", time_s_timelocal, -1);
rb_define_singleton_method(cTime, "times", time_s_times, 0);
rb_define_singleton_method(rb_cTime, "times", time_s_times, 0);
rb_define_method(cTime, "to_i", time_to_i, 0);
rb_define_method(cTime, "to_f", time_to_f, 0);
rb_define_method(cTime, "<=>", time_cmp, 1);
rb_define_method(cTime, "eql?", time_eql, 0);
rb_define_method(cTime, "hash", time_hash, 0);
rb_define_method(rb_cTime, "to_i", time_to_i, 0);
rb_define_method(rb_cTime, "to_f", time_to_f, 0);
rb_define_method(rb_cTime, "<=>", time_cmp, 1);
rb_define_method(rb_cTime, "eql?", time_eql, 0);
rb_define_method(rb_cTime, "hash", time_hash, 0);
rb_define_method(cTime, "localtime", time_localtime, 0);
rb_define_method(cTime, "gmtime", time_gmtime, 0);
rb_define_method(cTime, "ctime", time_asctime, 0);
rb_define_method(cTime, "asctime", time_asctime, 0);
rb_define_method(cTime, "to_s", time_to_s, 0);
rb_define_method(cTime, "inspect", time_to_s, 0);
rb_define_method(cTime, "to_a", time_to_a, 0);
rb_define_method(rb_cTime, "localtime", time_localtime, 0);
rb_define_method(rb_cTime, "gmtime", time_gmtime, 0);
rb_define_method(rb_cTime, "ctime", time_asctime, 0);
rb_define_method(rb_cTime, "asctime", time_asctime, 0);
rb_define_method(rb_cTime, "to_s", time_to_s, 0);
rb_define_method(rb_cTime, "inspect", time_to_s, 0);
rb_define_method(rb_cTime, "to_a", time_to_a, 0);
rb_define_method(cTime, "+", time_plus, 1);
rb_define_method(cTime, "-", time_minus, 1);
rb_define_method(rb_cTime, "+", time_plus, 1);
rb_define_method(rb_cTime, "-", time_minus, 1);
rb_define_method(cTime, "sec", time_sec, 0);
rb_define_method(cTime, "min", time_min, 0);
rb_define_method(cTime, "hour", time_hour, 0);
rb_define_method(cTime, "mday", time_mday, 0);
rb_define_method(cTime, "day", time_mday, 0);
rb_define_method(cTime, "mon", time_mon, 0);
rb_define_method(cTime, "month", time_mon, 0);
rb_define_method(cTime, "year", time_year, 0);
rb_define_method(cTime, "wday", time_wday, 0);
rb_define_method(cTime, "yday", time_yday, 0);
rb_define_method(cTime, "isdst", time_isdst, 0);
rb_define_method(cTime, "zone", time_zone, 0);
rb_define_method(rb_cTime, "sec", time_sec, 0);
rb_define_method(rb_cTime, "min", time_min, 0);
rb_define_method(rb_cTime, "hour", time_hour, 0);
rb_define_method(rb_cTime, "mday", time_mday, 0);
rb_define_method(rb_cTime, "day", time_mday, 0);
rb_define_method(rb_cTime, "mon", time_mon, 0);
rb_define_method(rb_cTime, "month", time_mon, 0);
rb_define_method(rb_cTime, "year", time_year, 0);
rb_define_method(rb_cTime, "wday", time_wday, 0);
rb_define_method(rb_cTime, "yday", time_yday, 0);
rb_define_method(rb_cTime, "isdst", time_isdst, 0);
rb_define_method(rb_cTime, "zone", time_zone, 0);
rb_define_method(cTime, "tv_sec", time_to_i, 0);
rb_define_method(cTime, "tv_usec", time_usec, 0);
rb_define_method(cTime, "usec", time_usec, 0);
rb_define_method(rb_cTime, "tv_sec", time_to_i, 0);
rb_define_method(rb_cTime, "tv_usec", time_usec, 0);
rb_define_method(rb_cTime, "usec", time_usec, 0);
rb_define_method(cTime, "strftime", time_strftime, 1);
rb_define_method(rb_cTime, "strftime", time_strftime, 1);
#if defined(HAVE_TIMES) || defined(NT)
S_Tms = struct_define("Tms", "utime", "stime", "cutime", "cstime", 0);
S_Tms = rb_struct_define("Tms", "utime", "stime", "cutime", "cstime", 0);
#endif
}

35
util.c
View file

@ -19,14 +19,26 @@
#include "missing/file.h"
#endif
VALUE
rb_class_of(obj)
VALUE obj;
{
if (FIXNUM_P(obj)) return rb_cFixnum;
if (obj == Qnil) return rb_cNilClass;
if (obj == Qfalse) return rb_cFalseClass;
if (obj == Qtrue) return rb_cTrueClass;
return RBASIC(obj)->klass;
}
int
rb_type(obj)
VALUE obj;
{
if (FIXNUM_P(obj)) return T_FIXNUM;
if (obj == Qnil) return T_NIL;
if (obj == FALSE) return T_FALSE;
if (obj == TRUE) return T_TRUE;
if (obj == Qfalse) return T_FALSE;
if (obj == Qtrue) return T_TRUE;
return BUILTIN_TYPE(obj);
}
@ -35,19 +47,19 @@ int
rb_special_const_p(obj)
VALUE obj;
{
if (FIXNUM_P(obj)) return TRUE;
if (obj == Qnil) return TRUE;
if (obj == FALSE) return TRUE;
if (obj == TRUE) return TRUE;
if (FIXNUM_P(obj)) return Qtrue;
if (obj == Qnil) return Qtrue;
if (obj == Qfalse) return Qtrue;
if (obj == Qtrue) return Qtrue;
return FALSE;
return Qfalse;
}
int
rb_test_false_or_nil(v)
VALUE v;
{
return (v != Qnil) && (v != FALSE);
return (v != Qnil) && (v != Qfalse);
}
#include "util.h"
@ -229,12 +241,13 @@ add_suffix(VALUE str, char *suffix)
char buf[1024];
if (RSTRING(str)->len > 1000)
Fatal("Cannot do inplace edit on long filename (%d characters)", RSTRING(str)->len);
rb_fatal("Cannot do inplace edit on long filename (%d characters)",
RSTRING(str)->len);
#if defined(DJGPP) || defined(__CYGWIN32__) || defined(NT)
/* Style 0 */
slen = RSTRING(str)->len;
str_cat(str, suffix, extlen);
rb_str_cat(str, suffix, extlen);
#if defined(DJGPP)
if (_USE_LFN) return;
#else
@ -277,7 +290,7 @@ add_suffix(VALUE str, char *suffix)
fallback:
(void)memcpy(p, strEQ(ext, suffix1) ? suffix2 : suffix1, 5);
}
str_resize(str, strlen(buf));
rb_str_resize(str, strlen(buf));
memcpy(RSTRING(str)->ptr, buf, RSTRING(str)->len);
}

9
util.h
View file

@ -12,7 +12,16 @@
#ifndef UTIL_H
#define UTIL_H
#define scan_oct ruby_scan_oct
unsigned long scan_oct();
#define scan_hex ruby_scan_hex
unsigned long scan_hex();
#if defined(MSDOS) || defined(__CYGWIN32__) || defined(NT)
#define add_suffix ruby_add_suffix
void add_suffix();
#endif
char *ruby_mktemp();
#endif /* UTIL_H */

View file

@ -19,20 +19,12 @@ char* strdup(char*);
static st_table *rb_global_tbl;
st_table *rb_class_tbl;
#define global_tbl rb_global_tbl
#define class_tbl rb_class_tbl
st_table*
new_idhash()
{
return st_init_numtable();
}
void
Init_var_tables()
{
global_tbl = new_idhash();
class_tbl = new_idhash();
rb_global_tbl = st_init_numtable();
rb_class_tbl = st_init_numtable();
}
struct fc_result {
@ -56,19 +48,19 @@ fc_i(key, value, res)
name = rb_id2name(key);
if (res->path) {
path = str_dup(res->path);
str_cat(path, "::", 2);
str_cat(path, name, strlen(name));
path = rb_str_dup(res->path);
rb_str_cat(path, "::", 2);
rb_str_cat(path, name, strlen(name));
}
else {
path = str_new2(name);
path = rb_str_new2(name);
}
if (value == res->klass) {
res->name = key;
res->path = path;
return ST_STOP;
}
if (obj_is_kind_of(value, cModule)) {
if (rb_obj_is_kind_of(value, rb_cModule)) {
struct fc_result arg;
struct fc_result *list;
@ -105,13 +97,13 @@ find_class_path(klass)
arg.name = 0;
arg.path = 0;
arg.klass = klass;
arg.track = cObject;
arg.track = rb_cObject;
arg.prev = 0;
if (RCLASS(cObject)->iv_tbl) {
st_foreach(RCLASS(cObject)->iv_tbl, fc_i, &arg);
if (RCLASS(rb_cObject)->iv_tbl) {
st_foreach(RCLASS(rb_cObject)->iv_tbl, fc_i, &arg);
}
if (arg.name == 0) {
st_foreach(class_tbl, fc_i, &arg);
st_foreach(rb_class_tbl, fc_i, &arg);
}
if (arg.name) {
rb_iv_set(klass, "__classpath__", arg.path);
@ -129,13 +121,14 @@ classname(klass)
while (TYPE(klass) == T_ICLASS || FL_TEST(klass, FL_SINGLETON)) {
klass = (VALUE)RCLASS(klass)->super;
}
if (!klass) klass = rb_cObject;
path = rb_iv_get(klass, "__classpath__");
if (NIL_P(path)) {
ID classid = rb_intern("__classid__");
path = rb_ivar_get(klass, classid);
if (!NIL_P(path)) {
path = str_new2(rb_id2name(FIX2INT(path)));
path = rb_str_new2(rb_id2name(FIX2INT(path)));
rb_ivar_set(klass, classid, path);
st_delete(RCLASS(klass)->iv_tbl, &classid, 0);
}
@ -147,18 +140,19 @@ classname(klass)
}
return path;
}
if (TYPE(path) != T_STRING) Bug("class path is not set properly");
if (TYPE(path) != T_STRING)
rb_bug("class path is not set properly");
return path;
}
VALUE
mod_name(mod)
rb_mod_name(mod)
VALUE mod;
{
VALUE path = classname(mod);
if (path) return str_dup(path);
return str_new(0,0);
if (path) return rb_str_dup(path);
return rb_str_new(0,0);
}
VALUE
@ -174,7 +168,7 @@ rb_class_path(klass)
if (TYPE(klass) == T_MODULE) s = "Module";
sprintf(buf, "#<%s 0x%x>", s, klass);
return str_new2(buf);
return rb_str_new2(buf);
}
}
@ -185,13 +179,13 @@ rb_set_class_path(klass, under, name)
{
VALUE str;
if (under == cObject) {
str = str_new2(name);
if (under == rb_cObject) {
str = rb_str_new2(name);
}
else {
str = str_dup(rb_class_path(under));
str_cat(str, "::", 2);
str_cat(str, name, strlen(name));
str = rb_str_dup(rb_class_path(under));
rb_str_cat(str, "::", 2);
rb_str_cat(str, name, strlen(name));
}
rb_iv_set(klass, "__classpath__", str);
}
@ -201,7 +195,7 @@ rb_path2class(path)
char *path;
{
if (path[0] == '#') {
ArgError("can't retrieve anonymous class %s", path);
rb_raise(rb_eArgError, "can't retrieve anonymous class %s", path);
}
return rb_eval_string(path);
}
@ -211,8 +205,8 @@ rb_name_class(klass, id)
VALUE klass;
ID id;
{
if (cString) {
rb_iv_set(klass, "__classpath__", str_new2(rb_id2name(id)));
if (rb_cString) {
rb_iv_set(klass, "__classpath__", rb_str_new2(rb_id2name(id)));
}
else {
rb_iv_set(klass, "__classid__", INT2FIX(id));
@ -227,11 +221,12 @@ rb_autoload_id(id, filename)
char *filename;
{
if (!rb_is_const_id(id)) {
NameError("autoload must be constant name", rb_id2name(id));
rb_raise(rb_eNameError, "autoload must be constant name",
rb_id2name(id));
}
if (!autoload_tbl) {
autoload_tbl = new_idhash();
autoload_tbl = st_init_numtable();
}
st_insert(autoload_tbl, id, strdup(filename));
}
@ -244,7 +239,7 @@ rb_autoload(klass, filename)
}
VALUE
f_autoload(obj, klass, file)
rb_f_autoload(obj, klass, file)
VALUE obj, klass, file;
{
rb_autoload_id(rb_to_id(klass), STR2CSTR(file));
@ -293,9 +288,9 @@ rb_global_entry(id)
{
struct global_entry *entry;
if (!st_lookup(global_tbl, id, &entry)) {
if (!st_lookup(rb_global_tbl, id, &entry)) {
entry = ALLOC(struct global_entry);
st_insert(global_tbl, id, entry);
st_add_direct(rb_global_tbl, id, entry);
entry->id = id;
entry->data = 0;
entry->getter = undef_getter;
@ -312,7 +307,9 @@ static VALUE
undef_getter(id)
ID id;
{
Warning("global variable `%s' not initialized", rb_id2name(id));
if (rb_verbose) {
rb_warning("global variable `%s' not initialized", rb_id2name(id));
}
return Qnil;
}
@ -357,7 +354,7 @@ static void
val_marker(data)
void *data;
{
if (data) gc_mark_maybe(data);
if (data) rb_gc_mark_maybe(data);
}
static VALUE
@ -382,7 +379,7 @@ static void
var_marker(var)
VALUE **var;
{
if (var) gc_mark_maybe(*var);
if (var) rb_gc_mark_maybe(*var);
}
static void
@ -391,7 +388,7 @@ readonly_setter(val, id, var)
ID id;
void *var;
{
NameError("Can't set variable %s", rb_id2name(id));
rb_raise(rb_eNameError, "Can't set variable %s", rb_id2name(id));
}
static int
@ -404,16 +401,16 @@ mark_global_entry(key, entry)
(*entry->marker)(entry->data);
trace = entry->trace;
while (trace) {
if (trace->data) gc_mark_maybe(trace->data);
if (trace->data) rb_gc_mark_maybe(trace->data);
trace = trace->next;
}
return ST_CONTINUE;
}
void
gc_mark_global_tbl()
rb_gc_mark_global_tbl()
{
st_foreach(global_tbl, mark_global_entry, 0);
st_foreach(rb_global_tbl, mark_global_entry, 0);
}
static ID
@ -480,11 +477,11 @@ static void
rb_trace_eval(cmd, val)
VALUE cmd, val;
{
rb_eval_cmd(cmd, ary_new3(1, val));
rb_eval_cmd(cmd, rb_ary_new3(1, val));
}
VALUE
f_trace_var(argc, argv)
rb_f_trace_var(argc, argv)
int argc;
VALUE *argv;
{
@ -494,14 +491,15 @@ f_trace_var(argc, argv)
struct trace_var *trace;
if (rb_scan_args(argc, argv, "11", &var, &cmd) == 1) {
cmd = f_lambda();
cmd = rb_f_lambda();
}
if (NIL_P(cmd)) {
return f_untrace_var(argc, argv);
return rb_f_untrace_var(argc, argv);
}
id = rb_to_id(var);
if (!st_lookup(global_tbl, id, &entry)) {
NameError("undefined global variable %s", rb_id2name(id));
if (!st_lookup(rb_global_tbl, id, &entry)) {
rb_raise(rb_eNameError, "undefined global variable %s",
rb_id2name(id));
}
trace = ALLOC(struct trace_var);
trace->next = entry->trace;
@ -535,7 +533,7 @@ remove_trace(entry)
}
VALUE
f_untrace_var(argc, argv)
rb_f_untrace_var(argc, argv)
int argc;
VALUE *argv;
{
@ -546,17 +544,18 @@ f_untrace_var(argc, argv)
rb_scan_args(argc, argv, "11", &var, &cmd);
id = rb_to_id(var);
if (!st_lookup(global_tbl, id, &entry)) {
NameError("undefined global variable %s", rb_id2name(id));
if (!st_lookup(rb_global_tbl, id, &entry)) {
rb_raise(rb_eNameError, "undefined global variable %s",
rb_id2name(id));
}
trace = entry->trace;
if (NIL_P(cmd)) {
VALUE ary = ary_new();
VALUE ary = rb_ary_new();
while (trace) {
struct trace_var *next = trace->next;
ary_push(ary, (VALUE)trace->data);
rb_ary_push(ary, (VALUE)trace->data);
trace->removed = 1;
trace = next;
}
@ -570,7 +569,7 @@ f_untrace_var(argc, argv)
if (trace->data == (void*)cmd) {
trace->removed = 1;
if (!entry->block_trace) remove_trace(entry);
return ary_new3(1, cmd);
return rb_ary_new3(1, cmd);
}
trace = trace->next;
}
@ -617,7 +616,7 @@ rb_gvar_set(entry, val)
struct trace_data trace;
if (rb_safe_level() >= 4) {
Raise(eSecurityError, "cannot change global variable value");
rb_raise(rb_eSecurityError, "cannot change global variable value");
}
(*entry->setter)(val, entry->id, entry->data, entry);
@ -645,8 +644,8 @@ VALUE
rb_gvar_defined(entry)
struct global_entry *entry;
{
if (entry->getter == undef_getter) return FALSE;
return TRUE;
if (entry->getter == undef_getter) return Qfalse;
return Qtrue;
}
static int
@ -655,22 +654,22 @@ gvar_i(key, entry, ary)
struct global_entry *entry;
VALUE ary;
{
ary_push(ary, str_new2(rb_id2name(key)));
rb_ary_push(ary, rb_str_new2(rb_id2name(key)));
return ST_CONTINUE;
}
VALUE
f_global_variables()
rb_f_global_variables()
{
VALUE ary = ary_new();
VALUE ary = rb_ary_new();
char buf[4];
char *s = "&`'+123456789";
st_foreach(global_tbl, gvar_i, ary);
if (!NIL_P(backref_get())) {
st_foreach(rb_global_tbl, gvar_i, ary);
if (!NIL_P(rb_backref_get())) {
while (*s) {
sprintf(buf, "$%c", *s++);
ary_push(ary, str_new2(buf));
rb_ary_push(ary, rb_str_new2(buf));
}
}
return ary;
@ -707,11 +706,13 @@ rb_ivar_get(obj, id)
return val;
return Qnil;
default:
TypeError("class %s can not have instance variables",
rb_class2name(CLASS_OF(obj)));
rb_raise(rb_eTypeError, "class %s can not have instance variables",
rb_class2name(CLASS_OF(obj)));
break;
}
Warning("instance var %s not initialized", rb_id2name(id));
if (rb_verbose) {
rb_warning("instance var %s not initialized", rb_id2name(id));
}
return Qnil;
}
@ -722,18 +723,18 @@ rb_ivar_set(obj, id, val)
VALUE val;
{
if (rb_safe_level() >= 5) {
Raise(eSecurityError, "cannot change object status");
rb_raise(rb_eSecurityError, "cannot change object status");
}
switch (TYPE(obj)) {
case T_OBJECT:
case T_CLASS:
case T_MODULE:
if (!ROBJECT(obj)->iv_tbl) ROBJECT(obj)->iv_tbl = new_idhash();
if (!ROBJECT(obj)->iv_tbl) ROBJECT(obj)->iv_tbl = st_init_numtable();
st_insert(ROBJECT(obj)->iv_tbl, id, val);
break;
default:
TypeError("class %s can not have instance variables",
rb_class2name(CLASS_OF(obj)));
rb_raise(rb_eTypeError, "class %s can not have instance variables",
rb_class2name(CLASS_OF(obj)));
break;
}
return val;
@ -744,17 +745,17 @@ rb_ivar_defined(obj, id)
VALUE obj;
ID id;
{
if (!rb_is_instance_id(id)) return FALSE;
if (!rb_is_instance_id(id)) return Qfalse;
switch (TYPE(obj)) {
case T_OBJECT:
case T_CLASS:
case T_MODULE:
if (ROBJECT(obj)->iv_tbl && st_lookup(ROBJECT(obj)->iv_tbl, id, 0))
return TRUE;
return Qtrue;
break;
}
return FALSE;
return Qfalse;
}
static int
@ -764,13 +765,13 @@ ivar_i(key, entry, ary)
VALUE ary;
{
if (rb_is_instance_id(key)) {
ary_push(ary, str_new2(rb_id2name(key)));
rb_ary_push(ary, rb_str_new2(rb_id2name(key)));
}
return ST_CONTINUE;
}
VALUE
obj_instance_variables(obj)
rb_obj_instance_variables(obj)
VALUE obj;
{
VALUE ary;
@ -779,7 +780,7 @@ obj_instance_variables(obj)
case T_OBJECT:
case T_CLASS:
case T_MODULE:
ary = ary_new();
ary = rb_ary_new();
if (ROBJECT(obj)->iv_tbl) {
st_foreach(ROBJECT(obj)->iv_tbl, ivar_i, ary);
}
@ -789,14 +790,15 @@ obj_instance_variables(obj)
}
VALUE
obj_remove_instance_variable(obj, name)
rb_obj_remove_instance_variable(obj, name)
VALUE obj, name;
{
VALUE val = Qnil;
ID id = rb_to_id(name);
if (!rb_is_instance_id(id)) {
NameError("`%s' is not an instance variable", rb_id2name(id));
rb_raise(rb_eNameError, "`%s' is not an instance variable",
rb_id2name(id));
}
switch (TYPE(obj)) {
@ -808,8 +810,8 @@ obj_remove_instance_variable(obj, name)
}
break;
default:
TypeError("object %s can not have instance variables",
rb_class2name(CLASS_OF(obj)));
rb_raise(rb_eTypeError, "object %s can not have instance variables",
rb_class2name(CLASS_OF(obj)));
break;
}
return val;
@ -825,12 +827,12 @@ rb_const_get_at(klass, id)
if (RCLASS(klass)->iv_tbl && st_lookup(RCLASS(klass)->iv_tbl, id, &value)) {
return value;
}
if (klass == cObject) {
if (klass == rb_cObject) {
return rb_const_get(klass, id);
}
NameError("Uninitialized constant %s::%s",
RSTRING(rb_class_path(klass))->ptr,
rb_id2name(id));
rb_raise(rb_eNameError, "Uninitialized constant %s::%s",
RSTRING(rb_class_path(klass))->ptr,
rb_id2name(id));
/* not reached */
}
@ -851,11 +853,11 @@ rb_const_get(klass, id)
tmp = RCLASS(tmp)->super;
}
if (BUILTIN_TYPE(klass) == T_MODULE) {
return rb_const_get(cObject, id);
return rb_const_get(rb_cObject, id);
}
/* pre-defined class */
if (st_lookup(class_tbl, id, &value)) return value;
if (st_lookup(rb_class_tbl, id, &value)) return value;
/* autoload */
if (autoload_tbl && st_lookup(autoload_tbl, id, 0)) {
@ -863,19 +865,19 @@ rb_const_get(klass, id)
VALUE module;
st_delete(autoload_tbl, &id, &modname);
module = str_new2(modname);
module = rb_str_new2(modname);
free(modname);
f_require(0, module);
rb_f_require(Qnil, module);
return rb_const_get(klass, id);
}
/* Uninitialized constant */
if (klass && klass != cObject)
NameError("Uninitialized constant %s::%s",
RSTRING(rb_class_path(klass))->ptr,
rb_id2name(id));
if (klass && klass != rb_cObject)
rb_raise(rb_eNameError, "Uninitialized constant %s::%s",
RSTRING(rb_class_path(klass))->ptr,
rb_id2name(id));
else {
NameError("Uninitialized constant %s",rb_id2name(id));
rb_raise(rb_eNameError, "Uninitialized constant %s",rb_id2name(id));
}
/* not reached */
}
@ -887,34 +889,34 @@ const_i(key, value, ary)
VALUE ary;
{
if (rb_is_const_id(key)) {
VALUE kval = str_new2(rb_id2name(key));
if (!ary_includes(ary, kval)) {
ary_push(ary, kval);
VALUE kval = rb_str_new2(rb_id2name(key));
if (!rb_ary_includes(ary, kval)) {
rb_ary_push(ary, kval);
}
}
return ST_CONTINUE;
}
VALUE
mod_remove_const(mod, name)
rb_mod_remove_const(mod, name)
VALUE mod, name;
{
ID id = rb_to_id(name);
VALUE val;
if (!rb_is_const_id(id)) {
NameError("`%s' is not constant", rb_id2name(id));
rb_raise(rb_eNameError, "`%s' is not constant", rb_id2name(id));
}
if (RCLASS(mod)->iv_tbl && st_delete(ROBJECT(mod)->iv_tbl, &id, &val)) {
return val;
}
if (rb_const_defined_at(mod, id)) {
NameError("cannot remove %s::%s",
rb_class2name(mod), rb_id2name(id));
rb_raise(rb_eNameError, "cannot remove %s::%s",
rb_class2name(mod), rb_id2name(id));
}
NameError("constant %s::%s not defined",
rb_class2name(mod), rb_id2name(id));
rb_raise(rb_eNameError, "constant %s::%s not defined",
rb_class2name(mod), rb_id2name(id));
}
static int
@ -923,22 +925,22 @@ autoload_i(key, name, ary)
char *name;
VALUE ary;
{
VALUE kval = str_new2(rb_id2name(key));
if (!ary_includes(ary, kval)) {
ary_push(ary, kval);
VALUE kval = rb_str_new2(rb_id2name(key));
if (!rb_ary_includes(ary, kval)) {
rb_ary_push(ary, kval);
}
return ST_CONTINUE;
}
VALUE
mod_const_at(mod, ary)
rb_mod_const_at(mod, ary)
VALUE mod, ary;
{
if (RCLASS(mod)->iv_tbl) {
st_foreach(RCLASS(mod)->iv_tbl, const_i, ary);
}
if ((VALUE)mod == cObject) {
st_foreach(class_tbl, const_i, ary);
if ((VALUE)mod == rb_cObject) {
st_foreach(rb_class_tbl, const_i, ary);
if (autoload_tbl) {
st_foreach(autoload_tbl, autoload_i, ary);
}
@ -947,22 +949,22 @@ mod_const_at(mod, ary)
}
VALUE
mod_constants(mod)
rb_mod_constants(mod)
VALUE mod;
{
return mod_const_at(mod, ary_new());
return rb_mod_const_at(mod, rb_ary_new());
}
VALUE
mod_const_of(mod, ary)
rb_mod_const_of(mod, ary)
VALUE mod;
VALUE ary;
{
mod_const_at(mod, ary);
rb_mod_const_at(mod, ary);
for (;;) {
mod = RCLASS(mod)->super;
if (!mod) break;
mod_const_at(mod, ary);
rb_mod_const_at(mod, ary);
}
return ary;
}
@ -973,12 +975,12 @@ rb_const_defined_at(klass, id)
ID id;
{
if (RCLASS(klass)->iv_tbl && st_lookup(RCLASS(klass)->iv_tbl, id, 0)) {
return TRUE;
return Qtrue;
}
if (klass == cObject) {
if (klass == rb_cObject) {
return rb_const_defined(klass, id);
}
return FALSE;
return Qfalse;
}
int
@ -986,8 +988,8 @@ rb_autoload_defined(id)
ID id;
{
if (autoload_tbl && st_lookup(autoload_tbl, id, 0))
return TRUE;
return FALSE;
return Qtrue;
return Qfalse;
}
int
@ -999,15 +1001,15 @@ rb_const_defined(klass, id)
while (tmp) {
if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,0)) {
return TRUE;
return Qtrue;
}
tmp = RCLASS(tmp)->super;
}
if (BUILTIN_TYPE(klass) == T_MODULE) {
return rb_const_defined(cObject, id);
return rb_const_defined(rb_cObject, id);
}
if (st_lookup(class_tbl, id, 0))
return TRUE;
if (st_lookup(rb_class_tbl, id, 0))
return Qtrue;
return rb_autoload_defined(id);
}
@ -1018,13 +1020,14 @@ rb_const_set(klass, id, val)
VALUE val;
{
if (!RCLASS(klass)->iv_tbl) {
RCLASS(klass)->iv_tbl = new_idhash();
RCLASS(klass)->iv_tbl = st_init_numtable();
}
else if (st_lookup(RCLASS(klass)->iv_tbl, id, 0)) {
NameError("already initialized constant %s", rb_id2name(id));
rb_raise(rb_eNameError, "already initialized constant %s",
rb_id2name(id));
}
st_insert(RCLASS(klass)->iv_tbl, id, val);
st_add_direct(RCLASS(klass)->iv_tbl, id, val);
}
void
@ -1035,7 +1038,7 @@ rb_define_const(klass, name, val)
{
ID id = rb_intern(name);
if (!rb_is_const_id(id)) {
NameError("wrong constant name %s", name);
rb_raise(rb_eNameError, "wrong constant name %s", name);
}
rb_const_set(klass, id, val);
}
@ -1045,7 +1048,7 @@ rb_define_global_const(name, val)
char *name;
VALUE val;
{
rb_define_const(cObject, name, val);
rb_define_const(rb_cObject, name, val);
}
VALUE

View file

@ -18,18 +18,18 @@
void
Init_version()
{
rb_define_global_const("VERSION", str_new2(RUBY_VERSION));
rb_define_global_const("PLATFORM", str_new2(RUBY_PLATFORM));
rb_define_global_const("VERSION", rb_str_new2(RUBY_VERSION));
rb_define_global_const("PLATFORM", rb_str_new2(RUBY_PLATFORM));
}
void
show_version()
ruby_show_version()
{
fprintf(stderr, "ruby %s(%s) [%s]\n", RUBY_VERSION, VERSION_DATE, RUBY_PLATFORM);
}
void
show_copyright()
ruby_show_copyright()
{
fprintf(stderr, "ruby - Copyright (C) 1993-1998 Yukihiro Matsumoto\n");
exit(0);