libzypp 17.31.23
Glob.h
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
12#ifndef ZYPP_GLOB_H
13#define ZYPP_GLOB_H
14
15extern "C"
16{
17#include <glob.h>
18}
19
20#include <iosfwd>
21
22#include <zypp/base/Easy.h>
23#include <zypp/base/Flags.h>
24#include <zypp/base/Iterator.h>
25#include <zypp/base/NonCopyable.h>
26#include <zypp-core/base/DefaultIntegral>
27
28#include <zypp/Pathname.h>
29
31namespace zypp
32{
33
35 namespace filesystem
36 {
37
39 //
40 // CLASS NAME : Glob
41 //
57 class Glob : private base::NonCopyable
58 {
59 public:
60 typedef size_t size_type;
61 typedef const char * value_type;
62
64 class const_iterator : public boost::iterator_adaptor<
65 const_iterator // Derived
66 , char ** // Base
67 , value_type // Value
68 , boost::forward_traversal_tag // CategoryOrTraversal
69 , const value_type // Reference
70 >
71 {
72 public:
74 : const_iterator::iterator_adaptor_( 0 )
75 {}
76
77 explicit const_iterator( char ** _idx )
78 : const_iterator::iterator_adaptor_( _idx && *_idx ? _idx : 0 )
79 {}
80
81 private:
83 void increment()
84 {
85 if ( base_reference() && !*(++base_reference()) )
86 base_reference() = 0;
87 }
88 reference dereference() const
89 { return( base() ? *base() : 0 ); }
90 };
92
93 public:
95 enum Bits {
96 kErr = GLOB_ERR,
97 kMark = GLOB_MARK,
98 kNoSort = GLOB_NOSORT,
99 // unsupported kDoOffs = GLOB_DOOFFS, //!< Insert PGLOB->gl_offs NULLs.
100 kNoCheck = GLOB_NOCHECK,
101 // autoapplied kAppend = GLOB_APPEND, //!< Append to results of a previous call.
102 kNoEscape = GLOB_NOESCAPE,
103 kPeriod = GLOB_PERIOD,
104 // unsupported kMagChar = GLOB_MAGCHAR,//!< Set in gl_flags if any metachars seen.
105 kAltDirFunc = GLOB_ALTDIRFUNC,
106 kBrace = GLOB_BRACE,
107 kNoMagic = GLOB_NOMAGIC,
108 kTilde = GLOB_TILDE,
109 kOnlyDir = GLOB_ONLYDIR,
110 kTildeCheck = GLOB_TILDE_CHECK,
111 };
112
115
116 public:
121 Glob( Flags flags_r = Flags() )
122 : _defaultFlags( flags_r )
123 {}
124
129 explicit Glob( const Pathname & pattern_r, Flags flags_r = Flags() )
130 : _defaultFlags( flags_r )
131 { add( pattern_r, flags_r ); }
133 explicit Glob( const std::string & pattern_r, Flags flags_r = Flags() )
134 : _defaultFlags( flags_r )
135 { add( pattern_r, flags_r ); }
137 explicit Glob( const char * pattern_r, Flags flags_r = Flags() )
138 : _defaultFlags( flags_r )
139 { add( pattern_r, flags_r ); }
140
143 { if ( _result ) ::globfree( &(*_result) ); }
144
155 int add( const Pathname & pattern_r, Flags flags_r = Flags() )
156 { return add( pattern_r.c_str(), flags_r ); }
158 int add( const std::string & pattern_r, Flags flags_r = Flags() )
159 { return add( pattern_r.c_str(), flags_r ); }
161 int add( const char * pattern_r, Flags flags_r = Flags() );
162
164 void clear();
165
167 void reset( Flags flags_r = Flags() )
168 { clear(); setDefaultFlags( flags_r ); }
169
170
171 public:
173 Flags defaultFlags() const
174 { return _defaultFlags; }
175
177 void setDefaultFlags( Flags flags_r = Flags() )
178 { _defaultFlags = flags_r; }
179
184 int lastGlobReturn() const
185 { return _lastGlobReturn; }
186
187 public:
189 bool empty() const
190 { return ! ( _result && _result->gl_pathc ); }
191
194 { return( _result ? _result->gl_pathc : 0 ); }
195
198 { return( _result ? const_iterator( _result->gl_pathv ) : const_iterator() ); }
199
202 { return const_iterator(); }
203
204 public:
205
215 template<class TOutputIterator>
216 static int collect( const Pathname & pattern_r, TOutputIterator result_r )
217 { return collect( pattern_r.c_str(), Flags(), result_r ); }
219 template<class TOutputIterator>
220 static int collect( const std::string & pattern_r, TOutputIterator result_r )
221 { return collect( pattern_r.c_str(), Flags(), result_r ); }
223 template<class TOutputIterator>
224 static int collect( const char * pattern_r, TOutputIterator result_r )
225 { return collect( pattern_r, Flags(), result_r ); }
226
228 template<class TOutputIterator>
229 static int collect( const Pathname & pattern_r, Flags flags_r, TOutputIterator result_r )
230 { return collect( pattern_r.c_str(), flags_r, result_r ); }
232 template<class TOutputIterator>
233 static int collect( const std::string & pattern_r, Flags flags_r, TOutputIterator result_r )
234 { return collect( pattern_r.c_str(), flags_r, result_r ); }
236 template<class TOutputIterator>
237 static int collect( const char * pattern_r, Flags flags_r, TOutputIterator result_r )
238 {
239 Glob glob( pattern_r, flags_r );
240 if ( glob.lastGlobReturn() == 0 )
241 for_( it, glob.begin(), glob.end() )
242 (*result_r)++ = typename TOutputIterator::container_type::value_type(*it);
243 return glob.lastGlobReturn();
244 }
246
247 private:
249 scoped_ptr< ::glob_t> _result;
251 };
253
255 std::ostream & operator<<( std::ostream & str, const Glob & obj );
256
258 inline std::ostream & operator<<( std::ostream & str, const Glob::const_iterator & obj )
259 { return str << *obj; }
260
262
264
266 } // namespace filesystem
269} // namespace zypp
271#endif // ZYPP_GLOB_H
Integral type with defined initial value when default constructed.
Iterate NULL terminated char* array.
Definition: Glob.h:71
std::ostream & operator<<(std::ostream &str, const Glob::const_iterator &obj)
Stream output.
Definition: Glob.h:258
friend class boost::iterator_core_access
Definition: Glob.h:82
reference dereference() const
Definition: Glob.h:88
Find pathnames matching a pattern.
Definition: Glob.h:58
static int collect(const std::string &pattern_r, Flags flags_r, TOutputIterator result_r)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: Glob.h:233
bool empty() const
Whether matches were found.
Definition: Glob.h:189
scoped_ptr< ::glob_t > _result
Definition: Glob.h:249
void setDefaultFlags(Flags flags_r=Flags())
Set the default flags passed to ::glob().
Definition: Glob.h:177
int add(const std::string &pattern_r, Flags flags_r=Flags())
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: Glob.h:158
Glob(Flags flags_r=Flags())
Default ctor optionally taking the default flags.
Definition: Glob.h:121
size_type size() const
The number of matches found so far.
Definition: Glob.h:193
static int collect(const std::string &pattern_r, TOutputIterator result_r)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: Glob.h:220
ZYPP_DECLARE_FLAGS(Flags, Bits)
type Flags: Type-safe OR-combination of Bits.
const_iterator begin() const
Iterator pointing to the first result.
Definition: Glob.h:197
int add(const Pathname &pattern_r, Flags flags_r=Flags())
Add pathnames matching pattern_r to the current result.
Definition: Glob.h:155
static int collect(const char *pattern_r, TOutputIterator result_r)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: Glob.h:224
Bits
Individual bits to combine in Flags.
Definition: Glob.h:95
@ kOnlyDir
Match only directories.
Definition: Glob.h:109
@ kBrace
Expand "{a,b}" to "a" "b".
Definition: Glob.h:106
@ kPeriod
Leading ‘.’ can be matched by metachars.
Definition: Glob.h:103
@ kNoCheck
If nothing matches, return the pattern.
Definition: Glob.h:100
@ kNoEscape
Backslashes don't quote metacharacters.
Definition: Glob.h:102
@ kNoMagic
If no magic chars, return the pattern.
Definition: Glob.h:107
@ kTilde
Expand ~user and ~ to home directories.
Definition: Glob.h:108
@ kMark
Append a slash to each name.
Definition: Glob.h:97
@ kNoSort
Don't sort the names.
Definition: Glob.h:98
@ kErr
Return on read errors.
Definition: Glob.h:96
@ kAltDirFunc
Use gl_opendir et al functions.
Definition: Glob.h:105
@ kTildeCheck
Like GLOB_TILDE but return an error if the user name is not available.
Definition: Glob.h:110
const char * value_type
Definition: Glob.h:61
DefaultIntegral< int, 0 > _lastGlobReturn
Definition: Glob.h:250
int lastGlobReturn() const
Returns the value returned by the last call to ::glob().
Definition: Glob.h:184
static int collect(const Pathname &pattern_r, Flags flags_r, TOutputIterator result_r)
Definition: Glob.h:229
void reset(Flags flags_r=Flags())
Clear all results and reset defaultFlags.
Definition: Glob.h:167
void clear()
Clear all results found so far.
Definition: Glob.cc:38
const_iterator end() const
Iterator pointing behind the last result.
Definition: Glob.h:201
static int collect(const char *pattern_r, Flags flags_r, TOutputIterator result_r)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: Glob.h:237
static int collect(const Pathname &pattern_r, TOutputIterator result_r)
Write glob result to some OutputIterator.
Definition: Glob.h:216
size_t size_type
Definition: Glob.h:60
Glob(const std::string &pattern_r, Flags flags_r=Flags())
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: Glob.h:133
Glob(const Pathname &pattern_r, Flags flags_r=Flags())
Ctor adding pathnames matching pattern_r.
Definition: Glob.h:129
Flags defaultFlags() const
The default flags passed to ::glob().
Definition: Glob.h:173
Glob(const char *pattern_r, Flags flags_r=Flags())
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: Glob.h:137
const char * c_str() const
String representation.
Definition: Pathname.h:110
String related utilities and Regular expression matching.
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Definition: NonCopyable.h:26
std::ostream & operator<<(std::ostream &str, const Glob &obj)
Definition: Glob.cc:53
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:2
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Definition: Easy.h:28
#define ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name)
Definition: Flags.h:177