94 lines
3.1 KiB
C
94 lines
3.1 KiB
C
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file globPattern.h
|
||
|
* @author drose
|
||
|
* @date 2000-05-30
|
||
|
*/
|
||
|
|
||
|
#ifndef GLOBPATTERN_H
|
||
|
#define GLOBPATTERN_H
|
||
|
|
||
|
#include "dtoolbase.h"
|
||
|
#include "filename.h"
|
||
|
#include "vector_string.h"
|
||
|
|
||
|
/**
|
||
|
* This class can be used to test for string matches against standard Unix-
|
||
|
* shell filename globbing conventions. It serves as a portable standin for
|
||
|
* the Posix fnmatch() call.
|
||
|
*
|
||
|
* A GlobPattern is given a pattern string, which can contain operators like
|
||
|
* *, ?, and []. Then it can be tested against any number of candidate
|
||
|
* strings; for each candidate, it will indicate whether the string matches
|
||
|
* the pattern or not. It can be used, for example, to scan a directory for
|
||
|
* all files matching a particular pattern.
|
||
|
*/
|
||
|
class EXPCL_DTOOL_DTOOLUTIL GlobPattern {
|
||
|
PUBLISHED:
|
||
|
INLINE GlobPattern(const std::string &pattern = std::string());
|
||
|
INLINE GlobPattern(const GlobPattern ©);
|
||
|
INLINE void operator = (const GlobPattern ©);
|
||
|
|
||
|
INLINE bool operator == (const GlobPattern &other) const;
|
||
|
INLINE bool operator != (const GlobPattern &other) const;
|
||
|
INLINE bool operator < (const GlobPattern &other) const;
|
||
|
|
||
|
INLINE void set_pattern(const std::string &pattern);
|
||
|
INLINE const std::string &get_pattern() const;
|
||
|
MAKE_PROPERTY(pattern, get_pattern, set_pattern);
|
||
|
|
||
|
INLINE void set_case_sensitive(bool case_sensitive);
|
||
|
INLINE bool get_case_sensitive() const;
|
||
|
MAKE_PROPERTY(case_sensitive, get_case_sensitive, set_case_sensitive);
|
||
|
|
||
|
INLINE void set_nomatch_chars(const std::string &nomatch_chars);
|
||
|
INLINE const std::string &get_nomatch_chars() const;
|
||
|
MAKE_PROPERTY(nomatch_chars, get_nomatch_chars, set_nomatch_chars);
|
||
|
|
||
|
INLINE bool matches(const std::string &candidate) const;
|
||
|
bool matches_file(Filename candidate) const;
|
||
|
|
||
|
INLINE void output(std::ostream &out) const;
|
||
|
|
||
|
bool has_glob_characters() const;
|
||
|
std::string get_const_prefix() const;
|
||
|
int match_files(vector_string &results, const Filename &cwd = Filename()) const;
|
||
|
#ifdef HAVE_PYTHON
|
||
|
EXTENSION(PyObject *match_files(const Filename &cwd = Filename()) const);
|
||
|
#endif
|
||
|
|
||
|
private:
|
||
|
bool matches_substr(std::string::const_iterator pi,
|
||
|
std::string::const_iterator pend,
|
||
|
std::string::const_iterator ci,
|
||
|
std::string::const_iterator cend) const;
|
||
|
|
||
|
bool matches_set(std::string::const_iterator &pi,
|
||
|
std::string::const_iterator pend,
|
||
|
char ch) const;
|
||
|
|
||
|
int r_match_files(const Filename &prefix, const std::string &suffix,
|
||
|
vector_string &results, const Filename &cwd);
|
||
|
bool r_matches_file(const std::string &suffix, const Filename &candidate) const;
|
||
|
|
||
|
std::string _pattern;
|
||
|
bool _case_sensitive;
|
||
|
std::string _nomatch_chars;
|
||
|
};
|
||
|
|
||
|
INLINE std::ostream &operator << (std::ostream &out, const GlobPattern &glob) {
|
||
|
glob.output(out);
|
||
|
return out;
|
||
|
}
|
||
|
|
||
|
|
||
|
#include "globPattern.I"
|
||
|
|
||
|
#endif
|