summaryrefslogtreecommitdiff
path: root/dir.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <matz@ruby-lang.org>1995-03-15 14:59:18 +0900
committerTakashi Kokubun <takashikkbn@gmail.com>2019-08-17 22:09:31 +0900
commitd349889e770a2078c247d9d28070e86a54b856f4 (patch)
tree8bdbf87f3ff78ef237c4ff8efa061fbb8dc5a226 /dir.c
parent881c5a9c320c637ee0f6526b40cf70c1379ab656 (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.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/dir.c b/dir.c
index f20e555a2f..f50c760e2f 100644
--- a/dir.c
+++ b/dir.c
@@ -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);
}