| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- // Filename: ppFilenamePattern.cxx
- // Created by: drose (25Sep00)
- //
- ////////////////////////////////////////////////////////////////////
- #include "ppFilenamePattern.h"
- #include <assert.h>
- ////////////////////////////////////////////////////////////////////
- // Function: PPFilenamePattern::Constructor
- // Access: Public
- // Description:
- ////////////////////////////////////////////////////////////////////
- PPFilenamePattern::
- PPFilenamePattern(const string &pattern) {
- size_t pct = pattern.find(PATTERN_WILDCARD);
- _has_wildcard = (pct != string::npos);
-
- if (_has_wildcard) {
- _prefix = pattern.substr(0, pct);
- _suffix = pattern.substr(pct + 1);
- } else {
- _prefix = pattern;
- }
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PPFilenamePattern::Copy Constructor
- // Access: Public
- // Description:
- ////////////////////////////////////////////////////////////////////
- PPFilenamePattern::
- PPFilenamePattern(const PPFilenamePattern ©) :
- _has_wildcard(copy._has_wildcard),
- _prefix(copy._prefix),
- _suffix(copy._suffix)
- {
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PPFilenamePattern::Copy Assignment Operator
- // Access: Public
- // Description:
- ////////////////////////////////////////////////////////////////////
- void PPFilenamePattern::
- operator = (const PPFilenamePattern ©) {
- _has_wildcard = copy._has_wildcard;
- _prefix = copy._prefix;
- _suffix = copy._suffix;
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PPFilenamePattern::has_wildcard
- // Access: Public
- // Description: Returns true if the filename pattern contained a
- // wildcard (and hence represents a pattern and not
- // just a single particular filename), or false if it
- // did not.
- ////////////////////////////////////////////////////////////////////
- bool PPFilenamePattern::
- has_wildcard() const {
- return _has_wildcard;
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PPFilenamePattern::get_pattern
- // Access: Public
- // Description: Returns the filename pattern.
- ////////////////////////////////////////////////////////////////////
- string PPFilenamePattern::
- get_pattern() const {
- if (_has_wildcard) {
- return _prefix + PATTERN_WILDCARD + _suffix;
- } else {
- return _prefix;
- }
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PPFilenamePattern::get_prefix
- // Access: Public
- // Description: Returns the part of the filename pattern before the
- // wildcard. If the filename did not contain a
- // wildcard, this returns the entire filename.
- ////////////////////////////////////////////////////////////////////
- const string &PPFilenamePattern::
- get_prefix() const {
- return _prefix;
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PPFilenamePattern::get_suffix
- // Access: Public
- // Description: Returns the part of the filename pattern after the
- // wildcard. If the filename did not contain a
- // wildcard, this returns the empty string.
- ////////////////////////////////////////////////////////////////////
- const string &PPFilenamePattern::
- get_suffix() const {
- return _suffix;
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PPFilenamePattern::matches_filename
- // Access: Public
- // Description: Returns true if the given filename matches the
- // pattern, false otherwise.
- ////////////////////////////////////////////////////////////////////
- bool PPFilenamePattern::
- matches(const string &filename) const {
- if (_has_wildcard) {
- return
- (filename.length() >= _prefix.length() + _suffix.length()) &&
- (filename.substr(0, _prefix.length()) == _prefix) &&
- (filename.substr(filename.length() - _suffix.length()) == _suffix);
- } else {
- return (filename == _prefix);
- }
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PPFilenamePattern::extract_body
- // Access: Public
- // Description: If the filename matches the pattern
- // (e.g. matches_filename() returns true), return the
- // portion of the filename that corresponds to the
- // wildcard in the pattern: the part of the filename
- // between the prefix and the suffix. If the filename
- // does not match the pattern, or the pattern does not
- // contain a wildcard, returns empty string.
- ////////////////////////////////////////////////////////////////////
- string PPFilenamePattern::
- extract_body(const string &filename) const {
- if (_has_wildcard) {
- size_t outside_length = _prefix.length() + _suffix.length();
- if ((filename.length() >= outside_length) &&
- (filename.substr(0, _prefix.length()) == _prefix) &&
- (filename.substr(filename.length() - _suffix.length()) == _suffix)) {
- return filename.substr(_prefix.length(), filename.length() - outside_length);
- }
- }
- return string();
- }
- ////////////////////////////////////////////////////////////////////
- // Function: PPFilenamePattern::transform_filename
- // Access: Public
- // Description: Transforms a filename by replacing the parts of the
- // filename described in the pattern transform_from with
- // the corresponding parts of the filename described in
- // this pattern. If the filename does not match
- // transform_from, returns the untransformed filename.
- //
- // It is an error to call this unless both this pattern
- // and transform_from include a wildcard.
- ////////////////////////////////////////////////////////////////////
- string PPFilenamePattern::
- transform(const string &filename,
- const PPFilenamePattern &transform_from) const {
- assert(transform_from._has_wildcard);
- if (transform_from.matches(filename)) {
- if (!_has_wildcard) {
- return _prefix;
- } else {
- string body = transform_from.extract_body(filename);
- string result = _prefix + body;
- // Now the suffix might contain more % characters. Replace all
- // of them.
- size_t p = 0;
- size_t pct = _suffix.find(PATTERN_WILDCARD, p);
- while (pct != string::npos) {
- result += _suffix.substr(p, pct - p);
- result += body;
- p = pct + 1;
- pct = _suffix.find(PATTERN_WILDCARD, p);
- }
- result += _suffix.substr(p);
- return result;
- }
- }
- return filename;
- }
|