diff options
author | Yukihiro Matsumoto <matz@ruby-lang.org> | 1995-03-15 14:59:18 +0900 |
---|---|---|
committer | Takashi Kokubun <takashikkbn@gmail.com> | 2019-08-17 22:09:31 +0900 |
commit | d349889e770a2078c247d9d28070e86a54b856f4 (patch) | |
tree | 8bdbf87f3ff78ef237c4ff8efa061fbb8dc5a226 /dir.c | |
parent | 881c5a9c320c637ee0f6526b40cf70c1379ab656 (diff) |
version 0.69v0_69
https://cache.ruby-lang.org/pub/ruby/1.0/ruby-0.69.tar.gz
Wed Mar 15 14:59:18 1995 Yukihiro Matsumoto (matz@ix-02)
* version 0.69
* eval.c(method_missing): unknownから名称変更.
* eval.c(single_method_added): 特異メソッドが定義された時に呼ばれ
るメソッド.hookとして使える.実際に定義される直前に呼ばれる.
Tue Mar 14 14:46:44 1995 Yukihiro Matsumoto (matz@ix-02)
* ruby.c(proc_options): 引数の解析を自分でやることにより引数指定の
方法がperlに近付いた.getopt_longはもう使わない.
* dir.c(glob): `{}'のネストを許すようにした.
Mon Mar 13 17:56:25 1995 Yukihiro Matsumoto (matz@ix-02)
* glob.c: Glob(ワイルドカードオブジェクト)はなくなった.ワイルドカー
ドの展開はDir.glob(文字列)を使う.ワイルドカードのマッチは正規表
現で代用.
Fri Mar 10 18:35:46 1995 Yukihiro Matsumoto (matz@ix-02)
* eval.c: Mathのようなモジュールは自分自身でextendする.
* eval.c: クラスやモジュールを定義した既に同名のものがあれば追加定
義となるように.ただし.superクラスの違いなどはチェックする.
* regex.c: debug.
* math.c: 定数PIとEを定義.
Thu Mar 9 21:35:12 1995 Yukihiro Matsumoto (matz@ix-02)
* regex.c: EUC,SJISモードでは0x80以上の8進,16進リテラルを禁止.
* regex.c: クラス内でも数値リテラル・文字クラスが使えるようした.
Wed Mar 8 17:39:05 1995 Yukihiro Matsumoto (matz@ix-02)
* regex.c: \200など括弧の数以上の表現は8進リテラルと解釈する.ただ
し,\1から\9までは例外.
* regex.c: \9以上のリファレンスも有効にした.
Tue Mar 7 14:26:01 1995 Yukihiro Matsumoto (matz@ix-02)
* eval.c(public/private): スコープ制御メソッドの名称変更.静的なア
クセスも出来るようにしてみたが,不採用.
Mon Mar 6 19:34:32 1995 Yukihiro Matsumoto (matz@ix-02)
* eval.c(inlcude): メソッド化.動的にモジュールをインクルードでき
るように.さらに任意のオブジェクトにもモジュールをインクルードで
きるメソッド `extend'も用意した.
* parse.y: 文法からincludeを削除.メソッド化.
Tue Feb 28 15:35:10 1995 Yukihiro Matsumoto (matz@ix-02)
* parse.y: 配列,連想配列の最後に`,'をおけるように.
Diffstat (limited to 'dir.c')
-rw-r--r-- | dir.c | 105 |
1 files changed, 105 insertions, 0 deletions
@@ -237,6 +237,108 @@ Sdir_rmdir(obj, dir) return TRUE; } +#define isdelim(c) ((c)==' '||(c)=='\t'||(c)=='\n'||(c)=='\0') + +char **glob_filename(); + +static void +push_globs(ary, s) + VALUE ary; + char *s; +{ + char **fnames, **ff; + + fnames = glob_filename(s); + if (fnames == (char**)-1) rb_sys_fail(s); + ff = fnames; + while (*ff) { + ary_push(ary, str_new2(*ff)); + free(*ff); + ff++; + } + free(fnames); +} + +static int +push_braces(ary, s) + VALUE ary; + char *s; +{ + char buf[MAXPATHLEN]; + char *p, *t, *b; + char *lbrace, *rbrace; + + p = s; + lbrace = rbrace = Qnil; + while (*p) { + if (*p == '{' && !lbrace) lbrace = p; + if (*p == '}' && lbrace) rbrace = p; + *p++; + } + + if (lbrace) { + memcpy(buf, s, lbrace-s); + b = buf + (lbrace-s); + p = lbrace; + while (*p != '}') { + t = p + 1; + for (p = t; *p!='}' && *p!=','; p++) { + /* skip inner braces */ + if (*p == '{') while (*p!='}') p++; + } + memcpy(b, t, p-t); + strcpy(b+(p-t), rbrace+1); + push_braces(ary, buf); + } + } + else { + push_globs(ary, s); + } +} + +static VALUE +Sdir_glob(dir, str) + VALUE dir; + struct RString *str; +{ + char *p, *pend; + char buf[MAXPATHLEN]; + char *t, *t0; + int nest; + VALUE ary; + + Check_Type(str, T_STRING); + + ary = ary_new(); + + p = str->ptr; + pend = p + str->len; + + while (p < pend) { + t = buf; + while (p < pend && isdelim(*p)) p++; + while (p < pend && !isdelim(*p)) { + *t++ = *p++; + } + *t = '\0'; + t0 = buf; + nest = 0; + while (t0 < t) { + if (*t0 == '{') nest+=2; + if (*t0 == '}') nest+=3; + t0++; + } + if (nest == 0) { + push_globs(ary, buf); + } + else if (nest % 5 == 0) { + push_braces(ary, buf); + } + /* else unmatched braces */ + } + return ary; +} + Init_Dir() { extern VALUE M_Enumerable; @@ -261,4 +363,7 @@ Init_Dir() rb_define_single_method(C_Dir,"rmdir", Sdir_rmdir, 1); rb_define_single_method(C_Dir,"delete", Sdir_rmdir, 1); rb_define_single_method(C_Dir,"unlink", Sdir_rmdir, 1); + + rb_define_single_method(C_Dir,"glob", Sdir_glob, 1); + rb_define_single_method(C_Dir,"[]", Sdir_glob, 1); } |