/**
* @file abi.cpp
*
* @remark Copyright 2002 OProfile authors
* @remark Read the file COPYING
*
* @author Graydon Hoare
* @author John Levon
* @author Philippe Elie
*/
#include "abi.h"
#include "op_abi.h"
#include "odb.h"
#include "op_sample_file.h"
#include <iostream>
#include <cassert>
using namespace std;
typedef map<string, int> abi_map;
typedef abi_map::const_iterator abi_iter;
abi_exception::abi_exception(string const d) : desc(d) {}
abi::abi()
{
op_abi_entry const * entry = get_abi();
for ( ; entry->name != 0; ++entry)
slots[entry->name] = entry->offset;
slots["little_endian"] = op_little_endian();
}
int abi::need(string const key) const throw (abi_exception)
{
if (slots.find(key) != slots.end())
return slots.find(key)->second;
else
throw abi_exception(string("missing ABI key: ") + key);
}
bool abi::operator==(abi const & other) const
{
return slots == other.slots;
}
ostream & operator<<(ostream & o, abi const & abi)
{
abi_iter i = abi.slots.begin();
abi_iter e = abi.slots.end();
for (; i != e; ++i)
o << i->first << " " << i->second << endl;
return o;
}
istream & operator>>(istream & i, abi & abi)
{
string key;
int val;
abi.slots.clear();
while(i >> key >> val)
abi.slots[key] = val;
return i;
}