Mercurial > octave
annotate liboctave/util/oct-glob.cc @ 28898:caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
* oct-glob.cc (find_files): New function. Recursively find wildcards in
directory components and file name.
(windows_glob): Separate first directory component (or file name) and call
new function.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Mon, 12 Oct 2020 17:14:08 +0200 |
parents | 4e64416772f1 |
children | f39e75f35e48 |
rev | line source |
---|---|
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
1 //////////////////////////////////////////////////////////////////////// |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
2 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
3 // Copyright (C) 2010-2020 The Octave Project Developers |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
4 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
5 // See the file COPYRIGHT.md in the top-level directory of this |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
6 // distribution or <https://octave.org/copyright/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
7 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
8 // This file is part of Octave. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
9 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
10 // Octave is free software: you can redistribute it and/or modify it |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
11 // under the terms of the GNU General Public License as published by |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
12 // the Free Software Foundation, either version 3 of the License, or |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
13 // (at your option) any later version. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
14 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
15 // Octave is distributed in the hope that it will be useful, but |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
16 // WITHOUT ANY WARRANTY; without even the implied warranty of |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
18 // GNU General Public License for more details. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
19 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
20 // You should have received a copy of the GNU General Public License |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
21 // along with Octave; see the file COPYING. If not, see |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
22 // <https://www.gnu.org/licenses/>. |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
23 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
24 //////////////////////////////////////////////////////////////////////// |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
25 |
21724
aba2e6293dd8
use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents:
21301
diff
changeset
|
26 #if defined (HAVE_CONFIG_H) |
21301
40de9f8f23a6
Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents:
21202
diff
changeset
|
27 # include "config.h" |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
28 #endif |
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
29 |
10345
33b012d39dce
Convert between back and forward slashes before and after calling glob.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10314
diff
changeset
|
30 #include <algorithm> |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
31 #include <string> |
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
32 |
21929
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
33 #include "glob-wrappers.h" |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
34 |
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
35 #include "oct-glob.h" |
28898
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
36 #include "file-ops.h" |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
37 #include "file-stat.h" |
21929
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
38 #include "unwind-prot.h" |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
39 |
28869
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
40 #if defined (OCTAVE_USE_WINDOWS_API) |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
41 # include <windows.h> |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
42 # include <wchar.h> |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
43 |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
44 # include "lo-sysdep.h" |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
45 #endif |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
46 |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
47 // These functions are defined here and not in glob_match.cc so that we |
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
48 // can include the glob.h file from gnulib, which defines glob to |
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
49 // be rpl_glob. If we include glob.h in glob_match.cc, then it |
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
50 // transforms the glob_match::glob function to be glob_match::rpl_glob, |
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
51 // which is not what we want... |
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
52 |
21734
11af9c03400c
write namespace keyword and name on same line in C++ files
John W. Eaton <jwe@octave.org>
parents:
21726
diff
changeset
|
53 namespace octave |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
54 { |
27101
097774bed4ed
move some static functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
55 static bool |
097774bed4ed
move some static functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
56 single_match_exists (const std::string& file) |
097774bed4ed
move some static functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
57 { |
27102
84ff9953faa1
where possible, eliminate octave:: namespace qualifier inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
27101
diff
changeset
|
58 sys::file_stat s (file); |
27101
097774bed4ed
move some static functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
59 |
097774bed4ed
move some static functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
60 return s.exists (); |
097774bed4ed
move some static functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
61 } |
097774bed4ed
move some static functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
62 |
21734
11af9c03400c
write namespace keyword and name on same line in C++ files
John W. Eaton <jwe@octave.org>
parents:
21726
diff
changeset
|
63 namespace sys |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
64 { |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
65 bool |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
66 fnmatch (const string_vector& pat, const std::string& str, int fnm_flags) |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
67 { |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
68 int npat = pat.numel (); |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
69 |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
70 const char *cstr = str.c_str (); |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
71 |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
72 for (int i = 0; i < npat; i++) |
21929
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
73 if (octave_fnmatch_wrapper (pat(i).c_str (), cstr, fnm_flags) |
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
74 != octave_fnm_nomatch_wrapper ()) |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
75 return true; |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
76 |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
77 return false; |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
78 } |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
79 |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
80 string_vector |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
81 glob (const string_vector& pat) |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
82 { |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
83 string_vector retval; |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
84 |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
85 int npat = pat.numel (); |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
86 |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
87 int k = 0; |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
88 |
21929
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
89 void *glob_info = octave_create_glob_info_struct (); |
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
90 |
28857
43ad651cf5a0
eliminate unnecessary uses of octave:: namespace qualifier
John W. Eaton <jwe@octave.org>
parents:
28851
diff
changeset
|
91 unwind_action cleanup_glob_info_struct |
28851
1ac5a76ae91d
use [=] capture default specification where possible
John W. Eaton <jwe@octave.org>
parents:
28850
diff
changeset
|
92 ([=] () { octave_destroy_glob_info_struct (glob_info); }); |
21929
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
93 |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
94 for (int i = 0; i < npat; i++) |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
95 { |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
96 std::string xpat = pat(i); |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
97 |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
98 if (! xpat.empty ()) |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
99 { |
22197
e43d83253e28
refill multi-line macro definitions
John W. Eaton <jwe@octave.org>
parents:
22155
diff
changeset
|
100 #if (defined (OCTAVE_HAVE_WINDOWS_FILESYSTEM) \ |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
101 && ! defined (OCTAVE_HAVE_POSIX_FILESYSTEM)) |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
102 std::replace_if (xpat.begin (), xpat.end (), |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
103 std::bind2nd (std::equal_to<char> (), '\\'), |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
104 '/'); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
105 #endif |
10345
33b012d39dce
Convert between back and forward slashes before and after calling glob.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10314
diff
changeset
|
106 |
21929
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
107 int err = octave_glob_wrapper (xpat.c_str (), |
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
108 octave_glob_nosort_wrapper (), |
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
109 glob_info); |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
110 |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
111 if (! err) |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
112 { |
21929
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
113 int n = octave_glob_num_matches (glob_info); |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
114 |
21929
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
115 const char * const *matches |
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
116 = octave_glob_match_list (glob_info); |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
117 |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
118 // FIXME: we shouldn't have to check to see if |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
119 // a single match exists, but it seems that glob() won't |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
120 // check for us unless the pattern contains globbing |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
121 // characters. Hmm. |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
122 |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
123 if (n > 1 |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
124 || (n == 1 |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
125 && single_match_exists (std::string (matches[0])))) |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
126 { |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
127 retval.resize (k+n); |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
128 |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
129 for (int j = 0; j < n; j++) |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
130 { |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
131 std::string tmp = matches[j]; |
10345
33b012d39dce
Convert between back and forward slashes before and after calling glob.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10314
diff
changeset
|
132 |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
133 #if defined (OCTAVE_HAVE_WINDOWS_FILESYSTEM) \ |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
134 && ! defined (OCTAVE_HAVE_POSIX_FILESYSTEM) |
21761 | 135 std::replace_if (tmp.begin (), tmp.end (), |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
136 std::bind2nd (std::equal_to<char> (), |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
137 '/'), |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
138 '\\'); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
139 #endif |
10345
33b012d39dce
Convert between back and forward slashes before and after calling glob.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
10314
diff
changeset
|
140 |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
141 retval[k++] = tmp; |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
142 } |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
143 } |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
144 |
21929
7ab7cd327257
hide fnmatch.h and glob.h headers
John W. Eaton <jwe@octave.org>
parents:
21761
diff
changeset
|
145 octave_globfree_wrapper (glob_info); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10138
diff
changeset
|
146 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10138
diff
changeset
|
147 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10138
diff
changeset
|
148 } |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
149 |
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
150 return retval.sort (); |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
151 } |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
152 |
28898
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
153 #if defined (OCTAVE_USE_WINDOWS_API) |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
154 |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
155 static void |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
156 find_files (std::list<std::string>& dirlist, const std::string& dir, |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
157 const std::string& pat, const std::string& file) |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
158 { |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
159 // find first file in directory that matches pattern in PAT |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
160 std::wstring wpat = u8_to_wstring (sys::file_ops::concat (dir, pat)); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
161 _WIN32_FIND_DATAW ffd; |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
162 HANDLE h_find = FindFirstFileW (wpat.c_str (), &ffd); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
163 // ignore any error |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
164 if (h_find == INVALID_HANDLE_VALUE) |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
165 return; |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
166 |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
167 unwind_action close_h_find ([=] () { FindClose (h_find); }); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
168 |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
169 // find all files that match pattern |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
170 do |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
171 { |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
172 std::string found_dir = u8_from_wstring (ffd.cFileName); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
173 |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
174 if (file.empty ()) |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
175 dirlist.push_back (sys::file_ops::concat (dir, found_dir)); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
176 else |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
177 { |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
178 // get next component of path (or file name) |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
179 size_t sep_pos = file.find_first_of (sys::file_ops::dir_sep_chars ()); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
180 std::string pat_str = file.substr (0, sep_pos); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
181 std::string file_str = (sep_pos != std::string::npos |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
182 && file.length () > sep_pos+1) |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
183 ? file.substr (sep_pos+1) : ""; |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
184 |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
185 // call this function recursively with next path component in PAT |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
186 find_files (dirlist, sys::file_ops::concat (dir, found_dir), |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
187 pat_str, file_str); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
188 } |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
189 } |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
190 while (FindNextFileW (h_find, &ffd) != 0); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
191 } |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
192 |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
193 #endif |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
194 |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
195 // Glob like Windows "dir". Treat only * and ? as wildcards, |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
196 // and "*.*" matches filenames even if they do not contain ".". |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
197 string_vector |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
198 windows_glob (const string_vector& pat) |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
199 { |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
200 string_vector retval; |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
201 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
202 int npat = pat.numel (); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
203 |
28869
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
204 #if defined (OCTAVE_USE_WINDOWS_API) |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
205 |
28898
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
206 std::list<std::string> dirlist; |
28869
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
207 |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
208 for (int i = 0; i < npat; i++) |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
209 { |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
210 std::string xpat = pat(i); |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
211 if (xpat.empty ()) |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
212 continue; |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
213 |
28898
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
214 // separate component until first dir separator |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
215 size_t sep_pos |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
216 = xpat.find_first_of (sys::file_ops::dir_sep_chars ()); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
217 std::string file = (sep_pos != std::string::npos |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
218 && xpat.length () > sep_pos+1) |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
219 ? xpat.substr (sep_pos+1) : ""; |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
220 xpat = xpat.substr (0, sep_pos); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
221 |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
222 std::string dir = ""; |
28869
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
223 |
28898
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
224 if (sep_pos == 2 && xpat[1] == ':') |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
225 { |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
226 // include disc root |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
227 sep_pos = file.find_first_of (sys::file_ops::dir_sep_chars ()); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
228 dir = xpat; |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
229 xpat = file.substr (0, sep_pos); |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
230 file = (sep_pos != std::string::npos |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
231 && file.length () > sep_pos+1) |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
232 ? file.substr (sep_pos+1) : ""; |
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
233 } |
28869
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
234 |
28898
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
235 find_files (dirlist, dir, xpat, file); |
28869
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
236 } |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
237 |
28898
caf577e7ef43
__wglob__: Fix for argument containing directory (bug #59252).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28869
diff
changeset
|
238 retval = string_vector (dirlist); |
28869
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
239 |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
240 #else |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
241 |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
242 int k = 0; |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
243 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
244 void *glob_info = octave_create_glob_info_struct (); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
245 |
28857
43ad651cf5a0
eliminate unnecessary uses of octave:: namespace qualifier
John W. Eaton <jwe@octave.org>
parents:
28851
diff
changeset
|
246 unwind_action cleanup_glob_info_struct |
28851
1ac5a76ae91d
use [=] capture default specification where possible
John W. Eaton <jwe@octave.org>
parents:
28850
diff
changeset
|
247 ([=] () { octave_destroy_glob_info_struct (glob_info); }); |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
248 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
249 for (int i = 0; i < npat; i++) |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
250 { |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
251 std::string xpat = pat(i); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
252 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
253 if (! xpat.empty ()) |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
254 { |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
255 std::string escaped; |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
256 escaped.reserve (xpat.length ()); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
257 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
258 for (size_t j = 0; j < xpat.length (); j++) |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
259 { |
28869
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
260 # if (defined (OCTAVE_HAVE_WINDOWS_FILESYSTEM) \ |
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
261 && ! defined (OCTAVE_HAVE_POSIX_FILESYSTEM)) |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
262 if (xpat[j] == '\\') |
22197
e43d83253e28
refill multi-line macro definitions
John W. Eaton <jwe@octave.org>
parents:
22155
diff
changeset
|
263 escaped += '/'; |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
264 else |
28869
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
265 # endif |
22402
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
266 { |
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
267 if (xpat[j] == ']' || xpat[j] == '[') |
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
268 escaped += '\\'; |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
269 |
22402
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
270 escaped += xpat[j]; |
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
271 } |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
272 } |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
273 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
274 // Replace trailing "*.*" by "*". |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
275 int len = escaped.length (); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
276 if (len >= 3 && escaped.substr (len - 3) == "*.*") |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
277 escaped = escaped.substr (0, len - 2); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
278 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
279 int err = octave_glob_wrapper (escaped.c_str (), |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
280 octave_glob_nosort_wrapper (), |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
281 glob_info); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
282 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
283 if (! err) |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
284 { |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
285 int n = octave_glob_num_matches (glob_info); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
286 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
287 const char * const *matches |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
288 = octave_glob_match_list (glob_info); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
289 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
290 // FIXME: we shouldn't have to check to see if |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
291 // a single match exists, but it seems that glob() won't |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
292 // check for us unless the pattern contains globbing |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
293 // characters. Hmm. |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
294 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
295 if (n > 1 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
296 || (n == 1 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
297 && single_match_exists (std::string (matches[0])))) |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
298 { |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
299 retval.resize (k + n); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
300 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
301 for (int j = 0; j < n; j++) |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
302 { |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
303 std::string tmp = matches[j]; |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
304 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
305 std::string unescaped; |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
306 unescaped.reserve (tmp.length ()); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
307 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
308 for (size_t m = 0; m < tmp.length (); m++) |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
309 { |
28869
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
310 # if (defined (OCTAVE_HAVE_WINDOWS_FILESYSTEM) \ |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
311 && ! defined (OCTAVE_HAVE_POSIX_FILESYSTEM)) |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
312 if (tmp[m] == '/') |
22197
e43d83253e28
refill multi-line macro definitions
John W. Eaton <jwe@octave.org>
parents:
22155
diff
changeset
|
313 unescaped += '\\'; |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
314 else |
28869
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
315 # endif |
22402
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
316 { |
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
317 if (tmp[m] == '\\' |
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
318 && ++m == tmp.length ()) |
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
319 break; |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
320 |
22402
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
321 unescaped += tmp[m]; |
4caa7b28d183
maint: Style check C++ code in liboctave/
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
322 } |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
323 } |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
324 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
325 retval[k++] = unescaped; |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
326 } |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
327 } |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
328 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
329 octave_globfree_wrapper (glob_info); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
330 } |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
331 } |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
332 } |
28869
4e64416772f1
Use Windows wide character API for __wglob__ (bug #59231).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28857
diff
changeset
|
333 #endif |
22155
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
334 |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
335 return retval.sort (); |
289409b2992d
Allow dir to accept [ and ] in arguments. (bug #47950)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
21929
diff
changeset
|
336 } |
21726
f05a00e611ff
use namespace for glob and fnmatch wrapper functions
John W. Eaton <jwe@octave.org>
parents:
21724
diff
changeset
|
337 } |
10138
805a83ecd3da
avoid conflict between glob.h definition of glob and glob_match::glob function
John W. Eaton <jwe@octave.org>
parents:
diff
changeset
|
338 } |