| /** |
| * @file image_errors.cpp |
| * Report errors in images |
| * |
| * @remark Copyright 2002 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * @author John Levon |
| */ |
| |
| #include "image_errors.h" |
| |
| #include "arrange_profiles.h" |
| #include "string_manip.h" |
| #include "locate_images.h" |
| |
| #include <iostream> |
| #include <set> |
| |
| using namespace std; |
| |
| namespace { |
| |
| set<string> reported_images_error; |
| |
| } |
| |
| void report_image_error(string const & image, image_error error, bool fatal, |
| extra_images const & extra) |
| { |
| if (error == image_ok) |
| return; |
| |
| string image_name = extra.get_archive_path() + image; |
| |
| if (reported_images_error.find(image_name) == |
| reported_images_error.end()) { |
| reported_images_error.insert(image_name); |
| |
| // FIXME: hacky |
| if (error == image_not_found && is_prefix(image, "anon ")) |
| return; |
| |
| cerr << (fatal ? "error: " : "warning: "); |
| cerr << image_name << ' '; |
| |
| switch (error) { |
| case image_not_found: |
| cerr << "could not be found.\n"; |
| break; |
| |
| case image_unreadable: |
| cerr << "could not be read.\n"; |
| break; |
| |
| case image_multiple_match: |
| cerr << "matches more than one file: " |
| "detailed profile will not be provided.\n"; |
| break; |
| |
| case image_format_failure: |
| cerr << "is not in a usable binary format.\n"; |
| break; |
| |
| case image_ok: |
| break; |
| } |
| } |
| } |
| |
| |
| void report_image_error(inverted_profile const & profile, bool fatal, |
| extra_images const & extra) |
| { |
| report_image_error(profile.image, profile.error, fatal, extra); |
| } |
| |
| |
| void report_image_errors(list<inverted_profile> const & plist, |
| extra_images const & extra) |
| { |
| list<inverted_profile>::const_iterator it = plist.begin(); |
| list<inverted_profile>::const_iterator const end = plist.end(); |
| |
| for (; it != end; ++it) |
| report_image_error(*it, false, extra); |
| } |