/**
* @file filename_spec.cpp
* Container holding a sample filename split into its components
*
* @remark Copyright 2003 OProfile authors
* @remark Read the file COPYING
*
* @author Philippe Elie
*/
#include <string>
#include "filename_spec.h"
#include "parse_filename.h"
#include "generic_spec.h"
#include "locate_images.h"
using namespace std;
filename_spec::filename_spec(string const & filename,
extra_images const & extra)
{
set_sample_filename(filename, extra);
}
filename_spec::filename_spec()
: image("*"), lib_image("*")
{
}
bool filename_spec::match(filename_spec const & rhs,
string const & binary) const
{
if (!tid.match(rhs.tid) || !cpu.match(rhs.cpu) ||
!tgid.match(rhs.tgid) || count != rhs.count ||
unitmask != rhs.unitmask || event != rhs.event) {
return false;
}
if (binary.empty())
return image == rhs.image && lib_image == rhs.lib_image;
// PP:3.3 if binary is not empty we must match either the
// lib_name if present or the image name
if (!rhs.lib_image.empty()) {
// FIXME: use fnmatch ?
return rhs.lib_image == binary;
}
// FIXME: use fnmatch ?
return rhs.image == binary;
}
void filename_spec::set_sample_filename(string const & filename,
extra_images const & extra)
{
parsed_filename parsed = parse_filename(filename, extra);
image = parsed.image;
lib_image = parsed.lib_image;
cg_image = parsed.cg_image;
event = parsed.event;
count = op_lexical_cast<int>(parsed.count);
unitmask = op_lexical_cast<unsigned int>(parsed.unitmask);
tgid.set(parsed.tgid);
tid.set(parsed.tid);
cpu.set(parsed.cpu);
}
bool filename_spec::is_dependent() const
{
if (cg_image.empty())
return image != lib_image;
return cg_image != image || cg_image != lib_image;
}