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

T

transfire

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.
 
1

13

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

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.
 
N

nobu

Hi,

At Fri, 14 Jul 2006 22:39:19 +0900,
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));
}
 
T

transfire

13 said:
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=> []

T.
 
Y

Yukihiro Matsumoto

Hi,

In message "Re: File::FNM_CASEFOLD doesn't work for Dir.glob?"
on Sat, 15 Jul 2006 00:31:13 +0900, (e-mail address removed) 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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,208
Messages
2,571,084
Members
47,683
Latest member
AustinFairchild

Latest Threads

Top