ruby-changes:66277
From: Nobuyoshi <ko1@a...>
Date: Fri, 21 May 2021 09:01:20 +0900 (JST)
Subject: [ruby-changes:66277] a35d137a37 (master): [DOC] Moved `File.fnmatch?` to dir.rb
https://git.ruby-lang.org/ruby.git/commit/?id=a35d137a37 From a35d137a37a0c12cb5694e419284b9e0ab718467 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada <nobu@r...> Date: Thu, 20 May 2021 22:57:33 +0900 Subject: [DOC] Moved `File.fnmatch?` to dir.rb So that no longer disturbed by C comment delimiters. --- dir.c | 95 +--------------------------------------------------------------- dir.rb | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 94 deletions(-) diff --git a/dir.c b/dir.c index 812cb7c..8748391 100644 --- a/dir.c +++ b/dir.c @@ -3180,100 +3180,7 @@ fnmatch_brace(const char *pattern, VALUE val, void *enc) https://github.com/ruby/ruby/blob/trunk/dir.c#L3180 return (fnmatch(pattern, enc, RSTRING_PTR(path), arg->flags) == 0); } -/* - * call-seq: - * File.fnmatch( pattern, path, [flags] ) -> (true or false) - * File.fnmatch?( pattern, path, [flags] ) -> (true or false) - * - * Returns true if +path+ matches against +pattern+. The pattern is not a - * regular expression; instead it follows rules similar to shell filename - * globbing. It may contain the following metacharacters: - * - * <code>*</code>:: - * Matches any file. Can be restricted by other values in the glob. - * Equivalent to <code>/ .* /x</code> in regexp. - * - * <code>*</code>:: Matches all files regular files - * <code>c*</code>:: Matches all files beginning with <code>c</code> - * <code>*c</code>:: Matches all files ending with <code>c</code> - * <code>\*c*</code>:: Matches all files that have <code>c</code> in them - * (including at the beginning or end). - * - * To match hidden files (that start with a <code>.</code> set the - * File::FNM_DOTMATCH flag. - * - * <code>**</code>:: - * Matches directories recursively or files expansively. - * - * <code>?</code>:: - * Matches any one character. Equivalent to <code>/.{1}/</code> in regexp. - * - * <code>[set]</code>:: - * Matches any one character in +set+. Behaves exactly like character sets - * in Regexp, including set negation (<code>[^a-z]</code>). - * - * <code> \ </code>:: - * Escapes the next metacharacter. - * - * <code>{a,b}</code>:: - * Matches pattern a and pattern b if File::FNM_EXTGLOB flag is enabled. - * Behaves like a Regexp union (<code>(?:a|b)</code>). - * - * +flags+ is a bitwise OR of the <code>FNM_XXX</code> constants. The same - * glob pattern and flags are used by Dir::glob. - * - * Examples: - * - * File.fnmatch('cat', 'cat') #=> true # match entire string - * File.fnmatch('cat', 'category') #=> false # only match partial string - * - * File.fnmatch('c{at,ub}s', 'cats') #=> false # { } isn't supported by default - * File.fnmatch('c{at,ub}s', 'cats', File::FNM_EXTGLOB) #=> true # { } is supported on FNM_EXTGLOB - * - * File.fnmatch('c?t', 'cat') #=> true # '?' match only 1 character - * File.fnmatch('c??t', 'cat') #=> false # ditto - * File.fnmatch('c*', 'cats') #=> true # '*' match 0 or more characters - * File.fnmatch('c*t', 'c/a/b/t') #=> true # ditto - * File.fnmatch('ca[a-z]', 'cat') #=> true # inclusive bracket expression - * File.fnmatch('ca[^t]', 'cat') #=> false # exclusive bracket expression ('^' or '!') - * - * File.fnmatch('cat', 'CAT') #=> false # case sensitive - * File.fnmatch('cat', 'CAT', File::FNM_CASEFOLD) #=> true # case insensitive - * File.fnmatch('cat', 'CAT', File::FNM_SYSCASE) #=> true or false # depends on the system default - * - * File.fnmatch('?', '/', File::FNM_PATHNAME) #=> false # wildcard doesn't match '/' on FNM_PATHNAME - * File.fnmatch('*', '/', File::FNM_PATHNAME) #=> false # ditto - * File.fnmatch('[/]', '/', File::FNM_PATHNAME) #=> false # ditto - * - * File.fnmatch('\?', '?') #=> true # escaped wildcard becomes ordinary - * File.fnmatch('\a', 'a') #=> true # escaped ordinary remains ordinary - * File.fnmatch('\a', '\a', File::FNM_NOESCAPE) #=> true # FNM_NOESCAPE makes '\' ordinary - * File.fnmatch('[\?]', '?') #=> true # can escape inside bracket expression - * - * File.fnmatch('*', '.profile') #=> false # wildcard doesn't match leading - * File.fnmatch('*', '.profile', File::FNM_DOTMATCH) #=> true # period by default. - * File.fnmatch('.*', '.profile') #=> true - * - * rbfiles = '**' '/' '*.rb' # you don't have to do like this. just write in single string. - * File.fnmatch(rbfiles, 'main.rb') #=> false - * File.fnmatch(rbfiles, './main.rb') #=> false - * File.fnmatch(rbfiles, 'lib/song.rb') #=> true - * File.fnmatch('**.rb', 'main.rb') #=> true - * File.fnmatch('**.rb', './main.rb') #=> false - * File.fnmatch('**.rb', 'lib/song.rb') #=> true - * File.fnmatch('*', 'dave/.profile') #=> true - * - * pattern = '*' '/' '*' - * File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME) #=> false - * File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=> true - * - * pattern = '**' '/' 'foo' - * File.fnmatch(pattern, 'a/b/c/foo', File::FNM_PATHNAME) #=> true - * File.fnmatch(pattern, '/a/b/c/foo', File::FNM_PATHNAME) #=> true - * File.fnmatch(pattern, 'c:/a/b/c/foo', File::FNM_PATHNAME) #=> true - * File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME) #=> false - * File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=> true - */ +/* :nodoc: */ static VALUE file_s_fnmatch(int argc, VALUE *argv, VALUE obj) { diff --git a/dir.rb b/dir.rb index eb46305..ad52bec 100644 --- a/dir.rb +++ b/dir.rb @@ -134,3 +134,101 @@ class Dir https://github.com/ruby/ruby/blob/trunk/dir.rb#L134 Primitive.dir_s_glob(pattern, flags, base, sort) end end + +class << File + # call-seq: + # File.fnmatch( pattern, path, [flags] ) -> (true or false) + # File.fnmatch?( pattern, path, [flags] ) -> (true or false) + # + # Returns true if +path+ matches against +pattern+. The pattern is not a + # regular expression; instead it follows rules similar to shell filename + # globbing. It may contain the following metacharacters: + # + # <code>*</code>:: + # Matches any file. Can be restricted by other values in the glob. + # Equivalent to <code>/ .* /x</code> in regexp. + # + # <code>*</code>:: Matches all files regular files + # <code>c*</code>:: Matches all files beginning with <code>c</code> + # <code>*c</code>:: Matches all files ending with <code>c</code> + # <code>\*c*</code>:: Matches all files that have <code>c</code> in them + # (including at the beginning or end). + # + # To match hidden files (that start with a <code>.</code> set the + # File::FNM_DOTMATCH flag. + # + # <code>**</code>:: + # Matches directories recursively or files expansively. + # + # <code>?</code>:: + # Matches any one character. Equivalent to <code>/.{1}/</code> in regexp. + # + # <code>[set]</code>:: + # Matches any one character in +set+. Behaves exactly like character sets + # in Regexp, including set negation (<code>[^a-z]</code>). + # + # <code> \ </code>:: + # Escapes the next metacharacter. + # + # <code>{a,b}</code>:: + # Matches pattern a and pattern b if File::FNM_EXTGLOB flag is enabled. + # Behaves like a Regexp union (<code>(?:a|b)</code>). + # + # +flags+ is a bitwise OR of the <code>FNM_XXX</code> constants. The same + # glob pattern and flags are used by Dir::glob. + # + # Examples: + # + # File.fnmatch('cat', 'cat') #=> true # match entire string + # File.fnmatch('cat', 'category') #=> false # only match partial string + # + # File.fnmatch('c{at,ub}s', 'cats') #=> false # { } isn't supported by default + # File.fnmatch('c{at,ub}s', 'cats', File::FNM_EXTGLOB) #=> true # { } is supported on FNM_EXTGLOB + # + # File.fnmatch('c?t', 'cat') #=> true # '?' match only 1 character + # File.fnmatch('c??t', 'cat') #=> false # ditto + # File.fnmatch('c*', 'cats') #=> true # '*' match 0 or more characters + # File.fnmatch('c*t', 'c/a/b/t') #=> true # ditto + # File.fnmatch('ca[a-z]', 'cat') #=> true # inclusive bracket expression + # File.fnmatch('ca[^t]', 'cat') #=> false # exclusive bracket expression ('^' or '!') + # + # File.fnmatch('cat', 'CAT') #=> false # case sensitive + # File.fnmatch('cat', 'CAT', File::FNM_CASEFOLD) #=> true # case insensitive + # File.fnmatch('cat', 'CAT', File::FNM_SYSCASE) #=> true or false # depends on the system default + # + # File.fnmatch('?', '/', File::FNM_PATHNAME) #=> false # wildcard doesn't match '/' on FNM_PATHNAME + # File.fnmatch('*', '/', File::FNM_PATHNAME) #=> false # ditto + # File.fnmatch('[/]', '/', File::FNM_PATHNAME) #=> false # ditto + # + # File.fnmatch('\?', '?') #=> true # escaped wildcard becomes ordinary + # File.fnmatch('\a', 'a') #=> true # escaped ordinary remains ordinary + # File.fnmatch('\a', '\a', File::FNM_NOESCAPE) #=> true # FNM_NOESCAPE makes '\' ordinary + # File.fnmatch('[\?]', '?') #=> true # can escape inside bracket expression + # + # File.fnmatch('*', '.profile') #=> false # wildcard doesn't match leading + # File.fnmatch('*', '.profile', File::FNM_DOTMATCH) #=> true # period by default. + # File.fnmatch('.*', '.profile') (... truncated) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/