18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file filename_spec.cpp
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Container holding a sample filename split into its components
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2003 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string>
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "filename_spec.h"
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "parse_filename.h"
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "generic_spec.h"
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "locate_images.h"
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddusing namespace std;
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddfilename_spec::filename_spec(string const & filename,
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			     extra_images const & extra)
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	set_sample_filename(filename, extra);
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddfilename_spec::filename_spec()
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	: image("*"), lib_image("*")
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool filename_spec::match(filename_spec const & rhs,
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                          string const & binary) const
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!tid.match(rhs.tid) || !cpu.match(rhs.cpu) ||
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    !tgid.match(rhs.tgid) || count != rhs.count ||
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	    unitmask != rhs.unitmask || event != rhs.event) {
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return false;
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (binary.empty())
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return image == rhs.image && lib_image == rhs.lib_image;
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// PP:3.3 if binary is not empty we must match either the
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// lib_name if present or the image name
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!rhs.lib_image.empty()) {
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		// FIXME: use fnmatch ?
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return rhs.lib_image == binary;
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	// FIXME: use fnmatch ?
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return rhs.image == binary;
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid filename_spec::set_sample_filename(string const & filename,
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	extra_images const & extra)
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	parsed_filename parsed = parse_filename(filename, extra);
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	image = parsed.image;
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	lib_image = parsed.lib_image;
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cg_image = parsed.cg_image;
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	event = parsed.event;
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	count = op_lexical_cast<int>(parsed.count);
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	unitmask = op_lexical_cast<unsigned int>(parsed.unitmask);
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	tgid.set(parsed.tgid);
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	tid.set(parsed.tid);
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cpu.set(parsed.cpu);
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddbool filename_spec::is_dependent() const
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (cg_image.empty())
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return image != lib_image;
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return cg_image != image || cg_image != lib_image;
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
82