1/**
2 * @file image_errors.cpp
3 * Report errors in images
4 *
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author John Levon
9 */
10
11#include "image_errors.h"
12
13#include "arrange_profiles.h"
14#include "string_manip.h"
15#include "locate_images.h"
16
17#include <iostream>
18#include <set>
19
20using namespace std;
21
22namespace {
23
24set<string> reported_images_error;
25
26}
27
28void report_image_error(string const & image, image_error error, bool fatal,
29			extra_images const & extra)
30{
31	if (error == image_ok)
32		return;
33
34	string image_name = extra.get_archive_path() + image;
35
36	if (reported_images_error.find(image_name) ==
37	    reported_images_error.end()) {
38		reported_images_error.insert(image_name);
39
40		// FIXME: hacky
41		if (error == image_not_found && is_prefix(image, "anon "))
42			return;
43
44		cerr << (fatal ? "error: " : "warning: ");
45		cerr << image_name << ' ';
46
47		switch (error) {
48			case image_not_found:
49				cerr << "could not be found.\n";
50				break;
51
52			case image_unreadable:
53				cerr << "could not be read.\n";
54				break;
55
56			case image_multiple_match:
57				cerr << "matches more than one file: "
58				    "detailed profile will not be provided.\n";
59				break;
60
61			case image_format_failure:
62				cerr << "is not in a usable binary format.\n";
63				break;
64
65			case image_ok:
66				break;
67		}
68	}
69}
70
71
72void report_image_error(inverted_profile const & profile, bool fatal,
73			extra_images const & extra)
74{
75	report_image_error(profile.image, profile.error, fatal, extra);
76}
77
78
79void report_image_errors(list<inverted_profile> const & plist,
80			 extra_images const & extra)
81{
82	list<inverted_profile>::const_iterator it = plist.begin();
83	list<inverted_profile>::const_iterator const end = plist.end();
84
85	for (; it != end; ++it)
86		report_image_error(*it, false, extra);
87}
88