libzypp 17.37.17
StrMatcher.cc
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
12extern "C"
13{
14#include <solv/repo.h>
15}
16
17#include <iostream>
18#include <sstream>
19
20#include <zypp/base/LogTools.h>
21#include <zypp/base/Gettext.h>
22#include <zypp/base/String.h>
23
26
27using std::endl;
28
30namespace zypp
31{
33 // class Match
35
36 const int Match::_modemask = SEARCH_STRINGMASK;
37 const int Match::_flagmask = ~_modemask;
38
39 // option flags
40 const Match Match::NOCASE (SEARCH_NOCASE);
41
42 // sat::LookupAttr option flags
43 const Match Match::NO_STORAGE_SOLVABLE(SEARCH_NO_STORAGE_SOLVABLE);
44 const Match Match::SUB (SEARCH_SUB);
45 const Match Match::ARRAYSENTINEL (SEARCH_ARRAYSENTINEL);
46 const Match Match::DISABLED_REPOS (SEARCH_DISABLED_REPOS);
47 const Match Match::COMPLETE_FILELIST (SEARCH_COMPLETE_FILELIST);
48 const Match Match::SKIP_KIND (SEARCH_SKIP_KIND);
49 const Match Match::FILES (SEARCH_FILES);
50 const Match Match::CHECKSUMS (SEARCH_CHECKSUMS);
51
53 {
54 switch ( modeval() )
55 {
56 case 0: return NOTHING; break;
57 case SEARCH_STRING: return STRING; break;
58 case SEARCH_STRINGSTART: return STRINGSTART; break;
59 case SEARCH_STRINGEND: return STRINGEND; break;
60 case SEARCH_SUBSTRING: return SUBSTRING; break;
61 case SEARCH_GLOB: return GLOB; break;
62 case SEARCH_REGEX: return REGEX; break;
63 }
64 return OTHER;
65 }
66
67 int Match::modeval( Mode mode_r )
68 {
69 switch ( mode_r )
70 {
71 case NOTHING: return 0; break;
72 case STRING: return SEARCH_STRING; break;
73 case STRINGSTART: return SEARCH_STRINGSTART; break;
74 case STRINGEND: return SEARCH_STRINGEND; break;
75 case SUBSTRING: return SEARCH_SUBSTRING; break;
76 case GLOB: return SEARCH_GLOB; break;
77 case REGEX: return SEARCH_REGEX; break;
78 case OTHER: return SEARCH_STRINGMASK; break;
79 }
80 return SEARCH_STRINGMASK;
81 }
82
83 std::string Match::asString() const
84 { std::ostringstream str; str << *this; return str.str(); }
85
86 std::ostream & operator<<( std::ostream & str, Match::Mode obj )
87 {
88 switch ( obj )
89 {
90#define OUTS(V) case Match::V: return str << #V; break
91 OUTS( NOTHING );
92 OUTS( STRING );
93 OUTS( STRINGSTART );
94 OUTS( STRINGEND );
95 OUTS( SUBSTRING );
96 OUTS( GLOB );
97 OUTS( REGEX );
98 OUTS( OTHER );
99#undef OUTS
100 }
101 return str << "Match::Mode::UNKNOWN";
102 }
103
104 std::ostream & operator<<( std::ostream & str, const Match & obj )
105 {
106 if ( ! obj )
107 return str << "NOTHING";
108
109 const char * sep = "|";
110 Match::Mode mode( obj.mode() );
111 switch ( mode )
112 {
113 case Match::NOTHING:
114 sep = 0; // suppress 'NOTHING|'
115 break;
116 case Match::OTHER:
117 str << mode<<"("<<obj.modeval()<<")"; // check whether libsolv has introduced new modes!
118 break;
119 default:
120 str << mode;
121 break;
122 }
123
124 int val = obj.flagval();
125 if ( val )
126 {
127#define OUTS(V) if ( val & Match::V.get() ) { val &= ~Match::V.get(); if ( sep ) str << sep; else sep = "|"; str << #V; }
128 OUTS( NOCASE );
130 OUTS( SUB );
134 OUTS( SKIP_KIND );
135 OUTS( FILES );
136 OUTS( CHECKSUMS );
137#undef OUTS
138 if ( val )
139 {
140 if ( sep ) str << sep;
141 str << zypp::str::hexstring( val ); // check whether libsolv has introduced new flags.
142 }
143 }
144 return str;
145 }
146
148 // class MatchException
150
151 MatchUnknownModeException::MatchUnknownModeException( const Match & mode_r, const std::string & msg_r )
152 : MatchException( msg_r.empty() ? str::form(_("Unknown match mode '%s'"), mode_r.asString().c_str() )
153 : str::form(_("Unknown match mode '%s' for pattern '%s'"), mode_r.asString().c_str(), msg_r.c_str() ) )
154 {}
155
156 MatchInvalidRegexException::MatchInvalidRegexException( const std::string & regex_r, int regcomp_r )
157 : MatchException( regcomp_r ? str::form(_("Invalid regular expression '%s': regcomp returned %d"), regex_r.c_str(), regcomp_r )
158 : str::form(_("Invalid regular expression '%s'"), regex_r.c_str() ) )
159 {}
160
169 {
171 {}
172
173 Impl( std::string search_r, const Match & flags_r )
174 : _search( std::move(search_r) )
175 , _flags( flags_r )
176 {}
177
179 { invalidate(); }
180
181 Impl(const Impl &) = delete;
182 Impl(Impl &&) = delete;
183 Impl &operator=(const Impl &) = delete;
184 Impl &operator=(Impl &&) = delete;
185
187 void compile() const
188 {
189 if ( !_matcher )
190 {
191 if ( _flags.mode() == Match::OTHER )
193
195 int res = ::datamatcher_init( _matcher.get(), _search.c_str(), _flags.get() );
196 if ( res )
197 {
198 _matcher.reset();
200 }
201 }
202 }
203
205 bool isCompiled() const
206 { return _matcher != nullptr; }
207
209 bool doMatch( const char * string_r ) const
210 {
211 compile(); // nop if already compiled.
212
213 if ( ! string_r )
214 return false; // NULL never matches
215 return ::datamatcher_match( _matcher.get(), string_r );
216 }
217
219 const std::string & searchstring() const
220 { return _search; }
221
223 void setSearchstring( std::string string_r )
224 { invalidate(); _search = std::move(string_r); }
225
227 const Match & flags() const
228 { return _flags; }
229
231 void setFlags( const Match & flags_r )
232 { invalidate(); _flags = flags_r; }
233
234 private:
237 {
238 if ( _matcher )
239 ::datamatcher_free( _matcher.get() );
240 _matcher.reset();
241 }
242
243 private:
244 std::string _search;
247
248 private:
249 friend Impl * rwcowClone<Impl>( const Impl * rhs );
251 Impl * clone() const
252 { return new Impl( _search, _flags ); }
253 };
254
256 inline std::ostream & operator<<( std::ostream & str, const StrMatcher::Impl & obj )
257 {
258 return str << "\"" << obj.searchstring() << "\"{" << obj.flags() << "}";
259 }
260
262 // class StrMatcher
264
266 : _pimpl( new Impl )
267 {}
268
269 StrMatcher::StrMatcher( const std::string & search_r )
270 : _pimpl( new Impl( search_r, Match::STRING ) )
271 {}
272 StrMatcher::StrMatcher( std::string && search_r )
273 : _pimpl( new Impl( std::move(search_r), Match::STRING ) )
274 {}
275
276 StrMatcher::StrMatcher( const std::string & search_r, const Match & flags_r )
277 : _pimpl( new Impl( search_r, flags_r ) )
278 {}
279 StrMatcher::StrMatcher( std::string && search_r, const Match & flags_r )
280 : _pimpl( new Impl( std::move(search_r), flags_r ) )
281 {}
282
283 StrMatcher::StrMatcher( const std::string & search_r, const Match::Mode & flags_r )
284 : _pimpl( new Impl( search_r, flags_r ) )
285 {}
286 StrMatcher::StrMatcher( std::string && search_r, const Match::Mode & flags_r )
287 : _pimpl( new Impl( std::move(search_r), flags_r ) )
288 {}
289
290 StrMatcher::StrMatcher( const std::string & search_r, int flags_r )
291 : _pimpl( new Impl( search_r, Match(flags_r) ) )
292 {}
293 StrMatcher::StrMatcher( std::string && search_r, int flags_r )
294 : _pimpl( new Impl( std::move(search_r), Match(flags_r) ) )
295 {}
296
298 { return _pimpl->compile(); }
299
301 { return _pimpl->isCompiled(); }
302
303 bool StrMatcher::doMatch( const char * string_r ) const
304 { return _pimpl->doMatch( string_r ); }
305
306 const std::string & StrMatcher::searchstring() const
307 { return _pimpl->searchstring(); }
308
309 void StrMatcher::setSearchstring( const std::string & string_r )
310 { _pimpl->setSearchstring( string_r ); }
311 void StrMatcher::setSearchstring( std::string && string_r )
312 { _pimpl->setSearchstring( std::move(string_r) ); }
313
314 void StrMatcher::setSearchstring( const std::string & string_r, const Match & flags_r )
315 {
316 _pimpl->setSearchstring( string_r );
317 _pimpl->setFlags( flags_r );
318 }
319 void StrMatcher::setSearchstring( std::string && string_r, const Match & flags_r )
320 {
321 _pimpl->setSearchstring( std::move(string_r) );
322 _pimpl->setFlags( flags_r );
323 }
324
325 const Match & StrMatcher::flags() const
326 { return _pimpl->flags(); }
327
328 void StrMatcher::setFlags( const Match & flags_r )
329 { _pimpl->setFlags( flags_r ); }
330
331 std::ostream & operator<<( std::ostream & str, const StrMatcher & obj )
332 { return str << *obj._pimpl; }
333
334 bool operator==( const StrMatcher & lhs, const StrMatcher & rhs )
335 {
336 return ( lhs.flags() == rhs.flags()
337 && lhs.searchstring() == rhs.searchstring() );
338 }
339
340 bool operator<( const StrMatcher & lhs, const StrMatcher & rhs )
341 {
342 if ( lhs.flags().get() != rhs.flags().get() )
343 return ( lhs.flags().get() < rhs.flags().get() );
344
345 return ( lhs.searchstring() < rhs.searchstring() );
346 }
347
348} // namespace zypp
#define OUTS(V)
String matching option flags as used e.g.
Definition StrMatcher.h:33
static const Match DISABLED_REPOS
LookupAttr: internal.
Definition StrMatcher.h:72
int flagval() const
Return the flags integer representation.
Definition StrMatcher.h:154
Match()
Default ctor 0 or NOTHING.
Definition StrMatcher.h:81
int get() const
Return the integer representation.
Definition StrMatcher.h:150
std::string asString() const
String representation.
Definition StrMatcher.cc:83
static const Match ARRAYSENTINEL
LookupAttr: internal.
Definition StrMatcher.h:71
static const Match SUB
LookupAttr: internal.
Definition StrMatcher.h:70
Mode
Mode flags (mutual exclusive).
Definition StrMatcher.h:41
@ STRINGEND
Match at string end.
Definition StrMatcher.h:45
@ NOTHING
Match nothing.
Definition StrMatcher.h:42
@ OTHER
Something else.
Definition StrMatcher.h:49
@ REGEX
Regular Expression.
Definition StrMatcher.h:48
@ STRINGSTART
Match at string start.
Definition StrMatcher.h:44
@ GLOB
Glob.
Definition StrMatcher.h:47
@ SUBSTRING
Match substring.
Definition StrMatcher.h:46
@ STRING
Excat matching.
Definition StrMatcher.h:43
static const Match COMPLETE_FILELIST
LookupAttr: internal.
Definition StrMatcher.h:73
static const Match CHECKSUMS
LookupAttr: also look for matches in checksums.
Definition StrMatcher.h:76
static const int _flagmask
Definition StrMatcher.h:36
static const Match NO_STORAGE_SOLVABLE
LookupAttr: internal.
Definition StrMatcher.h:69
static const Match FILES
LookupAttr: match full path when matching in filelists, otherwise just the basenames.
Definition StrMatcher.h:75
static const Match SKIP_KIND
LookupAttr: skip any kind: prefix when looking at a Solvable name.
Definition StrMatcher.h:74
static const Match NOCASE
If set, match case insensitive.
Definition StrMatcher.h:59
int modeval() const
Return the modes integer representation.
Definition StrMatcher.h:152
static const int _modemask
Definition StrMatcher.h:35
Mode mode() const
Return the mode part.
Definition StrMatcher.cc:52
bool doMatch(const char *string_r) const
Return whether string matches.
const std::string & searchstring() const
The current searchstring.
const Match & flags() const
The current search flags.
RWCOW_pointer< Impl > _pimpl
Pointer to implementation.
Definition StrMatcher.h:392
StrMatcher()
Default ctor matches nothing.
void setSearchstring(const std::string &string_r)
Set a new searchstring.
void setFlags(const Match &flags_r)
Set new search flags.
bool isCompiled() const
Whether the StrMatcher is already compiled.
void compile() const
Compile the pattern e.g.
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Definition String.cc:39
Definition Arch.h:364
String related utilities and Regular expression matching.
::s_Datamatcher CDatamatcher
Wrapped libsolv C data type exposed as backdoor.
Definition PoolMember.h:59
std::string hexstring(char n, int w=4)
Definition String.h:325
Easy-to use interface to the ZYPP dependency resolver.
bool operator<(const StrMatcher &lhs, const StrMatcher &rhs)
bool operator==(const SetRelation::Enum &lhs, const SetCompare &rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
std::ostream & operator<<(std::ostream &str, const SerialNumber &obj)
std::string asString(const Patch::Category &obj)
Definition Patch.cc:122
MatchException(const std::string &msg_r)
Supplied message.
Definition StrMatcher.h:250
Invalid regular expression (failed regcomp).
Definition StrMatcher.h:271
MatchInvalidRegexException(const std::string &msg_r)
Supplied message.
Definition StrMatcher.h:273
MatchUnknownModeException(const std::string &msg_r)
Supplied message.
Definition StrMatcher.h:260
StrMatcher implementation.
Impl * clone() const
clone for RWCOW_pointer
const Match & flags() const
The current search flags.
Impl & operator=(Impl &&)=delete
const std::string & searchstring() const
The current searchstring.
friend Impl * rwcowClone(const Impl *rhs)
void compile() const
Compile the pattern.
Impl(Impl &&)=delete
bool isCompiled() const
Whether the pattern is already compiled.
bool doMatch(const char *string_r) const
Return whether string matches.
void invalidate()
Has to be called if _search or _flags change.
void setSearchstring(std::string string_r)
Set a new searchstring.
std::ostream & operator<<(std::ostream &str, const StrMatcher::Impl &obj)
Stream output.
Impl & operator=(const Impl &)=delete
Impl(std::string search_r, const Match &flags_r)
void setFlags(const Match &flags_r)
Set new search flags.
Impl(const Impl &)=delete
scoped_ptr< sat::detail::CDatamatcher > _matcher
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition Exception.h:459
#define _(MSG)
Definition Gettext.h:39
Interface to gettext.