• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * @file path_filter.cpp
3  * Filter paths based on globbed exclude/include list
4  *
5  * @remark Copyright 2002 OProfile authors
6  * @remark Read the file COPYING
7  *
8  * @author Philippe Elie
9  * @author John Levon
10  */
11 
12 #include <fnmatch.h>
13 
14 #include <algorithm>
15 
16 #include "path_filter.h"
17 #include "string_manip.h"
18 #include "file_manip.h"
19 
20 using namespace std;
21 
match(string const & str) const22 bool path_filter::match(string const & str) const
23 {
24 	vector<string>::const_iterator cit;
25 
26 	// first, if any component of the dir is listed in exclude -> no
27 	string comp = op_dirname(str);
28 	while (!comp.empty() && comp != "/") {
29 		cit = find_if(exclude.begin(), exclude.end(),
30 			fnmatcher(op_basename(comp)));
31 		if (cit != exclude.end())
32 			return false;
33 
34 		// dirname("foo") == "foo"
35 		if (comp == op_dirname(comp))
36 			break;
37 		comp = op_dirname(comp);
38 	}
39 
40 	string const base = op_basename(str);
41 
42 	// now if the file name is specifically excluded -> no
43 	cit = find_if(exclude.begin(), exclude.end(), fnmatcher(base));
44 	if (cit != exclude.end())
45 		return false;
46 
47 	// now if the file name is specifically included -> yes
48 	cit = find_if(include.begin(), include.end(), fnmatcher(base));
49 	if (cit != include.end())
50 		return true;
51 
52 	// now if any component of the path is included -> yes
53 	// note that the include pattern defaults to '*'
54 	string compi = op_dirname(str);
55 	while (!compi.empty() && compi != "/") {
56 		cit = find_if(include.begin(), include.end(),
57 			fnmatcher(op_basename(compi)));
58 		if (cit != include.end())
59 			return true;
60 
61 		// dirname("foo") == "foo"
62 		if (compi == op_dirname(compi))
63 			break;
64 		compi = op_dirname(compi);
65 	}
66 
67 	return include.empty();
68 }
69