File::FNM_CASEFOLD doesn't work for Dir.glob?

It's no fun to have to do:

  Dir.glob('[fF][oO][oO][dD][iI][rR]/*')

That makes two oddiites between File.fnmatch? and Dir.glob. The other
is that. File.fnmatch? doesn't support **. Wouldn't it be better if
these two functions drew upon the same source code?

T.

Hi,

It work's fine for me:

martins@thno:~/tmp$ touch file.txt
martins@thno:~/tmp$ touch file.Txt
martins@thno:~/tmp$ irb --simple-prompt

Dir.glob('*.txt', File::FNM_CASEFOLD)

=> ["file.txt", "file.Txt"]

quit

martins@thno:~/tmp$ ruby -v
ruby 1.8.4 (2005-12-24) [i486-linux]

···

--
Martins

On 7/14/06, transfire@gmail.com <transfire@gmail.com> wrote:

It's no fun to have to do:

  Dir.glob('[fF][oO][oO][dD][iI][rR]/*')

That makes two oddiites between File.fnmatch? and Dir.glob. The other
is that. File.fnmatch? doesn't support **. Wouldn't it be better if
these two functions drew upon the same source code?

T.

Hi,

At Fri, 14 Jul 2006 22:39:19 +0900,
transfire@gmail.com wrote in [ruby-talk:201917]:

It's no fun to have to do:

  Dir.glob('[fF][oO][oO][dD][iI][rR]/*')

Seems nice to be backported from the trunk.

That makes two oddiites between File.fnmatch? and Dir.glob. The other
is that. File.fnmatch? doesn't support **. Wouldn't it be better if
these two functions drew upon the same source code?

File::FNM_PATHNAME

Index: dir.c

···

===================================================================
RCS file: /cvs/ruby/src/ruby/dir.c,v
retrieving revision 1.92.2.34
diff -p -u -2 -I '$Date' -r1.92.2.34 dir.c
--- dir.c 17 May 2006 09:14:34 -0000 1.92.2.34
+++ dir.c 14 Jul 2006 14:32:43 -0000
@@ -68,8 +68,21 @@ char *strchr _((char*,char));
#endif

+#ifndef CASEFOLD_FILESYSTEM
+# if defined DOSISH || defined __VMS
+# define CASEFOLD_FILESYSTEM 1
+# else
+# define CASEFOLD_FILESYSTEM 0
+# endif
+#endif
+
#define FNM_NOESCAPE 0x01
#define FNM_PATHNAME 0x02
#define FNM_DOTMATCH 0x04
#define FNM_CASEFOLD 0x08
+#if CASEFOLD_FILESYSTEM
+#define FNM_SYSCASE FNM_CASEFOLD
+#else
+#define FNM_SYSCASE 0
+#endif

#define FNM_NOMATCH 1
@@ -807,5 +820,5 @@ sys_warning_1(mesg)
}

-#define GLOB_VERBOSE (1 << (sizeof(int) * CHAR_BIT - 1))
+#define GLOB_VERBOSE (1U << (sizeof(int) * CHAR_BIT - 1))
#define sys_warning(val) \
     ((flags & GLOB_VERBOSE) && rb_protect((VALUE (*)_((VALUE)))sys_warning_1, (VALUE)(val), 0))
@@ -820,5 +833,6 @@ has_magic(s, send, flags)
     register char c;
     int open = 0;
- int escape = !(flags & FNM_NOESCAPE);
+ const int escape = !(flags & FNM_NOESCAPE);
+ const int nocase = flags & FNM_CASEFOLD;

     while ((c = *p++) != '\0') {
@@ -839,4 +853,9 @@ has_magic(s, send, flags)
       if (escape && *p++ == '\0')
     return Qfalse;
+ break;
+
+ default:
+ if (!FNM_SYSCASE && ISALPHA(c) && nocase)
+ return Qtrue;
   }

@@ -1104,4 +1123,5 @@ ruby_glob(path, flags, func, arg)
     VALUE arg;
{
+ flags |= FNM_SYSCASE;
     return glob_helper(path, 0, flags & ~GLOB_VERBOSE, func, arg);
}
@@ -1144,4 +1164,5 @@ rb_glob2(path, flags, func, arg)
     args.v = arg;

+ flags |= FNM_SYSCASE;
     return glob_helper(path, 0, flags | GLOB_VERBOSE, rb_glob_caller, (VALUE)&args);
}
@@ -1583,3 +1604,4 @@ Init_Dir()
     rb_file_const("FNM_DOTMATCH", INT2FIX(FNM_DOTMATCH));
     rb_file_const("FNM_CASEFOLD", INT2FIX(FNM_CASEFOLD));
+ rb_file_const("FNM_SYSCASE", INT2FIX(FNM_SYSCASE));
}

--
Nobu Nakada

13 wrote:

Hi,

It work's fine for me:

martins@thno:~/tmp$ touch file.txt
martins@thno:~/tmp$ touch file.Txt
martins@thno:~/tmp$ irb --simple-prompt
>> Dir.glob('*.txt', File::FNM_CASEFOLD)
=> ["file.txt", "file.Txt"]
>> quit
martins@thno:~/tmp$ ruby -v
ruby 1.8.4 (2005-12-24) [i486-linux]

Oddness...

$ touch file.txt
$ touch file.Txt
$ irb --simple-prompt

Dir.glob('*.txt',File::FNM_CASEFOLD)

=> ["file.txt", "file.Txt"]

exit

$ touch README
$ irb --simple-prompt

Dir.glob('readme',File::FNM_CASEFOLD)

=>

T.

Hi,

···

In message "Re: File::FNM_CASEFOLD doesn't work for Dir.glob?" on Sat, 15 Jul 2006 00:31:13 +0900, nobu@ruby-lang.org writes:

It's no fun to have to do:

  Dir.glob('[fF][oO][oO][dD][iI][rR]/*')

Seems nice to be backported from the trunk.

Yes, please.

              matz.