diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 14:27:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 14:27:09 +0000 |
commit | 4caff76ff707b2d82726ef94872c3597fd62a4ae (patch) | |
tree | bea175e053890b150463151752b7a49dc49c436e /exclude.cc | |
parent | Initial commit. (diff) | |
download | tarlz-4caff76ff707b2d82726ef94872c3597fd62a4ae.tar.xz tarlz-4caff76ff707b2d82726ef94872c3597fd62a4ae.zip |
Adding upstream version 0.23.upstream/0.23upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'exclude.cc')
-rw-r--r-- | exclude.cc | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/exclude.cc b/exclude.cc new file mode 100644 index 0000000..99491ca --- /dev/null +++ b/exclude.cc @@ -0,0 +1,54 @@ +/* Tarlz - Archiver with multimember lzip compression + Copyright (C) 2013-2022 Antonio Diaz Diaz. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#define _FILE_OFFSET_BITS 64 + +#include <cstdlib> +#include <fnmatch.h> + +#include "tarlz.h" + + +namespace Exclude { + +std::vector< std::string > patterns; // list of patterns + +} // end namespace Exclude + + +void Exclude::add_pattern( const std::string & arg ) + { patterns.push_back( arg ); } + + +bool Exclude::excluded( const char * const filename ) + { + if( patterns.empty() ) return false; + const char * p = filename; + do { + for( unsigned i = 0; i < patterns.size(); ++i ) + // ignore a trailing sequence starting with '/' in filename +#ifdef FNM_LEADING_DIR + if( fnmatch( patterns[i].c_str(), p, FNM_LEADING_DIR ) == 0 ) return true; +#else + if( fnmatch( patterns[i].c_str(), p, 0 ) == 0 || + fnmatch( ( patterns[i] + "/*" ).c_str(), p, 0 ) == 0 ) return true; +#endif + while( *p && *p != '/' ) ++p; // skip component + while( *p == '/' ) ++p; // skip slashes + } while( *p ); + return false; + } |