summaryrefslogtreecommitdiff
path: root/sample
diff options
context:
space:
mode:
authorYukihiro Matsumoto <matz@ruby-lang.org>1995-12-21 00:56:57 +0900
committerTakashi Kokubun <takashikkbn@gmail.com>2019-08-17 22:09:32 +0900
commitfca49a8a69a0f6bb4feae74c6cd0e93d7fac8b36 (patch)
tree590a6d2ffcfa31212c1595e34a01d9cda56ba308 /sample
parent8bf1c909dc31fd4bcdc1488cda9fe89a62bc2830 (diff)
version 0.95v0_95
https://cache.ruby-lang.org/pub/ruby/1.0/ruby-0.95.tar.gz Thu Dec 21 00:56:57 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.95 - fj.sourcesに * eval.c (rb_eval): rescueのロジックをrb_rescue()に一元化. Wed Dec 20 19:30:58 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * Makefile.in: 不要なコンパイルの回避(より完全に). * class.c (singleton_class_new): `single'->`singleton' Tue Dec 19 07:14:33 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * io.c (closed?): IOがcloseされているかどうかを知る述語. * parse.y (primary): 特異メソッドの引数のlex_stateが不適切. * lib/tk.rb: tcl->rubyの変換関数の用意. * ext/extmk.rb.in (install): installの2重コンパイルの回避. * array.c (range_beg_len): range指定の不適切なエラーを訂正. * string.c (str_aref): range指定のバグを削除. * lib/tk.rb (tk_split_list): Tclのリストに対応. Mon Dec 18 09:58:12 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.94 * dln.c (dln_load): HP対応(未確認) * eval.c (Init_Proc): BlockをProcに改名. Sat Dec 16 13:46:14 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * eval.c (rb_eval): retryでイテレータの再実行ができるように. Fri Dec 15 17:14:30 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * eval.c: proc:lambdaの親しみやすい別名 Thu Dec 14 17:21:55 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * eval.c (dyna_var_asgn): イテレータブロック内で最初に初期化された ローカル変数の有効範囲をそのブロック内に限定.これでlambdaと呼べ ないことはない. Wed Dec 13 02:30:58 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * gc.c: autoloadのマークミス. * lib/tk.rb: wishからの複数行の戻り値に対応 * lib/tkcomposite.rb: 複合widget * variable.c (rb_class2path): ICLASSに対応してなかった. * eval.c (ruby_run): exit(0)のバグ Sat Dec 9 01:21:24 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * ext/marshal/marshal.c (dumps|load): 文字列に対する入出力を可能に した(ただし実はファイル経由なのだ). Fri Dec 8 18:29:11 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * ext/marshal/marshal.c: シンボルを一度だけ初期化する. Thu Dec 7 07:58:50 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * parse.y (yylex): 第1引数の正規表現の認識にエラーがあった.同時に 状態数を減らした. * string.c (str_sub): 置換でスキップ幅が大きすぎた. Wed Dec 6 15:14:23 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * string.c (str_sub_method): sub/gsub(!なし)は置換が行なわれなかっ た時,置換前の文字列を返す. Tue Dec 5 00:55:15 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * parse.y (yylex): 括弧を省略した時の引数展開の`*'に対応. * eval.c (ruby_run): EXITハンドラ内での例外に対応. * bignum.c (big_cmp): BignumとFixnumの比較で落ちる. Mon Dec 4 14:21:18 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * parse.y (call_op): コンパイル時の定数式の展開をやめた.労多くし て益少ないと判断したので. Thu Nov 30 01:35:15 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * lib/tk.rb: {Radio,Check}Buttonのvariableの実装. * eval.c (rb_yield_0): Block.callがネストした時のバグ. * io.c (f_select): 常に配列3つをふくむ配列を返すように * lib/tk.rb: fileeventをruby側で実装. Wed Nov 29 17:53:23 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * variable.c (rb_ivar_get): selfを常に指定するように. Tue Nov 14 00:07:29 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * lib/tk.rb: Tk4.0対応 Mon Nov 13 16:23:32 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.93 Thu Nov 9 23:26:01 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * gc.c (gc_mark): モジュールのMixinのマーク忘れ. * parse.y (f_arglist): メソッド定義の引数を括弧で括らなくても良い ようにした. Wed Nov 8 00:17:51 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * eval.c (rb_yield_0): 未初期化のローカル変数があった. * eval.c (rb_eval): pendig signalのチェックをeval実行後に行うよう にした.でないとシグナルの発生と検出が遠く離れてしまう事がある. * parse.y: class文のsuperclass部を定数から式に拡張した. * lib/tk.rb: Tkのほぼ全ウィンドウクラスに対応.キャンバスとテキス ト上のオブジェクトが残っている. Tue Nov 7 08:18:37 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * signal.c (trap): ブロックを指定できるように. Mon Nov 6 16:44:00 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * eval.c (f_caller): 呼出元の情報を得る. * ext/tkutil/tkutil.c: wishのstderr出力を監視することで,エラー処 理を行う. * ext/tkutil/tkutil.c: wishとの通信部をCで記述. Sat Nov 4 01:12:59 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * sample/ruby-mode.el (ruby-calculate-indent): インデントの計算を もう少しスマートにした(正規表現のチェック,継続行のチェック). * eval.c (rb_call): 無限再帰を避けるため,関数のネストレベルの制限 を行なう. * lib/tk.rb: Tkインターフェース.まだ不完全だが. * eval.c (rb_yield_0): 空のBlockのバグ. * sample/ruby-mode.el (ruby-calculate-indent): 行末の演算子による 行継続に対応. Fri Nov 3 12:56:21 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * eval.c (rb_call): 本体が空の関数の実行にバグ. * parse.y (var_extend): 文字列の末尾の変数展開のバグ. * variable.c (rb_gvar_set): traceの評価時にに変数値を与えるように. * eval.c (f_require): ruby scriptのrequireにbug. * variable.c (rb_const_get): モジュールのinclude対策. Thu Oct 19 13:56:06 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * dln.c (dln_load): HP対応でのtypo. Wed Oct 18 17:39:39 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.92 * object.c (krn_type): オブジェクトの動的な型を返すメソッド. Tue Oct 17 00:48:18 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * ruby.c (proc_options): -X オプション.chdirだけを行う. * re.c (reg_search): 漢字コードを途中で変更できるように.コンパイ ル時のコードが変更された時にはマッチの直前に正規表現の再コンパイ ルを行う.定数KCODEから変数$KCODEへ. * parse.y: ()のなかにcompexprを許す. * re.c (reg_search): メモリリークを直した. Fri Oct 13 13:19:19 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * string.c (str_sub): 文字列置換にバグ. * string.c (str_strip_bang): 文字列の後ろの長さの調整が行われてい なかった. * re.c (reg_search): $&, $1...のはローカルに束縛するようになった. 呼び出したメソッドでのマッチは現スコープの$&などの値に影響しない. マッチの情報をスコープ外で得たいときには$~を使って束縛情報を持ち 出す必要がある. Thu Oct 12 00:33:33 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * re.c (reg_search): String:split, String:indexでは$&, $1...が変化 しないようにした. * io.c (rb_str_setter): setterの仕様が変更になっていた. * variable.c (f_trace_var): 第2引数を省略してイテレータとして呼べ るように. Wed Oct 11 11:50:59 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.91 * variable.c (var_setter): 引数が間違っていた.致命的バグ. * io.c (pipe_open): $stderrの値が変更されている時にはそちらを 子プロセスのstderrに設定する. Mon Oct 9 13:06:33 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * object.c (mod_to_s): モジュール内のモジュールは`::'を使った表現 で表示されるように. * variable.c (rb_gvar_set): 代入によるループが発生しないように, trace内での代入ではtraceを評価しない. * struct.c (struct_equal): structのequal判定にクラスの一致を含めた. Sat Oct 7 00:18:32 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * eval.c (rb_eval): defined?の機能を拡張(yieldのチェック,superの 存在など). Fri Oct 6 12:06:47 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.90 * st.c (st_foreach): 要素を削除した時に要素数が変化していなかった. * hash.c (hash_values): バグ修正.keysを返していた…. * parse.y (call_op): defined? の引数では定数の畳み込みを行わない (チェックする前にコンパイルエラーになっては困る). * スコープ生成の一部見直し. Thu Oct 5 00:29:43 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * 関数とクラスの命名規則を変更した.関数名,変数名の全面書き換え. * gc.c (looks_pointerp): ヒープチェックの高速化. * struct.c (Fstruct_aset): 構造体に対する`[]='. (struct_set): 構造体メンバに対する代入. Wed Oct 4 09:54:07 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.89 * eval.c (Frequire): ダイナミックロードのエラーチェックを厳しく. * struct.c: structの構造を完全に書き換えた.以前は順序付きの id->valueの連想配列であったが,今度は構造体毎に新しいクラスを生 成するようにした. * parse.y: `::'の意味をAssocの生成からクラス(モジュール)内の定数ア クセスへ変更. * assoc.c: なくす. Tue Oct 3 13:31:08 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * variable.c (Ftrace_var): trace_var, 大域変数への書き込みhookを設 定する. * variable.c: global_entryの構成を書き換えた.これでtrace_varを実 装できる. * file.c (Ffile_stat): "&"で直前のfstatの結果も参照できるように. Fri Sep 29 14:15:13 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.88 * dln.c (dln_load): AIXとHPに対応したコードを入れた(動作は未確認). * ext/extmk.rb.in: 必要に応じて,定数EXTLIBを定義するように. * dln.c (dln_load): dln独立に書き換える.将来の拡張用. (load_1): dln_a_outにおいてソースコードでライブラリを明示的にロー ドする必要がないように変更した. Thu Sep 28 13:31:37 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * sample/ruby-mode.el: もっとましなhilit19対応(正規表現). Wed Sep 27 04:12:44 1995 Takahasi Mamoru <taka@soum.co.jp> * sample/test.rb: echoで-nを使わないように(SysV対策). * ext/extmk.rb.in: sub -> sub! Tue Sep 26 19:12:42 1995 Yasuo OHBA <jammy@csg.mes.co.jp> * dln.c (dln_find_1): `.', `..'から始まるパスに対応した. Mon Sep 25 12:33:03 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.87 Sat Sep 23 10:00:18 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * eval.c (Fmod_modfunc): メソッドをprivateにし,同時に特異メソッド も定義するメソッド.パッケージ的使い方のモジュール用. Fri Sep 22 11:02:44 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * lib/find.rb: findを提供するライブラリ * variable.c (rb_define_variable): hookの設定を分離. (add_hook): 1変数に対して複数のhookを設定できるように. Thu Sep 21 00:22:11 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * string.c (Fstr_frozen): 文字列が更新不可かどうかをチェックする述 語メソッド. * hash.c (Fhash_aset): keyが文字列の時,キーの内容が変化しないよう に,dupしてfreezeする. Wed Sep 20 16:12:44 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.86 * ext/extmk.rb.in (have_header): キャッシュにバグ. * ext/extmk.rb.in (have_library): 引数の順序が変わった. Thu Sep 14 18:00:59 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * object.c (obj_is_instance_of): is_member_ofから名称変更. Wed Sep 13 15:44:35 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * string.c (Fstr_tr_bang): 範囲外の文字に対する変換バグ. Tue Sep 12 14:27:58 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * file.c (Sfile_expand_path): expand_file_name -> expand_pathに名 称変更. * enum.c (Fenum_member): includes? -> member? に名称変更. * string.c (Fstr_each_byte): StringはByteArrayであるという基本に戻っ て,eachの定義をeach_byteに変更した.今までのeachはeach_lineでア クセスできる. Mon Sep 11 18:31:17 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * file.c (cache_stat): ファイル名として"&"を指定すると直前の stat(2)の結果を再利用するように. Fri Sep 8 14:18:51 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * ruby.texi: `!', `?'に対応してアップデート. * parse.y: defined -> defined? * file.c: FileOpの一文字メソッドをなくす.一文字テストはtestメソッ ドにまかせる. * parse.y (yylex): 変数名の後ろに`?'も許す.述語メソッドの後ろに `?'を追加する. Thu Sep 7 20:01:33 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * string.c: 文字列の中身を更新するメソッドの名前の終りに`!'を付加. `!'の無いバージョンも用意した. * parse.y: 変数名の後ろに`!'を許す. Wed Sep 6 14:12:19 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.85 * string.c (Fstr_dup): 文字列の複製を作る (Fstr_freeze): 文字列の更新不可属性を設定できるように. (Fsub/Fgsub): $_の内容をdupしてから置換を行うように. * ruby.h (CLONESETUP): flagsの状態もコピー Tue Sep 5 01:27:50 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * sample/test.rb: 失敗の検出を厳しく. Fri Aug 25 14:31:02 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * process.c (Ffork): イテレータとしても動作するように. * version 0.84 * signal.c (sig_beg): ハンドラが設定されている時には再設定しない. * ext/extmk.rb.in (create_makefile): shared objectのリンクの際に `-l'オプションを指定するように. * signal.c (trap): `EXIT'で終了処理を行う設定が出来る. Wed Aug 16 00:13:22 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * signal.c (sig_beg): デフォルトではbegin節の中でだけSIGINTを捕捉 するように変更. * io.c (io_ctl): fcntlを持たないシステムにも対応. * 各ディレクトリに分散していたMANIFESTをまとめた.拡張モジュール毎 には必要. * string.c (Sstr_new,str_sub,Fstr_crypt): 引数を自動的に文字列に変 換するように. Sat Aug 12 00:44:02 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * string.c (Fstr_crypt): PD cryptを用意した. Fri Aug 11 14:37:03 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * assoc.c (Fassoc_clone): assocもcloneできるように. * io.c: マクロREAD_DATA_PENDINGの定義を変更(Linux対応) * io.c (io_fptr_finalize): ftprの開放時の処理を指定できるように. Wed Aug 9 16:52:41 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * eval.c (rb_provided): 複数のfeatureをロードすると無限ループに落 ちるという単純な(しかし凶悪な)ミス. * ext/extmk.rb.in (install): dlopen対応を行った.今までdlnにしか十 分に対応していなかった. Tue Aug 8 14:17:06 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.83 Mon Aug 7 12:47:41 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * parse.y: resque -> rescue.恥ずかしいがtypoを残しておくわけには いかないよなあ.なんで今まで気がつかなかったのか…. Thu Aug 3 18:18:05 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * missing/nt.c: NT移植用の関数群をまとめた. * variable.c (rb_const_get): また例外を発生するようにした.defined がある以上例外を発生させない理由がないので(例外が発生した方がタ イプミスの検出などの点で有利). * variable.c (Fautoload): autoloadを実装.今度は使えるか. Mon Jul 31 15:44:21 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * parse.y (arg_ambiguous): 第1引数のあいまいさを警告(-vオプション で有効). * eval.c (rb_eval): `-v'オプションをつけて`def'が呼ばれると不必要 なエラーメッセージが出た. * parse.y (yylex): メソッドの第1引数の判定をもうちょっと賢くした. Fri Jul 28 19:04:43 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * parse.y (yylex): `+/-/['の直前に空白が来るかどうかで動作を変更し た(混乱のもとか?) Wed Jul 26 09:21:23 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.82a * sprintf.c (Fsprintf): `%s'で'\0'を含む文字列に対応. * pack.c (Fpck_pack): packの要素確保のバグ. * eval.c (Floop): 無限ループのイテレータ. * io.c (next_argv): 存在しないファイル名が指定された時のエラー処理 が行われていなかった. Mon Jul 24 17:37:34 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.82 * ext/extmk.rb.in (install): 拡張モジュールをstatic linkする場合は そのモジュールが既にrequireされたのと同じようにfeatureを設定する. これで拡張モジュールの機能が必要な時には(static linkされているか どうかにかかわらず)requireすればよくなる. * eval.c (Frequire): `$"'に格納する文字列をフルパスでなくフィーチャ 名とする.rubyスクリプトをロードした時には`.rb',オブジェクトを ロードした時には`.o'をフィーチャ名に付加する.lispのrequireと provideの働きに(少し)近い. Thu Jul 20 12:50:05 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * Makefile.in (test): make testができるように. * struct.c (struct_new): typo. * eval.c (rb_eval): `defined'を追加.メソッド/変数/定数の定義状態 を知る事が出来る. Wed Jul 19 18:04:01 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.81 Mon Jul 17 14:53:51 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * variable.c (rb_const_get): 未初期化のCONSTANTの値をnilにした.し かし,今後また例外に戻す可能性はある.要はoptionalなクラス/モジュー ルが存在するかチェックしたいだけなんだな. * st.c (int): grow_factorを固定にした(大嶋さんのマシンに対応). Fri Jul 14 00:48:40 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * ext/extmk.rb.in: キャッシュのバグを修正. * parse.y (var_extend): #{$数字}に対応した. * dln.c (dln_load_1): `Init_FILENAME'だけを有効に.`init_*'は今後 実行しない. * ext/etc/etc.c : Etcモジュールを拡張モジュールとして分離.実はNT 対応への布石だったりするかもしれない. Tue Jul 11 17:12:48 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * gcc -Wallで出たwarningを元にソースを変更. * signal.c (trap): typo. Fri Jul 7 10:08:51 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.80 * ruby.texi: texinfo documentを提供.specとruby.1は無くなった. * signal.c (Ftrap): 割込み禁止中の例外発生に対応. * eval.c (Flambda): Blockオブジェクトを返す.Block.newと同義. Thu Jul 6 00:35:03 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * signal.c (Ftrap): SIG_DFLの処理を変更.SIGINTへのデフォルトハン ドラを用意(例外を発生する). * file.c (Sfile_expand_fname): パス名を絶対パスに展開するメソッド. (Sfile_basename): basenameを得るメソッド.拡張子も外せる. (Sfile_dirname): basenameの反対. * eval.c (rb_call): argument評価中の例外発生に対応. * file.c (Ftest): `M', `A', `C'を追加. Tue Jul 4 12:36:33 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * file.c (Ftest): ファイルテスト用メソッド. * ruby.c (proc_options): `-r'オプションを追加. * parse.y (f_args): デフォルト引数を追加. * eval.c (rb_call): 該当する引数が無い時,rest引数の値をnilに. * numeric.c (num_equal): 数値以外との比較で例外が発生していた. FALSEを返すように. * eval.c (masign): 多重代入のrest部の動作がおかしかった. Sat Jun 17 01:03:16 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * parse.y (gettable): 未初期化のローカル変数の参照(独立した識別子) は正式にメソッド呼び出しとした. * parse.y (read_escape): tokenbufを使わないように修正.それにとも ない,`\C-x',`\M-x'などのエスケープ表現を復活.これでドキュメン トと実際の処理系が一致した. Thu Jun 15 15:42:00 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * re.c (re_regcomp): cacheのチェックを改善. Mon Jun 12 18:50:51 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * version 0.79 Sat Jun 10 00:25:01 1995 Yukihiro Matsumoto <matz@caelum.co.jp> * re.c (re_regcomp): cache判定に`$='の値も反映させた. * sample/test.rb: test suite作成. Fri Jun 9 15:58:34 1995 Yukihiro Matsumoto <matz@ix-02> * re.c (re_regcomp): cacheの判定が間違っていた. Fri Jun 9 00:01:35 1995 Yukihiro Matsumoto (matz@dyna) * eval.c (rb_yield): block構造体に初期化していないメンバ(iter)があっ たのでイテレータのネストが正しく動作しなかった. Thu Jun 8 00:59:03 1995 Yukihiro Matsumoto (matz@dyna) * re.c (=~): String以外との比較がFALSEを返すように(例外を発生して いた). * extmk.rb.in: 判定した値をファイルにキャッシュするようにした. * assoc.c (to_a): to_aメソッドが再定義されていなかった. * eval.c (rb_eval): 初期化されていないローカル変数へのアクセスを引 数の無いメソッド呼び出しと解釈する.ただし,(現状では)メソッドが 定義されていない場合,エラーにせず変数未初期化のwaringを出して nilを返している.「ruby -pe print」などが実行できるという意味で はありがたいこの仕様は,しかし今後の検討が必要である.-- メソッ ド呼び出しとするのを止めるか(以前の仕様),いつもメソッド呼び出し とする(未定義ならばエラー)か,今の仕様で行くか. * eval.c (rb_eval): 初期化されていないローカル変数へのアクセスで (evalなどで)初期化された事が分かった時には以後初期化されたローカ ル変数とみなす. Wed Jun 7 11:58:12 1995 Yukihiro Matsumoto <matz@ix-02> * eval.c (rb_fail): 例外処理後も`$!'をクリアしないように. (rb_fail): `$!'変数に最後に改行を追加しない. * io.c (Fprint): privateメソッドに変更.引数を取らない時の動作を変 更(`$_'を出力する). (Fio_print): 出力先指定のprintメソッド. (Fio_printf): 出力先指定のprintfメソッド. * parse.y: not演算子の追加.優先順位の低い`!'演算子. Mon Jun 5 19:00:55 1995 Yukihiro Matsumoto <matz@ix-02> * version 0.78 Fri Jun 2 17:52:03 1995 Yukihiro Matsumoto <matz@ix-02> * ruby.c (proc_options): -Iオプションで`$:'への追加される順番を修 正した. Fri Jun 2 00:36:34 1995 Yukihiro Matsumoto (matz@dyna) * parse.y: while修飾子の動作を通常のwhileと同じにした.ただし, begin式へのwhile修飾子だけはdo..while型のループとなる. Wed May 31 18:36:30 1995 Yukihiro Matsumoto <matz@ix-02> * version 0.77 Mon May 29 18:39:37 1995 Yukihiro Matsumoto <matz@ix-02> * ext/extmk.rb.in (install): 拡張モジュールもインストールできるよ うに. Fri May 26 14:43:01 1995 Yukihiro Matsumoto <matz@ix-02> * process.c (Fsystem): 戻り値をサブプロセスの失敗/成功を表す真偽値 にした.終了ステータスは`$?'で得る. Tue May 23 10:58:11 1995 Yukihiro Matsumoto <matz@ix-02> * string.c (Fstr_upto): 無限ループに陥らないように. * parse.y (cond): `||'などの右辺に制御式が書けるように,条件式がか ならずしも値を持たなくても良いようにした. * ext/marshal/marshal.c: オブジェクトの読み書きをメソッドの再定義 でコントロールできるように.インスタンスが`_dump_to'というメソッ ドを定義している時はそちらを使うように. * ext/extmk.rb.in: static linkも設定できるような仕様にした. ext/Setupというファイルにディレクトリ名を記述するとそのディレク トリに存在するモジュールはstatic linkされる(はず). * eval.c (rb_eval): `..'を文法に組み込み,`..'と`...'の動作をperl に合わせた. Sat May 20 01:22:48 1995 Yukihiro Matsumoto (matz@dyna) * io.c (select): timeout時と割込み時の動作の明確化. Co-authored-by: Takahasi Mamoru <taka@soum.co.jp> Co-authored-by: Yasuo OHBA <jammy@csg.mes.co.jp>
Diffstat (limited to 'sample')
-rw-r--r--sample/MANIFEST63
-rw-r--r--sample/aset.rb7
-rw-r--r--sample/attr.rb14
-rw-r--r--sample/blk.rb9
-rw-r--r--sample/case.rb14
-rw-r--r--sample/cat.rb5
-rw-r--r--sample/cat2.rb5
-rw-r--r--sample/clnt.rb3
-rw-r--r--sample/clone.rb18
-rw-r--r--sample/const.rb24
-rw-r--r--sample/dbm.rb2
-rw-r--r--sample/exyacc.rb20
-rwxr-xr-xsample/from.rb102
-rw-r--r--sample/gctest.rb67
-rw-r--r--sample/gctest2.rb71
-rw-r--r--sample/getopts.rb117
-rw-r--r--sample/hash.rb11
-rw-r--r--sample/list3.rb6
-rw-r--r--sample/marshal.rb13
-rw-r--r--sample/math.rb4
-rw-r--r--sample/mkproto.rb27
-rw-r--r--sample/occur2.rb2
-rw-r--r--sample/opt_s.rb12
-rw-r--r--sample/opt_x.test10
-rw-r--r--sample/parsearg.rb69
-rw-r--r--sample/rcs.rb2
-rw-r--r--sample/ruby-mode.el305
-rw-r--r--sample/samp.rb15
-rw-r--r--sample/sieve.rb2
-rw-r--r--sample/split.rb13
-rw-r--r--sample/struct.rb8
-rw-r--r--sample/svr.rb2
-rw-r--r--sample/system.rb2
-rw-r--r--sample/t1.rb20
-rw-r--r--sample/t2.rb23
-rw-r--r--sample/test.rb1043
-rw-r--r--sample/tkbiff.rb121
-rw-r--r--sample/tkbrowse.rb69
-rw-r--r--sample/tkdialog.rb62
-rw-r--r--sample/tkfrom.rb115
-rw-r--r--sample/tkhello.rb13
-rw-r--r--sample/tkline.rb29
-rw-r--r--sample/tktimer.rb49
-rw-r--r--sample/trap.pl6
-rw-r--r--sample/trap.rb3
-rw-r--r--sample/tt.rb100
46 files changed, 1756 insertions, 941 deletions
diff --git a/sample/MANIFEST b/sample/MANIFEST
deleted file mode 100644
index 93c971b114..0000000000
--- a/sample/MANIFEST
+++ /dev/null
@@ -1,63 +0,0 @@
-MANIFEST
-aset.rb
-attr.rb
-biorhythm.rb
-blk.rb
-case.rb
-cat.rb
-cat2.rb
-cbreak.rb
-clnt.rb
-clone.rb
-const.rb
-dbm.rb
-dir.rb
-evaldef.rb
-export.rb
-exyacc.rb
-fib.awk
-fib.pl
-fib.rb
-fib.scm
-freq.rb
-from.rb
-fullpath.pl
-fullpath.rb
-gctest.rb
-gctest2.rb
-getopts.rb
-getopts.test
-hash.rb
-io.rb
-less.rb
-list.rb
-list2.rb
-list3.rb
-math.rb
-mpart.rb
-occur.pl
-occur.rb
-occur2.rb
-opt_s.rb
-opt_x.test
-parsearg.rb
-rcs.awk
-rcs.dat
-rcs.rb
-ruby-mode.el
-samp.rb
-sieve.rb
-split.rb
-struct.rb
-svr.rb
-system.rb
-t1.rb
-t2.rb
-test.rb
-time.rb
-trap.pl
-trap.rb
-trojan.pl
-trojan.rb
-tt.rb
-uumerge.rb
diff --git a/sample/aset.rb b/sample/aset.rb
deleted file mode 100644
index 414c13ba70..0000000000
--- a/sample/aset.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# array set example
-# output:
-# 07045
-
-ary = [0, 0, 4, 5]
-ary[1, 0] = [7]
-print ary, "\n"
diff --git a/sample/attr.rb b/sample/attr.rb
deleted file mode 100644
index 1d329ea06a..0000000000
--- a/sample/attr.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# attribute access example
-# output:
-# 10
-# #<Foo: @test=10>
-
-class Foo
- attr "test", TRUE
-end
-
-foo = Foo.new
-foo.test = 10
-print foo.test, "\n"
-foo._inspect.print
-print "\n"
diff --git a/sample/blk.rb b/sample/blk.rb
deleted file mode 100644
index e11cc026ea..0000000000
--- a/sample/blk.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-def foo()
- $block = Block.new
-end
-
-foo(){|i| print "i = ", i, "\n"}
-$block.call(2)
-
-foo(){|i| print "i*2 = ", i*2, "\n"}
-$block.call(2)
diff --git a/sample/case.rb b/sample/case.rb
deleted file mode 100644
index e844cddfd6..0000000000
--- a/sample/case.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# case statement example
-# output:
-# 3..5
-
-case "t"
-when /1/
- print 1, "\n"
-when /t/
- print 3..5, "\n"
-when /./
- print 2, "\n"
-else
- print "else\n"
-end
diff --git a/sample/cat.rb b/sample/cat.rb
deleted file mode 100644
index a3243d308d..0000000000
--- a/sample/cat.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# cat -n & `...' operator test
-while gets()
- if $. == 1 ... ~ /^\*/; print("--") end
- printf("%5d: %s", $., $_)
-end
diff --git a/sample/cat2.rb b/sample/cat2.rb
deleted file mode 100644
index bbc1ebb0ff..0000000000
--- a/sample/cat2.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# cat -n & `...' operator test
-while gets()
- if 1 ... /^\*/; print("--") end
- printf("%5d: %s", $., $_)
-end
diff --git a/sample/clnt.rb b/sample/clnt.rb
index d2c71ec563..c8c4b2db9f 100644
--- a/sample/clnt.rb
+++ b/sample/clnt.rb
@@ -1,5 +1,8 @@
# socket example - client side
# usage: ruby clnt.rb [host] port
+
+require "socket"
+
host=(if $ARGV.length == 2; $ARGV.shift; else "localhost"; end)
print("Trying ", host, " ...")
STDOUT.flush
diff --git a/sample/clone.rb b/sample/clone.rb
deleted file mode 100644
index e7d6b00a31..0000000000
--- a/sample/clone.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# object cloning & single method test
-# output:
-# test2
-# test
-# test
-# clone.rb:18: undefined method `test2' for "#<Object: 0xbfca4>"(Object)
-foo = Object.new
-def foo.test
- print("test\n")
-end
-bar = foo.clone
-def bar.test2
- print("test2\n")
-end
-bar.test2
-bar.test
-foo.test
-foo.test2
diff --git a/sample/const.rb b/sample/const.rb
deleted file mode 100644
index 50780407b8..0000000000
--- a/sample/const.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# constant access test
-# output:
-# 1234
-# 1268
-TEST1 = 1
-TEST2 = 2
-
-module Const
- TEST3 = 3
- TEST4 = 4
-end
-
-module Const2
- TEST3 = 6
- TEST4 = 8
-end
-
-include Const
-
-print(TEST1,TEST2,TEST3,TEST4,"\n")
-
-include Const2
-
-print(TEST1,TEST2,TEST3,TEST4,"\n")
diff --git a/sample/dbm.rb b/sample/dbm.rb
index a2e0659bf5..c77cc2065b 100644
--- a/sample/dbm.rb
+++ b/sample/dbm.rb
@@ -1,4 +1,6 @@
# ruby dbm acess
+require "dbm"
+
d = DBM.open("test")
keys = d.keys
if keys.length > 0 then
diff --git a/sample/exyacc.rb b/sample/exyacc.rb
index cd1170feb4..dafcb037cc 100644
--- a/sample/exyacc.rb
+++ b/sample/exyacc.rb
@@ -8,15 +8,15 @@ while gets()
sbeg = $_.index("\n%%") + 1
send = $_.rindex("\n%%") + 1
$_ = $_[sbeg, send-sbeg]
- sub(/.*\n/, "")
- gsub(/'{'/, "'\001'")
- gsub(/'}'/, "'\002'")
- gsub('\*/', "\003\003")
- gsub("/\\*[^\003]*\003\003", '')
- while gsub(/{[^}{]*}/, ''); end
- gsub(/'\001'/, "'{'")
- gsub(/'\002'/, "'}'")
- while gsub(/^[ \t]*\n(\s)/, '\1'); end
- gsub(/([:|])[ \t\n]+(\w)/, '\1 \2')
+ sub!(/.*\n/, "")
+ gsub!(/'{'/, "'\001'")
+ gsub!(/'}'/, "'\002'")
+ gsub!('\*/', "\003\003")
+ gsub!("/\\*[^\003]*\003\003", '')
+ while gsub!(/{[^}{]*}/, ''); end
+ gsub!(/'\001'/, "'{'")
+ gsub!(/'\002'/, "'}'")
+ while gsub!(/^[ \t]*\n(\s)/, '\1'); end
+ gsub!(/([:|])[ \t\n]+(\w)/, '\1 \2')
print $_
end
diff --git a/sample/from.rb b/sample/from.rb
index f21b1d10f5..2f5fcebe12 100755
--- a/sample/from.rb
+++ b/sample/from.rb
@@ -1,97 +1,10 @@
#! /usr/local/bin/ruby
-module ParseDate
- MONTHS = {
- 'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4,
- 'may' => 5, 'jun' => 6, 'jul' => 7, 'aug' => 8,
- 'sep' => 9, 'oct' =>10, 'nov' =>11, 'dec' =>12 }
- MONTHPAT = MONTHS.keys.join('|')
- DAYPAT = 'mon|tue|wed|thu|fri|sat|sun'
-
- def parsedate(date)
- if date.sub(/(#{DAYPAT})/i, ' ')
- dayofweek = $1
- end
- if date.sub(/\s+(\d+:\d+(:\d+)?)/, ' ')
- time = $1
- end
- if date =~ /19(\d\d)/
- year = $1
- end
- if date.sub(/\s*(\d+)\s+(#{MONTHPAT})\S*\s+/i, ' ')
- dayofmonth = $1
- monthname = $2
- elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\s+/i, ' ')
- monthname = $1
- dayofmonth = $2
- elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\D+/i, ' ')
- monthname = $1
- dayofmonth = $2
- elsif date.sub(/\s*(\d\d?)\/(\d\d?)/, ' ')
- month = $1
- dayofmonth = $2
- end
- if monthname
- month = MONTHS[monthname.tolower]
- end
- if ! year && date =~ /\d\d/
- year = $&
- end
- return year, month, dayofmonth
- end
-
-end
+require "parsedate"
+require "base64"
include ParseDate
-def decode64(str)
- e = -1;
- c = ","
- for line in str.split("\n")
- line.tr 'A-Za-z0-9+/', "\000-\377"
- line.each_byte { |ch|
- e+=1
- if e==0
- c = ch << 2
- elsif e==1
- c |= ch >>4
- string += [c].pack('c')
- c = ch << 4
- elsif e == 2
- c |= ch >> 2
- string += [c].pack('c');
- c = ch << 6
- elsif e==3
- c |= ch
- string += [c].pack('c')
- e = -1;
- end
- }
- end
- return string;
-end
-
-def j2e(str)
- while str =~ /\033\$B([^\033]*)\033\(B/
- s = $1
- pre, post = $`, $'
- s.gsub(/./) { |ch|
- (ch[0]|0x80).chr
- }
- str = pre + s + post
- end
- str
-end
-
-def decode_b(str)
- while str =~ /=\?ISO-2022-JP\?B\?(.*)=\?=/
- pre, post = $`, $'
- s = decode64($1)
- str = pre + s + post
- end
- j2e(str)
-end
-
if $ARGV[0] == '-w'
wait = TRUE
$ARGV.shift
@@ -100,7 +13,7 @@ end
class Mail
def Mail.new(f)
- if !f.is_kind_of(IO)
+ if !f.is_kind_of?(IO)
f = open(f, "r")
me = super
f.close
@@ -114,9 +27,9 @@ class Mail
@header = {}
@body = []
while f.gets()
- $_.chop
+ $_.chop!
continue if /^From / # skip From-line
- break if /^[ \t]*$/ # end of header
+ break if /^$/ # end of header
if /^(\S+):\s*(.*)/
@header[attr = $1.capitalize] = $2
elsif attr
@@ -149,17 +62,18 @@ $outcount = 0;
def fromout(date, from, subj)
return if !date
y = m = d = 0
+ esc = "\033\(B"
y, m, d = parsedate(date) if date
from = "sombody@somewhere" if ! from
subj = "(nil)" if ! subj
from = decode_b(from)
subj = decode_b(subj)
- printf "%-02d/%02d/%02d [%-28.28s] %-40.40s\n", y, m, d, from, subj
+ printf "%-02d/%02d/%02d [%-28.28s%s] %-40.40s%s\n",y,m,d,from,esc,subj,esc
$outcount += 1
end
for file in $ARGV
- continue if !File.exists(file)
+ continue if !File.exists?(file)
f = open(file, "r")
while !f.eof
mail = Mail.new(f)
diff --git a/sample/gctest.rb b/sample/gctest.rb
deleted file mode 100644
index 6810b95481..0000000000
--- a/sample/gctest.rb
+++ /dev/null
@@ -1,67 +0,0 @@
-# GC stress test
-def cons(car, cdr)
- [car, cdr]
-end
-
-def car(x)
- if x == nil ; nil else x[0] end
-end
-
-def cdr(x)
- if x == nil ; nil else x[1] end
-end
-
-def reverse1(x, y)
- if x == nil ; y else reverse1(cdr(x), cons(car(x), y)) end
-end
-
-def reverse(x)
- reverse1(x, nil)
-end
-
-def ints(low, up)
- if low > up
- nil
- else
- cons(low, ints(low+1, up))
- end
-end
-
-def print_int_list(x)
- if x == nil
- print("NIL\n")
- else
- print(car(x))
- if nil != cdr(x)
- print(", ")
- print_int_list(cdr(x))
- else
- print("\n")
- end
- end
-end
-
-print("start\n")
-
-a = ints(1, 100)
-print_int_list(a)
-b = ints(1, 50)
-print_int_list(b)
-print_int_list(reverse(a))
-print_int_list(reverse(b))
-for i in 1 .. 100
- b = reverse(reverse(b))
-# print(i, ": ")
-# print_int_list(b)
-end
-print("a: ")
-print_int_list(a)
-print("b: ")
-print_int_list(b)
-print("reverse(a): ")
-print_int_list(reverse(a))
-print("reverse(b): ")
-print_int_list(reverse(b))
-a = b = nil
-print("finish\n")
-GC.start()
diff --git a/sample/gctest2.rb b/sample/gctest2.rb
deleted file mode 100644
index 851d14f217..0000000000
--- a/sample/gctest2.rb
+++ /dev/null
@@ -1,71 +0,0 @@
-# GC stress test
-def cons(car, cdr)
- car::cdr
-end
-
-def car(x)
- x.car
-end
-
-def cdr(x)
- x.cdr
-end
-
-def reverse1(x, y)
- if x == nil then
- y
- else
- reverse1(cdr(x), cons(car(x), y))
- end
-end
-
-def reverse(x)
- reverse1(x, nil)
-end
-
-def ints(low, up)
- if low > up
- nil
- else
- cons(low, ints(low+1, up))
- end
-end
-
-def print_int_list(x)
- if x == nil
- print("NIL\n")
- else
- print(car(x))
- if cdr(x)
- print(", ")
- print_int_list(cdr(x))
- else
- print("\n")
- end
- end
-end
-
-print("start\n")
-
-a = ints(1, 100)
-print_int_list(a)
-b = ints(1, 50)
-print_int_list(b)
-print_int_list(reverse(a))
-print_int_list(reverse(b))
-for i in 1 .. 100
- b = reverse(reverse(b))
-# print(i, ": ")
-# print_int_list(b)
-end
-print("a: ")
-print_int_list(a)
-print("b: ")
-print_int_list(b)
-print("reverse(a): ")
-print_int_list(reverse(a))
-print("reverse(b): ")
-print_int_list(reverse(b))
-a = b = nil
-print("finish\n")
-GC.start()
diff --git a/sample/getopts.rb b/sample/getopts.rb
deleted file mode 100644
index 37fd3dc69d..0000000000
--- a/sample/getopts.rb
+++ /dev/null
@@ -1,117 +0,0 @@
-#
-# getopts.rb - get options
-# $Release Version: $
-# $Revision: 1.2 $
-# $Date: 1994/02/15 05:17:15 $
-# by Yasuo OHBA(STAFS Development Room)
-#
-# --
-# IvV̉͂, $OPT_?? ɒlZbg܂.
-# ŵȂIvVw肳ꂽ nil Ԃ܂.
-# Iꍇ, ZbgꂽIvV̐Ԃ܂.
-#
-# getopts(single_opts, *opts)
-#
-# ex. sample [options] filename
-# options ...
-# -f -x --version --geometry 100x200 -d unix:0.0
-#
-# getopts("fx", "version", "geometry:", "d:")
-#
-# :
-# -f -x (= -fx) ̗lȈꕶ̃IvV̎w܂.
-# ňȂƂ nil ̎w肪Kvł.
-# ȍ~:
-# Ol[̃IvV, ̔IvV̎w܂.
-# --version , --geometry 300x400 , -d host:0.0 ł.
-# 𔺂w ":" KtĂ.
-#
-# IvV̎w肪ꍇ, ϐ $OPT_?? non-nil , ̃I
-# vV̈Zbg܂.
-# -f -> $OPT_f = TRUE
-# --geometry 300x400 -> $OPT_geometry = 300x400
-#
-# - -- , ȍ~, SăIvV̉͂܂.
-#
-
-$RCS_ID="$Header: /var/ohba/RCS/getopts.rb,v 1.2 1994/02/15 05:17:15 ohba Exp ohba $"
-
-def getopts(single_opts, *opts)
- if (opts)
- single_colon = ""
- long_opts = []
- sc = 0
- for option in opts
- if (option.length <= 2)
- single_colon[sc, 0] = option[0, 1]
- sc += 1
- else
- long_opts.push(option)
- end
- end
- end
-
- opts = {}
- count = 0
- while ($ARGV.length != 0)
- compare = nil
- case $ARGV[0]
- when /^--?$/
- $ARGV.shift
- break
- when /^--.*/
- compare = $ARGV[0][2, ($ARGV[0].length - 2)]
- if (long_opts != "")
- for option in long_opts
- if (option[(option.length - 1), 1] == ":" &&
- option[0, (option.length - 1)] == compare)
- if ($ARGV.length <= 1)
- return nil
- end
- eval("$OPT_" + compare + " = " + '$ARGV[1]')
- opts[compare] = TRUE
- $ARGV.shift
- count += 1
- break
- elsif (option == compare)
- eval("$OPT_" + compare + " = TRUE")
- opts[compare] = TRUE
- count += 1
- break
- end
- end
- end
- when /^-.*/
- for index in 1..($ARGV[0].length - 1)
- compare = $ARGV[0][index, 1]
- if (single_opts && compare =~ "[" + single_opts + "]")
- eval("$OPT_" + compare + " = TRUE")
- opts[compare] = TRUE
- count += 1
- elsif (single_colon != "" && compare =~ "[" + single_colon + "]")
- if ($ARGV[0][index..-1].length > 1)
- eval("$OPT_" + compare + " = " + '$ARGV[0][(index + 1)..-1]')
- opts[compare] = TRUE
- count += 1
- elsif ($ARGV.length <= 1)
- return nil
- else
- eval("$OPT_" + compare + " = " + '$ARGV[1]')
- opts[compare] = TRUE
- $ARGV.shift
- count = count + 1
- end
- break
- end
- end
- else
- break
- end
-
- $ARGV.shift
- if (!opts.includes(compare))
- return nil
- end
- end
- return count
-end
diff --git a/sample/hash.rb b/sample/hash.rb
deleted file mode 100644
index 85f719e7eb..0000000000
--- a/sample/hash.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# hash value
-# output:
-# 78651
-# 78651
-# 78651
-# -45637
-
-print(+-1.0.hash,"\n")
-print(-1.0.hash,"\n")
-print((-1.0).hash,"\n")
-print(-(1.0.hash),"\n")
diff --git a/sample/list3.rb b/sample/list3.rb
index 2c1beb6fa2..1d756fdff0 100644
--- a/sample/list3.rb
+++ b/sample/list3.rb
@@ -1,5 +1,5 @@
# Linked list example -- short version
-# using _inspect
+# using inspect
class Point
def initialize(x, y)
@@ -14,5 +14,5 @@ end
list1 = [10, 20, Point.new(2, 3), Point.new(4, 5)]
list2 = [20, Point.new(4, 5), list1]
-print("list1: ", list1._inspect, "\n")
-print("list2: ", list2._inspect, "\n")
+print("list1: ", list1.inspect, "\n")
+print("list2: ", list2.inspect, "\n")
diff --git a/sample/marshal.rb b/sample/marshal.rb
new file mode 100644
index 0000000000..3d399ffe68
--- /dev/null
+++ b/sample/marshal.rb
@@ -0,0 +1,13 @@
+require "marshal"
+include Marshal
+a = 25.6;
+pt = Struct.new('point', :x,:y);
+x = pt.new(10, 10)
+y = pt.new(20, 20)
+rt = Struct.new('rectangle', :origin,:corner);
+z = rt.new(x, y)
+c = Object.new
+s = [a, x, z, c, c, "fff"];
+print s.inspect;
+d = dumps(s);
+print load(d).inspect
diff --git a/sample/math.rb b/sample/math.rb
deleted file mode 100644
index c0b5225080..0000000000
--- a/sample/math.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-# math example
-include Math
-sqrt(4)
-print(Math.sqrt(257), "\n")
diff --git a/sample/mkproto.rb b/sample/mkproto.rb
new file mode 100644
index 0000000000..1d9c9faccb
--- /dev/null
+++ b/sample/mkproto.rb
@@ -0,0 +1,27 @@
+$/ = nil
+while gets()
+ if /^((void|VALUE|int|char *\*|ID|struct [\w_]+ *\*|st_table *\*) *)?\n([\w\d_]+)\(.*\)\n\s*((.+;\n)*){/
+ $_ = $'
+ printf "%s %s(", $2, $3
+ args = []
+ for arg in $4.split(/;\n\s*/)
+ arg.gsub! ' +', ' '
+ if arg =~ /,/
+ if arg =~ /(([^*]+) *\** *[\w\d_]+),/
+ type = $2.strip!
+ args.push $1.strip!
+ arg = $'
+ else
+ type = ""
+ end
+ while arg.sub!(/(\** *[\w\d_]+)(,|$)/, "")
+ args.push type + " " + $1.strip!
+ end
+ else
+ args.push arg.strip!
+ end
+ end
+ printf "%s);\n", args.join(', ')
+ redo
+ end
+end
diff --git a/sample/occur2.rb b/sample/occur2.rb
index 8cd5acbe5e..c450c30b0f 100644
--- a/sample/occur2.rb
+++ b/sample/occur2.rb
@@ -5,7 +5,7 @@ while gets()
for word in $_.split(/\W+/)
begin
freq[word] = freq[word] + 1
- resque
+ rescue
freq[word] = 1
end
end
diff --git a/sample/opt_s.rb b/sample/opt_s.rb
deleted file mode 100644
index 56ff0eea15..0000000000
--- a/sample/opt_s.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-#! ./ruby -s
-# test for option `-s'
-
-if ($xyz)
- print("xyz = TRUE\n")
-end
-if ($zzz)
- print("zzz = ", $zzz, "\n")
-end
-if ($ARGV.length > 0)
- print($ARGV.join(", "), "\n")
-end
diff --git a/sample/opt_x.test b/sample/opt_x.test
deleted file mode 100644
index 47a67f6cfa..0000000000
--- a/sample/opt_x.test
+++ /dev/null
@@ -1,10 +0,0 @@
-test for option `-x'
-
-this is a forwarding header
-this is a header too.
-
-from here script starts
-#! ./ruby -v
-print("tt\n")
-__END__
-this is a trailer
diff --git a/sample/parsearg.rb b/sample/parsearg.rb
deleted file mode 100644
index e7e2b7a7f3..0000000000
--- a/sample/parsearg.rb
+++ /dev/null
@@ -1,69 +0,0 @@
-#
-# parseargs.rb - parse arguments
-# $Release Version: $
-# $Revision: 1.3 $
-# $Date: 1994/02/15 05:16:21 $
-# by Yasuo OHBA(STAFS Development Room)
-#
-# --
-# ̉͂, $OPT_?? ɒlZbg܂.
-# Iꍇ, ZbgꂽIvV̐Ԃ܂.
-#
-# parseArgs(argc, single_opts, *opts)
-#
-# ex. sample [options] filename
-# options ...
-# -f -x --version --geometry 100x200 -d unix:0.0
-#
-# parseArgs(1, nil, "fx", "version", "geometry:", "d:")
-#
-# :
-# IvVȊO̍Œ̐
-# :
-# IvV̕KvcKKvȂ %TRUE łȂ %FALSE.
-# O:
-# -f -x (= -fx) ̗lȈꕶ̃IvV̎w܂.
-# ňȂƂ nil ̎w肪Kvł.
-# lȍ~:
-# Ol[̃IvV, ̔IvV̎w܂.
-# --version , --geometry 300x400 , -d host:0.0 ł.
-# 𔺂w ":" KtĂ.
-#
-# IvV̎w肪ꍇ, ϐ $OPT_?? non-nil , ̃I
-# vV̈Zbg܂.
-# -f -> $OPT_f = %TRUE
-# --geometry 300x400 -> $OPT_geometry = 300x400
-#
-# usage gꍇ, $USAGE usage() w肵܂.
-# def usage()
-# c
-# end
-# $USAGE = 'usage'
-# usage , --help w肳ꂽ, Ԉwɕ\܂.
-#
-# - -- , ȍ~, SăIvV̉͂܂.
-#
-
-$RCS_ID="$Header: /var/ohba/RCS/parseargs.rb,v 1.3 1994/02/15 05:16:21 ohba Exp ohba $"
-
-load("getopts.rb")
-
-def printUsageAndExit()
- if $USAGE
- apply($USAGE)
- end
- exit()
-end
-
-def parseArgs(argc, nopt, single_opts, *opts)
- if ((noOptions = getopts(single_opts, *opts)) == nil)
- printUsageAndExit()
- end
- if (nopt && noOptions == 0)
- printUsageAndExit()
- end
- if ($ARGV.length < argc)
- printUsageAndExit()
- end
- return noOptions
-end
diff --git a/sample/rcs.rb b/sample/rcs.rb
index faa4606788..13476267b2 100644
--- a/sample/rcs.rb
+++ b/sample/rcs.rb
@@ -16,7 +16,7 @@ while gets()
s = "";
while xr < hdw
x = xr * (1 + y) - y * w / 2
- i = (x / (1 + h) + sw /2)
+ i = (x / (1 + h) + sw / 2)
if (1 < i && i < $_.length);
c = $_[i, 1].to_i
else
diff --git a/sample/ruby-mode.el b/sample/ruby-mode.el
index bcbbdc35f3..b555994fea 100644
--- a/sample/ruby-mode.el
+++ b/sample/ruby-mode.el
@@ -12,21 +12,24 @@
)
(defconst ruby-block-mid-re
- "else\\|elsif\\|when\\|resque\\|ensure"
+ "then\\|else\\|elsif\\|when\\|rescue\\|ensure"
)
(defconst ruby-block-end-re "end")
(defconst ruby-delimiter
- (concat "[$/<(){}#\"'`]\\|\\[\\|\\]\\|\\b\\("
- ruby-block-beg-re "\\|" ruby-block-end-re "\\)\\b")
+ (concat "[?$/(){}#\"'`]\\|\\[\\|\\]\\|\\<\\("
+ ruby-block-beg-re "\\|" ruby-block-end-re "\\)\\>")
)
(defconst ruby-negative
(concat "^[ \t]*\\(\\b\\(" ruby-block-mid-re "\\)\\|\\("
- ruby-block-end-re "\\)\\b\\|\\}\\|\\]\\)")
+ ruby-block-end-re "\\)\\>\\|\\}\\|\\]\\)")
)
+(defconst ruby-operator-chars "[,.+*/%-&|^~=<>:]")
+(defconst ruby-symbol-chars "[a-zA-Z0-9_]")
+
(defvar ruby-mode-abbrev-table nil
"Abbrev table in use in ruby-mode buffers.")
@@ -53,17 +56,16 @@
(setq ruby-mode-syntax-table (make-syntax-table))
(modify-syntax-entry ?\' "\"" ruby-mode-syntax-table)
(modify-syntax-entry ?\" "\"" ruby-mode-syntax-table)
-;;(modify-syntax-entry ?\n ">" ruby-mode-syntax-table)
-;;(modify-syntax-entry ?\f ">" ruby-mode-syntax-table)
(modify-syntax-entry ?# "<" ruby-mode-syntax-table)
- (modify-syntax-entry ?$ "/" ruby-mode-syntax-table)
+ (modify-syntax-entry ?\n ">" ruby-mode-syntax-table)
(modify-syntax-entry ?\\ "'" ruby-mode-syntax-table)
- (modify-syntax-entry ?_ "w" ruby-mode-syntax-table)
+ (modify-syntax-entry ?$ "/" ruby-mode-syntax-table)
+ (modify-syntax-entry ?? "/" ruby-mode-syntax-table)
+ (modify-syntax-entry ?_ "_" ruby-mode-syntax-table)
(modify-syntax-entry ?< "." ruby-mode-syntax-table)
(modify-syntax-entry ?> "." ruby-mode-syntax-table)
(modify-syntax-entry ?& "." ruby-mode-syntax-table)
(modify-syntax-entry ?| "." ruby-mode-syntax-table)
- (modify-syntax-entry ?$ "." ruby-mode-syntax-table)
(modify-syntax-entry ?% "." ruby-mode-syntax-table)
(modify-syntax-entry ?= "." ruby-mode-syntax-table)
(modify-syntax-entry ?/ "." ruby-mode-syntax-table)
@@ -152,6 +154,19 @@ The variable ruby-indent-level controls the amount of indentation.
(indent-to x)
(if (> p 0) (forward-char p)))))
+(defun ruby-expr-beg ()
+ (save-excursion
+ (skip-chars-backward " \t")
+ (or (bolp) (forward-char -1))
+ (or (looking-at ruby-operator-chars)
+ (looking-at "[\\[({]")
+ (bolp)
+ (and (looking-at ruby-symbol-chars)
+ (forward-word -1)
+ (or
+ (looking-at ruby-block-beg-re)
+ (looking-at ruby-block-mid-re))))))
+
(defun ruby-parse-region (start end)
(let ((indent-point end)
(indent 0)
@@ -163,113 +178,97 @@ The variable ruby-indent-level controls the amount of indentation.
(if start
(goto-char start)
(ruby-beginning-of-defun))
- (while (and (> indent-point (point))
- (re-search-forward ruby-delimiter indent-point t))
- (let ((w (buffer-substring (match-beginning 0) (match-end 0)))
- (pnt (match-beginning 0)))
- (cond
- ((or (string= "\"" w) ;skip string
- (string= "'" w)
- (string= "`" w))
- (cond
- ((string= w (char-to-string (char-after (point))))
- (forward-char 1))
- ((re-search-forward (format "[^\\]%s" w) indent-point t)
+ (save-restriction
+ (narrow-to-region (point) end)
+ (while (and (> indent-point (point))
+ (re-search-forward ruby-delimiter indent-point t))
+ (let ((pnt (point)) w)
+ (goto-char (match-beginning 0))
+ (cond
+
+ ((or (looking-at "\"") ;skip string
+ (looking-at "'")
+ (looking-at "`"))
+ (setq w (char-after (point)))
+ (cond
+ ((and (not (eobp))
+ (equal w (char-after (point)))
+ (re-search-forward (format "[^\\]%c" w) indent-point t))
nil)
- (t
- (goto-char indent-point)
- (setq in-string t))))
- ((or (string= "/" w)
- (string= "<" w))
- (if (string= "<" w) (setq w ">"))
- (let (c)
- (save-excursion
- (goto-char pnt)
- (skip-chars-backward " \t")
- (setq c (char-after (1- (point))))
- (if c
- (setq c (char-syntax c))))
+ (t
+ (goto-char indent-point)
+ (setq in-string t))))
+ ((looking-at "/")
+ (if (and (ruby-expr-beg)
+ (goto-char pnt)
+ (looking-at "\\([^/\n]\\|\\\\/\\)*")
+ (eq ?/ (char-after (match-end 0))))
+ (goto-char (1+ (match-end 0)))
+ (goto-char indent-point)
+ (setq in-string t)))
+ ((looking-at "\\?") ;skip ?char
(cond
- ((or (eq c ?.)
- (and (eq c ?w)
- (save-excursion
- (forward-word -1)
- (or
- (looking-at ruby-block-beg-re)
- (looking-at ruby-block-mid-re)))))
- (if (search-forward w indent-point t)
- nil
- (goto-char indent-point)
- (setq in-string t))))))
- ((string= "$" w) ;skip $char
- (forward-char 1))
- ((string= "#" w) ;skip comment
- (forward-line 1))
- ((string= "(" w) ;skip to matching paren
- (let ((orig depth))
- (setq nest (cons (point) nest))
- (setq depth (1+ depth))
- (while (and (/= depth orig)
- (re-search-forward "[()]" indent-point t))
- (cond
- ((= (char-after (match-beginning 0)) ?\( )
- (setq nest (cons (point) nest))
- (setq depth (1+ depth)))
- (t
- (setq nest (cdr nest))
- (setq depth (1- depth)))))
- (if (> depth orig) (setq in-paren ?\())))
- ((string= "[" w) ;skip to matching paren
- (let ((orig depth))
- (setq nest (cons (point) nest))
- (setq depth (1+ depth))
- (while (and (/= depth orig)
- (re-search-forward "\\[\\|\\]" indent-point t))
- (cond
- ((= (char-after (match-beginning 0)) ?\[ )
- (setq nest (cons (point) nest))
- (setq depth (1+ depth)))
- (t
- (setq nest (cdr nest))
- (setq depth (1- depth)))))
- (if (> depth orig) (setq in-paren ?\[))))
- ((string= "{" w) ;skip to matching paren
- (let ((orig depth))
- (setq nest (cons (point) nest))
+ ((ruby-expr-beg)
+ (looking-at "?\\(\\\\C-\\|\\\\M-\\)*.")
+ (goto-char (match-end 0)))
+ (t
+ (goto-char pnt))))
+ ((looking-at "\\$") ;skip $char
+ (goto-char pnt)
+ (forward-char 1))
+ ((looking-at "#") ;skip comment
+ (forward-line 1)
+ (goto-char pnt))
+ ((looking-at "[\\[({]")
+ (setq nest (cons (cons (char-after (point)) pnt) nest))
(setq depth (1+ depth))
- (while (and (/= depth orig)
- (re-search-forward "[{}]" indent-point t))
- (cond
- ((= (char-after (match-beginning 0)) ?{ )
- (setq nest (cons (point) nest))
- (setq depth (1+ depth)))
- (t
- (setq nest (cdr nest))
- (setq depth (1- depth)))))
- (if (> depth orig) (setq in-paren ?{))))
- ((string-match ruby-block-end-re w)
- (setq nest (cdr nest))
- (setq depth (1- depth)))
- ((string-match ruby-block-beg-re w)
- (let (c)
- (save-excursion
- (goto-char pnt)
- (skip-chars-backward " \t")
- (setq c (char-after (1- (point)))))
- (if (or (null c) (= c ?\n) (= c ?\;))
- (progn
- (setq nest (cons (point) nest))
- (setq depth (1+ depth))))))
- (t
- (error (format "bad string %s" w)))))))
- (list in-string in-paren (car nest) depth)))
+ (goto-char pnt))
+ ((looking-at "[])}]")
+ (setq nest (cdr nest))
+ (setq depth (1- depth))
+ (goto-char pnt))
+ ((looking-at ruby-block-end-re)
+ (if (and (not (bolp))
+ (progn
+ (forward-char -1)
+ (eq ?_ (char-after (point))))
+ (progn
+ (goto-char pnt)
+ (eq ?_ (char-after (point)))))
+ nil
+ (setq nest (cdr nest))
+ (setq depth (1- depth)))
+ (goto-char pnt))
+ ((looking-at ruby-block-beg-re)
+ (and
+ (or (bolp)
+ (progn
+ (forward-char -1)
+ (not (eq ?_ (char-after (point))))))
+ (save-excursion
+ (goto-char pnt)
+ (not (eq ?_ (char-after (point)))))
+ (skip-chars-backward " \t")
+ (or (bolp)
+ (save-excursion
+ (forward-char -1)
+ (looking-at ruby-operator-chars)))
+ (progn
+ (setq nest (cons (cons nil pnt) nest))
+ (setq depth (1+ depth))))
+ (goto-char pnt))
+ (t
+ (error (format "bad string %s"
+ (buffer-substring (point) pnt)
+ )))))))
+ (list in-string (car nest) depth))))
(defun ruby-calculate-indent (&optional parse-start)
(save-excursion
(beginning-of-line)
(let ((indent-point (point))
(case-fold-search nil)
- state eol
+ state bol eol
(indent 0))
(if parse-start
(goto-char parse-start)
@@ -281,25 +280,74 @@ The variable ruby-indent-level controls the amount of indentation.
(setq indent nil)) ; do nothing
((nth 1 state) ; in paren
- (goto-char (nth 2 state))
+ (goto-char (cdr (nth 1 state)))
(setq indent
- (if (and (eq (nth 1 state) ?\( ) (not (looking-at "$")))
+ (if (and (eq (car (nth 1 state)) ?\( )
+ (not (looking-at "(\\s *$")))
(current-column)
(+ (current-indentation) ruby-indent-level))))
- ((> (nth 3 state) 0) ; in nest
- (goto-char (nth 2 state))
+ ((> (nth 2 state) 0) ; in nest
+ (goto-char (cdr (nth 1 state)))
(forward-word -1) ; skip back a keyword
(setq indent (+ (current-column) ruby-indent-level)))
(t ; toplevel
(setq indent 0)))
- (goto-char indent-point)
- (end-of-line)
- (setq eol (point))
- (beginning-of-line)
- (if (re-search-forward ruby-negative eol t)
+
+ (cond
+ (indent
+ (goto-char indent-point)
+ (end-of-line)
+ (setq eol (point))
+ (beginning-of-line)
+ (cond
+ ((re-search-forward ruby-negative eol t)
(setq indent (- indent ruby-indent-level)))
+ ;;operator terminated lines
+ ((and
+ (save-excursion
+ (beginning-of-line)
+ (not (bobp)))
+ (or (null (car (nth 1 state))) ;not in parens
+ (and (eq (car (nth 1 state)) ?\{)
+ (save-excursion ;except non-block braces
+ (goto-char (cdr (nth 1 state)))
+ (or (bobp) (forward-char -1))
+ (not (ruby-expr-beg))))))
+ (beginning-of-line)
+ (skip-chars-backward " \t\n")
+ (beginning-of-line) ; goto beginning of non-empty line
+ (setq bol (point))
+ (end-of-line)
+ (setq eol (point))
+ (and (search-backward "#" bol t) ; check for comment line
+ (not (eq ?? (char-after (1- (point)))))
+ (not (nth 0 (ruby-parse-region parse-start (point))))
+ (setq eol (point)))
+ (goto-char eol)
+ (skip-chars-backward " \t")
+ (or (bobp) (forward-char -1))
+ (and (looking-at ruby-operator-chars)
+;; (or (not (eq ?/ (char-after (point))))
+;; (progn
+;; (not (nth 0 (ruby-parse-region parse-start (point))))))
+ (or (not (eq ?/ (char-after (point))))
+ (null (nth 0 (ruby-parse-region parse-start (point)))))
+ (save-excursion
+ (goto-char parse-start)
+ (sit-for 1))
+ (not (eq (char-after (1- (point))) ?$))
+ (or (not (eq ?| (char-after (point))))
+ (save-excursion
+ (or (eolp) (forward-char -1))
+ (and (search-backward "|" bol t)
+ (skip-chars-backward " \t\n")
+ (and (not (eolp))
+ (progn
+ (forward-char -1)
+ (not (looking-at "\\{")))))))
+ (setq indent (+ indent ruby-indent-level)))))))
indent)))
(defun ruby-electric-brace (arg)
@@ -329,7 +377,7 @@ An end of a defun is found by moving forward from the beginning of one."
(interactive "*")
(save-excursion
(delete-region (point) (progn (skip-chars-backward " \t") (point))))
- (insert ?\n)
+ (newline)
(save-excursion
(forward-line -1)
(indent-according-to-mode))
@@ -348,3 +396,26 @@ An end of a defun is found by moving forward from the beginning of one."
(goto-char beg)
(while (re-search-forward "^\\([ \t]*\\)#" end t)
(replace-match "\\1" nil nil))))
+
+(if (featurep 'hilit19)
+ (hilit-set-mode-patterns
+ 'ruby-mode
+ '(("\\s #.*$" nil comment)
+ ("^#.*$" nil comment)
+ ("\\$\\(.\\|\\sw+\\)" nil type)
+ ("[^$\\?]\\(\"[^\\\"]*\\(\\\\\\(.\\|\n\\)[^\\\"]*\\)*\"\\)" 1 string)
+ ("[^$\\?]\\('[^\\']*\\(\\\\\\(.\\|\n\\)[^\\']*\\)*'\\)" 1 string)
+ ("^/\\([^/\n]\\|\\\\/\\)*/" nil string)
+ ("[^a-zA-Z_]\\s *\\(/\\([^/\n]\\|\\\\/\\)*/\\)" 1 string)
+ ("\\(begin\\|case\\|else\\|elsif\\|end\\|ensure\\|for\\|if\\|rescue\\|then\\|when\\|while\\)\\s *\\(/\\([^/\n]\\|\\\\/\\)*/\\)" 2 string)
+ ("^\\s *require.*$" nil include)
+ ("^\\s *load.*$" nil include)
+ ("^\\s *\\(include\\|alias\\|undef\\).*$" nil decl)
+ ("^\\s *\\<\\(class\\|def\\|module\\)\\>" "[)\n;]" defun)
+ ("[^_]\\<\\(begin\\|case\\|else\\|elsif\\|end\\|ensure\\|for\\|if\\|rescue\\|then\\|when\\|while\\)\\>[^_]" 1 defun)
+ ("[^_]\\<\\(and\\|break\\|continue\\|fail\\|in\\|not\\|or\\|redo\\|retry\\|return\\|super\\|yield\\)\\>[^_]" 1 keyword)
+ ("[^_]\\<\\(self\\|nil\\|TRUE\\|FALSE\\|__LINE__\\|__FILE__\\)\\>[^_]" 1 define)
+ ("$.[a-zA-Z_0-9]*" nil struct)
+ ("@[a-zA-Z_0-9]+" nil struct)
+ ("[^_]\\<[A-Z].[a-zA-Z_0-9]*" nil define)
+ ("^__END__" nil label))))
diff --git a/sample/samp.rb b/sample/samp.rb
deleted file mode 100644
index 4052a308c1..0000000000
--- a/sample/samp.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# Sp܂ރXNvg
-# g: samp.rb file..
-
-P = 0
-while gets()
- printf("%3d: %s", $., $_)
- while sub(/\w+/, '')
- if $& != "";
- P += 1
- end
- end
- if ($. >= 10); break; end
-end
-printf("line: %d\n", $.)
-printf("word: %d\n", P)
diff --git a/sample/sieve.rb b/sample/sieve.rb
index 640cc32b08..a953784284 100644
--- a/sample/sieve.rb
+++ b/sample/sieve.rb
@@ -12,7 +12,7 @@ for i in 2 .. max
print ", "
print i
sieve.push(i)
- resque
+ rescue
end
end
print "\n"
diff --git a/sample/split.rb b/sample/split.rb
deleted file mode 100644
index 2b6f3921ce..0000000000
--- a/sample/split.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# split test
-print("1 byte string", "\n")
-print("1 byte string".reverse, "\n")
-
-print("ʸ", "\n")
-print("ʸ".reverse, "\n")
-
-print("1 byte string", "\n")
-print("1 byte string".split(//).reverse.join(":"), "\n")
-print("ʸ", "\n")
-print("ʸ".split(//).reverse.join(":"), "\n")
-print("Ѥ1byteκ", "\n")
-print("Ѥ1byteκ".split(//).reverse.join(":"), "\n")
diff --git a/sample/struct.rb b/sample/struct.rb
deleted file mode 100644
index 322764d02f..0000000000
--- a/sample/struct.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-#output:
-# struct test
-# 1
-
-foo = Struct.new("test", "a1"::1, "a2"::2)
-print(foo, "\n")
-bar = foo.clone
-print(bar.a1, "\n")
diff --git a/sample/svr.rb b/sample/svr.rb
index 23b2bf71f6..460c16bedf 100644
--- a/sample/svr.rb
+++ b/sample/svr.rb
@@ -1,6 +1,8 @@
# socket example - server side
# usage: ruby svr.rb
+require "socket"
+
gs = TCPserver.open(0)
addr = gs.addr
addr.shift
diff --git a/sample/system.rb b/sample/system.rb
deleted file mode 100644
index 02f3782b39..0000000000
--- a/sample/system.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-# command string
-print(`echo foobar`)
diff --git a/sample/t1.rb b/sample/t1.rb
deleted file mode 100644
index 701a1cd389..0000000000
--- a/sample/t1.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-def test(a1, *a2)
- while 1
- case gets()
- when nil
- break
- when /^-$/
- print("-\n")
- return
- when /^-help/
- print("-help\n")
- break
- end
- end
- print(a1, a2, "\n")
-end
-
-print($ARGV, "\n")
-print("in: ")
-test(1)
-print("end\n")
diff --git a/sample/t2.rb b/sample/t2.rb
deleted file mode 100644
index 2e3741e8f1..0000000000
--- a/sample/t2.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-#print("in Print\n")
-def t2() end
-
-def println(*args)
- for a in args
- t2()
- print(a)
- end
- print("\n")
-end
-
-def tt
- for i in 1..10
- println("i:", i);
- yield(i);
- end
-end
-
-test = tt{|i|
- if i == 3; break end
- println("ttt: ", i);
-}
-#exit()
diff --git a/sample/test.rb b/sample/test.rb
index 9c422cc94a..7f26433181 100644
--- a/sample/test.rb
+++ b/sample/test.rb
@@ -1,5 +1,1040 @@
-index = 1
-for argument in $ARGV
- printf("%d:%s\n", index, argument)
- index = index + 1
+#! /usr/local/bin/ruby
+
+$testnum=0
+
+def check(what)
+ printf "%s\n", what
+ $what = what
+ $testnum = 0
end
+
+def ok
+ $testnum+=1
+ printf "ok %d\n", $testnum
+end
+
+def notok
+ $testnum+=1
+ printf "not ok %s %d\n", $what, $testnum
+ $failed = TRUE
+end
+
+# make sure conditional operators work
+
+check "condition"
+
+$x = '0';
+
+$x == $x && ok
+$x != $x && notok
+$x == $x || notok
+$x != $x || ok
+
+# first test to see if we can run the tests.
+
+check "if";
+
+$x = 'test';
+if $x == $x then ok else notok end
+if $x != $x then notok else ok end
+
+check "case"
+
+case 5
+when 1, 2, 3, 4, 6, 7, 8
+ notok
+when 5
+ ok
+end
+
+case 5
+when 5
+ ok
+when 1..10
+ notok
+end
+
+case 5
+when 5
+ ok
+else
+ notok
+end
+
+case "foobar"
+when /^f.*r$/
+ ok
+else
+ notok
+end
+
+check "while";
+
+tmp = open("while_tmp", "w")
+tmp.print "tvi925\n";
+tmp.print "tvi920\n";
+tmp.print "vt100\n";
+tmp.print "Amiga\n";
+tmp.print "paper\n";
+tmp.close
+
+# test break
+
+tmp = open("while_tmp", "r")
+
+while tmp.gets()
+ break if /vt100/
+end
+
+if !tmp.eof && /vt100/ then
+ ok
+else
+ notok
+end
+tmp.close
+
+# test continue
+$bad = FALSE
+tmp = open("while_tmp", "r")
+while tmp.gets()
+ continue if /vt100/;
+ $bad = 1 if /vt100/;
+end
+if !tmp.eof || /vt100/ || $bad
+ notok
+else
+ ok
+end
+tmp.close
+
+# test redo
+$bad = FALSE
+tmp = open("while_tmp", "r")
+while tmp.gets()
+ if gsub!('vt100', 'VT100')
+ gsub!('VT100', 'Vt100')
+ redo;
+ end
+ $bad = 1 if /vt100/;
+ $bad = 1 if /VT100/;
+end
+if !tmp.eof || $bad
+ notok
+else
+ ok
+end
+tmp.close
+
+# test interval
+$bad = FALSE
+tmp = open("while_tmp", "r")
+while tmp.gets()
+ break if not 1..2
+ if /vt100/ || /Amiga/ || /paper/
+ $bad = TRUE
+ notok
+ break
+ end
+end
+ok if not $bad
+tmp.close
+
+File.unlink "while_tmp" or `/bin/rm -f "while_tmp"`
+
+# exception handling
+check "exception";
+
+begin
+ fail "this must be handled"
+ notok
+rescue
+ ok
+end
+
+$bad = TRUE
+begin
+ fail "this must be handled no.2"
+rescue
+ if $bad
+ $bad = FALSE
+ retry
+ notok
+ end
+end
+ok
+
+$bad = TRUE
+$string = "this must be handled no.3"
+begin
+ fail $string
+rescue
+ensure
+ $bad = FALSE
+ ok
+end
+notok if $bad || $! != $string
+
+# exception in rescue clause
+begin
+ begin
+ fail "this must be handled no.4"
+ rescue
+ fail "exception in rescue clause"
+ end
+ notok
+rescue
+ ok
+end
+
+check "array"
+$x = [0, 1, 2, 3, 4, 5]
+if $x[2] == 2
+ ok
+else
+ notok
+end
+
+if $x[1..3] == [1, 2, 3]
+ ok
+else
+ notok
+end
+
+if $x[1,3] == [1, 2, 3]
+ ok
+else
+ notok
+end
+
+if [1, 2] + [3, 4] == [1, 2, 3, 4]
+ ok
+else
+ notok
+end
+
+$x[0, 2] = 10
+if $x[0] == 10 && $x[1] == 2
+ ok
+else
+ notok
+end
+
+$x[0, 0] = -1
+if $x[0] == -1 && $x[1] == 10
+ ok
+else
+ notok
+end
+
+$x[-1, 1] = 20
+if $x[-1] == 20 && $x.pop == 20
+ ok
+else
+ notok
+end
+
+$x = ["it", "came", "to", "pass", "that", "..."]
+$x = $x.sort.join(" ")
+if $x == "... came it pass that to"
+ ok
+else
+ notok
+end
+
+# split test
+if "1 byte string".split(//).reverse.join(":") == "g:n:i:r:t:s: :e:t:y:b: :1"
+ ok
+else
+ notok
+end
+
+$x = [1]
+if ($x * 5).join(":") == '1:1:1:1:1' then ok else notok end
+if ($x * 1).join(":") == '1' then ok else notok end
+if ($x * 0).join(":") == '' then ok else notok end
+
+check "hash"
+$x = {1=>2, 2=>4, 3=>6}
+$y = {1, 2, 2, 4, 3, 6}
+
+if $x[1] == 2
+ ok
+else
+ notok
+end
+
+begin
+ for k,v in $y
+ fail if k*2 != v
+ end
+ ok
+rescue
+ notok
+end
+
+if $x.length == 3
+ ok
+else
+ notok
+end
+
+if $x.has_key?(1)
+ ok
+else
+ notok
+end
+
+if $x.has_value?(4)
+ ok
+else
+ notok
+end
+
+if $x.indexes(2,3) == [4,6]
+ ok
+else
+ notok
+end
+
+$z = $y.keys.join(":")
+if $z == "1:2:3"
+ ok
+else
+ notok
+end
+
+$z = $y.values.join(":")
+if $z == "2:4:6"
+ ok
+else
+ notok
+end
+
+if $x == $y
+ ok
+else
+ notok
+end
+
+$y.shift
+if $y.length == 2
+ ok
+else
+ notok
+end
+
+check "iterator"
+
+if iterator? then notok else ok end
+
+def ttt
+ if iterator? then ok else notok end
+end
+ttt{}
+
+# yield at top level
+begin
+ yield
+ notok
+rescue
+ ok
+end
+
+$x = [1, 2, 3, 4]
+$y = []
+
+# iterator over array
+for i in $x
+ $y.push i
+end
+if $x == $y
+ ok
+else
+ notok
+end
+
+# nested iterator
+def tt
+ 1.upto(10) {|i|
+ yield i
+ }
+end
+
+tt{|i| break if i == 5}
+if i == 5
+ ok
+else
+ notok
+end
+
+# iterator break/redo/continue/retry
+done = TRUE
+loop{
+ break
+ done = FALSE
+ notok
+}
+ok if done
+
+done = TRUE
+$bad = FALSE
+loop {
+ break if not done
+ done = FALSE
+ continue
+ $bad = TRUE
+}
+if $bad
+ notok
+else
+ ok
+end
+
+done = TRUE
+$bad = FALSE
+loop {
+ break if not done
+ done = FALSE
+ redo
+ $bad = TRUE
+}
+if $bad
+ notok
+else
+ ok
+end
+
+$x = []
+for i in 1 .. 7
+ $x.push(i)
+end
+if $x.size == 7
+ ok
+else
+ notok
+end
+# $x == [1, 2, 3, 4, 5, 6, 7]
+$done = FALSE
+$x = []
+for i in 1 .. 7 # see how retry works in iterator loop
+ if i == 4 and not $done
+ $done = TRUE
+ retry
+ end
+ $x.push(i)
+end
+# $x == [1, 2, 3, 1, 2, 3, 4, 5, 6, 7]
+if $x.size == 10
+ ok
+else
+ notok
+end
+
+check "bignum"
+def fact(n)
+ return 1 if n == 0
+ return n*fact(n-1)
+end
+if fact(40) == 815915283247897734345611269596115894272000000000
+ ok
+else
+ notok
+end
+if fact(40) == 815915283247897734345611269596115894272000000001
+ notok
+else
+ ok
+end
+
+check "string & char"
+
+if "abcd" == "abcd"
+ ok
+else
+ notok
+end
+
+if "abcd" =~ "abcd"
+ ok
+else
+ notok
+end
+
+$foo = "abc"
+if "#$foo = abc" == "abc = abc"
+ ok
+else
+ notok
+end
+
+if "#{$foo} = abc" == "abc = abc"
+ ok
+else
+ notok
+end
+
+foo = "abc"
+if "#{foo} = abc" == "abc = abc"
+ ok
+else
+ notok
+end
+
+if '-' * 5 == '-----' then ok else notok end
+if '-' * 1 == '-' then ok else notok end
+if '-' * 0 == '' then ok else notok end
+
+foo = '-'
+if foo * 5 == '-----' then ok else notok end
+if foo * 1 == '-' then ok else notok end
+if foo * 0 == '' then ok else notok end
+
+# character constants(assumes ASCII)
+if "a"[0] == ?a
+ ok
+else
+ notok
+end
+
+if ?a == ?a
+ ok
+else
+ notok
+end
+
+if ?\C-a == 1
+ ok
+else
+ notok
+end
+
+if ?\M-a == 225
+ ok
+else
+ notok
+end
+
+if ?\M-\C-a == 129
+ ok
+else
+ notok
+end
+
+$x = "abcdef"
+$y = [ ?a, ?b, ?c, ?d, ?e, ?f ]
+$bad = FALSE
+$x.each_byte {|i|
+ if i != $y.shift
+ $bad = TRUE
+ break
+ end
+}
+if not $bad
+ ok
+else
+ notok
+end
+
+check "asignment"
+a = nil
+if a == nil
+ ok
+else
+ notok
+end
+
+a, b = 1, 2
+if a == 1 and b == 2 then
+ ok
+else
+ notok
+end
+
+a, *b = 1, 2, 3
+if a == 1 and b == [2, 3] then
+ ok
+else
+ notok
+end
+
+check "call"
+def aaa(a, b=100, *rest)
+ res = [a, b]
+ res += rest if rest
+ return res
+end
+
+begin
+ aaa()
+ notok
+rescue
+ ok
+end
+
+begin
+ aaa
+ notok
+rescue
+ ok
+end
+
+begin
+ if aaa(1) == [1, 100]
+ ok
+ else
+ fail
+ end
+rescue
+ notok
+end
+
+begin
+ if aaa(1, 2) == [1, 2]
+ ok
+ else
+ fail
+ end
+rescue
+ notok
+end
+
+begin
+ if aaa(1, 2, 3, 4) == [1, 2, 3, 4]
+ ok
+ else
+ fail
+ end
+rescue
+ notok
+end
+
+begin
+ if aaa(1, *[2, 3, 4]) == [1, 2, 3, 4]
+ ok
+ else
+ fail
+ end
+rescue
+ notok
+end
+
+check "proc"
+$proc = proc{|i| i}
+if $proc.call(2) == 2
+ ok
+else
+ notok
+end
+
+$proc = proc{|i| i*2}
+if $proc.call(2) == 4
+ ok
+else
+ notok
+end
+
+proc{
+ iii=5 # dynamic local variable
+ $proc = proc{ |i|
+ iii = i
+ }
+ $proc2 = proc {
+ $x = iii # dynamic variables shared by procs
+ }
+ if defined?(iii) # dynamic variables' scope
+ ok
+ else
+ notok
+ end
+}.call
+if defined?(iii) # out of scope
+ notok
+else
+ ok
+end
+$x=0
+$proc.call(5)
+$proc2.call
+if $x == 5
+ ok
+else
+ notok
+end
+
+check "signal"
+begin
+ kill "SIGINT", $$
+ sleep 1
+ notok
+rescue
+ ok
+end
+
+$x = 0
+trap "SIGINT", proc{|sig| $x = sig;fail}
+begin
+ kill "SIGINT", $$
+ sleep 1
+ notok
+rescue
+ if $x == 2
+ ok
+ else
+ notok
+ end
+end
+
+$x = FALSE
+trap "SIGINT", "$x = TRUE;fail"
+begin
+ kill "SIGINT", $$
+ sleep 1
+ notok
+rescue
+ if $x
+ ok
+ else
+ notok
+ end
+end
+
+check "eval"
+$bad=FALSE
+eval 'while FALSE; $bad = TRUE; print "foo\n" end
+if not $bad then ok else notok end'
+
+$foo = 'ok'
+begin
+ eval $foo
+rescue
+ notok
+end
+
+check "system"
+if `echo foobar` == "foobar\n"
+ ok
+else
+ notok
+end
+
+if `./ruby -e 'print "foobar"'` == 'foobar'
+ ok
+else
+ notok
+end
+
+tmp = open("script_tmp", "w")
+tmp.print "print $zzz\n";
+tmp.close
+
+if `./ruby -s script_tmp -zzz` == 't'
+ ok
+else
+ notok
+end
+
+if `./ruby -s script_tmp -zzz=555` == '555'
+ ok
+else
+ notok
+end
+
+tmp = open("script_tmp", "w")
+tmp.print "#! /usr/local/bin/ruby -s\n";
+tmp.print "print $zzz\n";
+tmp.close
+
+if `./ruby script_tmp -zzz=678` == '678'
+ ok
+else
+ notok
+end
+
+tmp = open("script_tmp", "w")
+tmp.print "this is a leading junk\n";
+tmp.print "#! /usr/local/bin/ruby -s\n";
+tmp.print "print $zzz\n";
+tmp.print "__END__\n";
+tmp.print "this is a trailing junk\n";
+tmp.close
+
+if `./ruby -x script_tmp` == 'nil'
+ ok
+else
+ notok
+end
+
+if `./ruby -x script_tmp -zzz=555` == '555'
+ ok
+else
+ notok
+end
+
+tmp = open("script_tmp", "w")
+for i in 1..5
+ tmp.print i, "\n"
+end
+tmp.close
+
+`./ruby -i.bak -pe 'sub(/^[0-9]+$/){$&.to_i * 5}' script_tmp`
+done = TRUE
+tmp = open("script_tmp", "r")
+while tmp.gets
+ if $_.to_i % 5 != 0
+ done = FALSE
+ notok
+ break
+ end
+end
+ok if done
+
+File.unlink "script_tmp" or `/bin/rm -f "script_tmp"`
+File.unlink "script_tmp.bak" or `/bin/rm -f "script_tmp.bak"`
+
+check "const"
+TEST1 = 1
+TEST2 = 2
+
+module Const
+ TEST3 = 3
+ TEST4 = 4
+end
+
+module Const2
+ TEST3 = 6
+ TEST4 = 8
+end
+
+include Const
+
+if [TEST1,TEST2,TEST3,TEST4] == [1,2,3,4]
+ ok
+else
+ notok
+end
+
+include Const2
+
+if [TEST1,TEST2,TEST3,TEST4] == [1,2,6,8]
+ ok
+else
+ notok
+end
+
+check "clone"
+foo = Object.new
+def foo.test
+ "test"
+end
+bar = foo.clone
+def bar.test2
+ "test2"
+end
+
+if bar.test2 == "test2"
+ ok
+else
+ notok
+end
+
+if bar.test == "test"
+ ok
+else
+ notok
+end
+
+if foo.test == "test"
+ ok
+else
+ notok
+end
+
+begin
+ foo.test2
+ notok
+rescue
+ ok
+end
+
+check "pack"
+
+$format = "c2x5CCxsdila6";
+# Need the expression in here to force ary[5] to be numeric. This avoids
+# test2 failing because ary2 goes str->numeric->str and ary doesn't.
+ary = [1,-100,127,128,32767,987.654321098 / 100.0,12345,123456,"abcdef"]
+$x = ary.pack($format)
+ary2 = $x.unpack($format)
+
+if ary.length == ary2.length then ok else notok end
+
+if ary.join(':') == ary2.join(':') then ok else notok end
+
+if $x =~ /def/ then ok else notok end
+
+check "math"
+if Math.sqrt(4) == 2
+ ok
+else
+ notok
+end
+
+include Math
+if sqrt(4) == 2
+ ok
+else
+ notok
+end
+
+check "struct"
+struct_test = Struct.new("Test", :foo, :bar)
+if struct_test == Struct::Test
+ ok
+else
+ notok
+end
+test = struct_test.new(1, 2)
+if test.foo == 1 && test.bar == 2
+ ok
+else
+ notok
+end
+if test[0] == 1 && test[1] == 2
+ ok
+else
+ notok
+end
+a, b = test
+if a == 1 && b == 2
+ ok
+else
+ notok
+end
+test[0] = 22
+if test.foo == 22
+ ok
+else
+ notok
+end
+test.bar = 47
+if test.bar == 47
+ ok
+else
+ notok
+end
+
+check "variable"
+if $$.is_instance_of? Fixnum
+ ok
+else
+ notok
+end
+
+begin
+ $$ = 5
+ notok
+rescue
+ ok
+end
+
+foobar = "foobar"
+$_ = foobar
+if $_ == foobar
+ ok
+else
+ notok
+end
+
+check "trace"
+$x = 1234
+$y = 0
+trace_var :$x, proc{$y = $x}
+$x = 40414
+if $y == $x
+ ok
+else
+ notok
+end
+
+untrace_var :$x
+$x = 19660208
+if $y != $x
+ ok
+else
+ notok
+end
+
+trace_var :$x, proc{$x *= 2}
+$x = 5
+if $x == 10
+ ok
+else
+ notok
+end
+untrace_var :$x
+
+check "defined?"
+if defined? $x
+ ok
+else
+ notok
+end
+
+foo=5
+if defined? foo
+ ok
+else
+ notok
+end
+
+if defined? Array
+ ok
+else
+ notok
+end
+
+if defined? Object.new
+ ok
+else
+ notok
+end
+
+if defined? 1 == 2
+ ok
+else
+ notok
+end
+
+if defined? fail
+ ok
+else
+ notok
+end
+
+def defined_test
+ return defined?(yield)
+end
+
+if defined_test
+ notok
+else
+ ok
+end
+
+if defined_test{}
+ ok
+else
+ notok
+end
+
+check "gc"
+begin
+ 1.upto(10000) {
+ tmp = [0,1,2,3,4,5,6,7,8,9]
+ }
+ tmp = nil
+ ok
+rescue
+ notok
+end
+
+print "end of test\n" if not $failed
diff --git a/sample/tkbiff.rb b/sample/tkbiff.rb
new file mode 100644
index 0000000000..9b406010cb
--- /dev/null
+++ b/sample/tkbiff.rb
@@ -0,0 +1,121 @@
+#! /usr/local/bin/ruby
+
+if $ARGV.length == 0
+ if ENV['MAIL']
+ $spool = ENV['MAIL']
+ else
+ $spool = '/usr/spool/mail/' + ENV['USER']
+ end
+else
+ $spool = $ARGV[0]
+end
+
+exit if fork
+
+require "parsedate"
+require "base64"
+
+include ParseDate
+
+class Mail
+ def Mail.new(f)
+ if !f.is_kind_of?(IO)
+ f = open(f, "r")
+ me = super
+ f.close
+ else
+ me = super
+ end
+ return me
+ end
+
+ def initialize(f)
+ @header = {}
+ @body = []
+ while f.gets()
+ $_.chop!
+ continue if /^From / # skip From-line
+ break if /^$/ # end of header
+ if /^(\S+):\s*(.*)/
+ @header[attr = $1.capitalize] = $2
+ elsif attr
+ sub(/^\s*/, '')
+ @header[attr] += "\n" + $_
+ end
+ end
+
+ return if ! $_
+
+ while f.gets()
+ break if /^From /
+ @body.push($_)
+ end
+ end
+
+ def header
+ return @header
+ end
+
+ def body
+ return @body
+ end
+
+end
+
+require "tkscrollbox"
+
+$top = TkRoot.new
+$top.withdraw
+$list = TkScrollbox.new($top) {
+ relief 'raised'
+ width 80
+ height 8
+ setgrid 'yes'
+ pack
+}
+TkButton.new($top) {
+ text 'Dismiss'
+ command proc {$top.withdraw}
+ pack('fill'=>'both','expand'=>'yes')
+}
+$top.bind "Control-c", proc{exit}
+$top.bind "Control-q", proc{exit}
+$top.bind "space", proc{exit}
+
+$spool_size = 0
+def check
+ size = File.size($spool)
+ if size and size != $spool_size
+ pop_up if size > 0
+ end
+ Tk.after 5000, proc{check}
+end
+
+def pop_up
+ outcount = 0;
+ $spool_size = File.size($spool)
+ $list.delete 0, 'end'
+ f = open($spool, "r")
+ while !f.eof
+ mail = Mail.new(f)
+ date, from, subj = mail.header['Date'], mail.header['From'], mail.header['Subject']
+ continue if !date
+ y = m = d = 0
+ y, m, d = parsedate(date) if date
+ from = "sombody@somewhere" if ! from
+ subj = "(nil)" if ! subj
+ from = decode_b(from)
+ subj = decode_b(subj)
+ $list.insert 'end', format('%-02d/%02d/%02d [%-28.28s] %s',y,m,d,from,subj)
+ outcount += 1
+ end
+ f.close
+ if outcount == 0
+ $list.insert 'end', "You have no mail."
+ end
+ $top.deiconify
+ Tk.after 2000, proc{$top.withdraw}
+end
+
+check
+Tk.mainloop
diff --git a/sample/tkbrowse.rb b/sample/tkbrowse.rb
new file mode 100644
index 0000000000..dbaa132d1f
--- /dev/null
+++ b/sample/tkbrowse.rb
@@ -0,0 +1,69 @@
+#!/usr/local/bin/ruby
+#
+# This script generates a directory browser, which lists the working
+# directory and allows you to open files or subdirectories by
+# double-clicking.
+
+# Create a scrollbar on the right side of the main window and a listbox
+# on the left side.
+
+require "tkscrollbox"
+
+list = TkScrollbox.new {
+ relief 'raised'
+ width 20
+ height 20
+ setgrid 'yes'
+ pack
+}
+
+# The procedure below is invoked to open a browser on a given file; if the
+# file is a directory then another instance of this program is invoked; if
+# the file is a regular file then the Mx editor is invoked to display
+# the file.
+
+def browse (dir, file)
+ if dir != "."
+ file="#{dir}/#{file}"
+ if File.isdirectory? file
+ system "browse #{file} &"
+ else
+ if File.isfile? file
+ if ENV['EDITOR']
+ system format("%s %s&", ENV['EDITOR'], file)
+ else
+ sysmte "xedit #{file}&"
+ end
+ else
+ STDERR.print "\"#{file}\" isn't a directory or regular file"
+ end
+ end
+ end
+end
+
+# Fill the listbox with a list of all the files in the directory (run
+# the "ls" command to get that information).
+
+if $ARGV.length>0
+ dir = $ARGV[0]
+else
+ dir="."
+end
+list.insert 'end', *`ls #{dir}`.split
+
+# Set up bindings for the browser.
+
+list.focus
+list.bind "Control-q", proc{exit}
+list.bind "Control-c", proc{exit}
+list.bind "Control-p", proc{
+ print "selection <", TkSelection.get, ">\n"
+}
+
+list.bind "Double-Button-1", proc{
+ for i in TkSelection.get.split
+ print "clicked ", i, "\n"
+ browse dir, i
+ end
+}
+Tk.mainloop
diff --git a/sample/tkdialog.rb b/sample/tkdialog.rb
new file mode 100644
index 0000000000..e83e16d0a8
--- /dev/null
+++ b/sample/tkdialog.rb
@@ -0,0 +1,62 @@
+#! /usr/local/bin/ruby
+require "tk"
+
+root = TkFrame.new
+top = TkFrame.new(root) {
+ relief 'raised'
+ border 1
+}
+msg = TkMessage.new(top) {
+ text "File main.c hasn't been saved to disk since \
+it was last modified. What should I do?"
+ justify 'center'
+ aspect 200
+ font '-Adobe-helvetica-medium-r-normal--*-240*'
+ pack('padx'=>5, 'pady'=>5, 'expand'=>'yes')
+}
+top.pack('fill'=>'both')
+root.pack
+
+bot = TkFrame.new(root) {
+ relief 'raised'
+ border 1
+}
+
+TkFrame.new(bot) { |left|
+ relief 'sunken'
+ border 1
+ pack('side'=>'left', 'expand'=>'yes', 'padx'=>10, 'pady'=> 10)
+ TkButton.new(left) {
+ text "Save File"
+ command "quit 'save'"
+ pack('expand'=>'yes','padx'=>6,'pady'=> 6)
+ top.bind "Enter", proc{state 'active'}
+ msg.bind "Enter", proc{state 'active'}
+ bot.bind "Enter", proc{state 'active'}
+ top.bind "Leave", proc{state 'normal'}
+ msg.bind "Leave", proc{state 'normal'}
+ bot.bind "Leave", proc{state 'normal'}
+ Tk.root.bind "ButtonRelease-1", proc{quit 'save'}
+ Tk.root.bind "Return", proc{quit 'save'}
+ }
+}
+TkButton.new(bot) {
+ text "Quit Anyway"
+ command "quit 'quit'"
+ pack('side'=>'left', 'expand'=>'yes', 'padx'=>10)
+}
+TkButton.new(bot) {
+ text "Return To Editor"
+ command "quit 'return'"
+ pack('side'=>'left', 'expand'=>'yes', 'padx'=>10)
+}
+bot.pack
+root.pack('side'=>'top', 'fill'=>'both', 'expand'=>'yes')
+
+def quit(button)
+ print "aaa\n"
+ print "You pressed the \"#{button}\" button; bye-bye!\n"
+ exit
+end
+
+Tk.mainloop
diff --git a/sample/tkfrom.rb b/sample/tkfrom.rb
new file mode 100644
index 0000000000..4a0d8c2b5d
--- /dev/null
+++ b/sample/tkfrom.rb
@@ -0,0 +1,115 @@
+#! /usr/local/bin/ruby
+
+require "parsedate"
+require "base64"
+
+include ParseDate
+
+class Mail
+ def Mail.new(f)
+ if !f.is_kind_of?(IO)
+ f = open(f, "r")
+ me = super
+ f.close
+ else
+ me = super
+ end
+ return me
+ end
+
+ def initialize(f)
+ @header = {}
+ @body = []
+ while f.gets()
+ $_.chop!
+ continue if /^From / # skip From-line
+ break if /^$/ # end of header
+ if /^(\S+):\s*(.*)/
+ @header[attr = $1.capitalize] = $2
+ elsif attr
+ sub(/^\s*/, '')
+ @header[attr] += "\n" + $_
+ end
+ end
+
+ return if ! $_
+
+ while f.gets()
+ break if /^From /
+ @body.push($_)
+ end
+ end
+
+ def header
+ return @header
+ end
+
+ def body
+ return @body
+ end
+
+end
+
+$ARGV[0] = '/usr/spool/mail/' + ENV['USER'] if $ARGV.length == 0
+
+require "tk"
+list = scroll = nil
+TkFrame.new{|f|
+ list = TkListbox.new(f) {
+ yscroll proc{|idx|
+ scroll.set *idx
+ }
+ relief 'raised'
+# geometry "80x5"
+ width 80
+ height 5
+ setgrid 'yes'
+ pack('side'=>'left','fill'=>'both','expand'=>'yes')
+ }
+ scroll = TkScrollbar.new(f) {
+ command proc{|idx|
+ list.yview *idx
+ }
+ pack('side'=>'right','fill'=>'y')
+ }
+ pack
+}
+root = Tk.root
+TkButton.new(root) {
+ text 'Dismiss'
+ command proc {exit}
+ pack('fill'=>'both','expand'=>'yes')
+}
+root.bind "Control-c", proc{exit}
+root.bind "Control-q", proc{exit}
+root.bind "space", proc{exit}
+
+$outcount = 0;
+for file in $ARGV
+ continue if !File.exists?(file)
+ f = open(file, "r")
+ while !f.eof
+ mail = Mail.new(f)
+ date, from, subj = mail.header['Date'], mail.header['From'], mail.header['Subject']
+ continue if !date
+ y = m = d = 0
+ y, m, d = parsedate(date) if date
+ from = "sombody@somewhere" if ! from
+ subj = "(nil)" if ! subj
+ from = decode_b(from)
+ subj = decode_b(subj)
+ list.insert 'end', format('%-02d/%02d/%02d [%-28.28s] %s',y,m,d,from,subj)
+ $outcount += 1
+ end
+ f.close
+end
+
+limit = 10000
+if $outcount == 0
+ list.insert 'end', "You have no mail."
+ limit = 2000
+end
+Tk.after limit, proc{
+ exit
+}
+Tk.mainloop
diff --git a/sample/tkhello.rb b/sample/tkhello.rb
new file mode 100644
index 0000000000..1ff1403e71
--- /dev/null
+++ b/sample/tkhello.rb
@@ -0,0 +1,13 @@
+require "tk"
+
+TkButton.new {
+ text 'hello'
+ command proc{print "hello\n"}
+ pack('fill'=>'x')
+}
+TkButton.new {
+ text 'quit'
+ command 'exit'
+ pack('fill'=>'x')
+}
+Tk.mainloop
diff --git a/sample/tkline.rb b/sample/tkline.rb
new file mode 100644
index 0000000000..843893b5d9
--- /dev/null
+++ b/sample/tkline.rb
@@ -0,0 +1,29 @@
+require "tkclass"
+
+$c = Canvas.new
+$c.pack
+$start_x = start_y = 0
+
+def do_press(x, y)
+ $start_x = x
+ $start_y = y
+ $current_line = Line.new($c, x, y, x, y, 'fill' => 'gray')
+end
+def do_motion(x, y)
+ if $current_line
+ $current_line.coords $start_x, $start_y, x, y
+ end
+end
+
+def do_release(x, y)
+ if $current_line
+ $current_line.coords $start_x, $start_y, x, y
+ $current_line.fill 'black'
+ $current_line = nil
+ end
+end
+
+$c.bind("1", proc{|e| do_press e.x,e.y})
+$c.bind("B1-Motion", proc{|e| do_motion e.x,e.y})
+$c.bind("ButtonRelease-1", proc{|e| do_release e.x,e.y})
+Tk.mainloop
diff --git a/sample/tktimer.rb b/sample/tktimer.rb
new file mode 100644
index 0000000000..b8b3617646
--- /dev/null
+++ b/sample/tktimer.rb
@@ -0,0 +1,49 @@
+#!/usr/local/bin/ruby
+# This script generates a counter with start and stop buttons.
+
+require "tk"
+$label = TkLabel.new {
+ text '0.00'
+ relief 'raised'
+ width 10
+ pack('side'=>'bottom', 'fill'=>'both')
+}
+
+TkButton.new {
+ text 'Start'
+ command proc {
+ if $stopped
+ $stopped = FALSE
+ tick
+ end
+ }
+ pack('side'=>'left','fill'=>'both','expand'=>'yes')
+}
+TkButton.new {
+ text 'Stop'
+ command proc{
+ $stopped = TRUE
+ }
+ pack('side'=>'right','fill'=>'both','expand'=>'yes')
+}
+
+$seconds=0
+$hundredths=0
+$stopped=TRUE
+
+def tick
+ if $stopped then return end
+ Tk.after 50, proc{tick}
+ $hundredths+=5
+ if $hundredths >= 100
+ $hundredths=0
+ $seconds+=1
+ end
+ $label.text format("%d.%02d", $seconds, $hundredths)
+end
+
+root = Tk.root
+root.bind "Control-c", proc{root.destroy}
+root.bind "Control-q", proc{root.destroy}
+Tk.root.focus
+Tk.mainloop
diff --git a/sample/trap.pl b/sample/trap.pl
deleted file mode 100644
index ce022d4062..0000000000
--- a/sample/trap.pl
+++ /dev/null
@@ -1,6 +0,0 @@
-$SIG{'INT'} = 'test';
-
-while (<>) {
- print;
-}
-sub test { print "C-c handled\n"; }
diff --git a/sample/trap.rb b/sample/trap.rb
deleted file mode 100644
index e552a0fddc..0000000000
--- a/sample/trap.rb
+++ /dev/null
@@ -1,3 +0,0 @@
-trap('print("C-c handled\n")', 'INT', 'HUP')
-print("---\n")
-while gets(); print($_) end
diff --git a/sample/tt.rb b/sample/tt.rb
deleted file mode 100644
index f4960feaea..0000000000
--- a/sample/tt.rb
+++ /dev/null
@@ -1,100 +0,0 @@
-module Print
- print("in Print\n")
- def println(*args)
- for a in args
- print(a)
- end
- print("\n")
- end
-
- def println2(*args)
- print(*args)
- print("\n")
- end
-end
-
-module Print2
- def println(*args)
- print("pr2: ");
- super
- end
-end
-
-module Print3
- include Print2
- def println(*args)
- print("pr3: ");
- super
- end
-end
-
-include Print, Print2, Print3
-
-println2("in TopLevel")
-
-print("a: ", $OPT_test, "\n")
-printf("%10.5g: %*s -> 0x%x\n", 123345, -10, Print, Print.id);
-
-println("a+ matches aaa at ", "bccAAaaa" =~ /a+/)
-ttt = "this is a "
-if offset = (ttt =~ /this ([^ ]*) (.*)/)
- println("0 = ", $&);
- println("1 = ", $1);
- println("2 = ", $2);
-end
-
-class Fib : Object
- print("in Fib:Object\n")
-
- def Fib.test(*args)
- println("in Fib.test")
-
- if args; println(*args) end
- args = args.grep(/^c/)
- super(*args)
- end
-
- def init
- println("in Fib.init");
- end
-
- def fib(n)
- a =0; b = 1
-
- while b <= n
- c = a; a = b; b = c+b
- end
- return b
- end
-end
-
-def Object.test(*args)
- println("in Object.test")
- if args; println(*args) end
-end
-
-Fib.test("abc", "def", "aaa", "ccc")
-println("1:", 0x3fffffffa)
-println("2:", 0x3ffffffa)
-#println("3:", 0x40000000+0x40000000)
-
-fib = Fib.new
-
-fib.init
-print(Fib, ":")
-
-#for i in 1 .. 100
-# fib.fib(90000)
-#end
-
-println(fib.fib(9000))
-
-def tt
- for i in 1..10
- println("i:", i);
- yield(i);
- end
-end
-
-test = tt() {|i|break if i == 2}
-println([1,2,3,4].join(":"))