Listing 1
(a)
#ifndef MCI_H
#define MCI_H
#include <string>
#include "MethodAnalyzer.h"
struct IMciEvents;
class Mci
{
public:
Mci(const std::string & filename, int lineNumber, std::string line);
~Mci();
static IMciEvents * & GetSink();
static void Register(IMciEvents * pSink);
private:
std::string GetLine(const std::string & filename, int lineNumber);
private:
std::string m_filename;
int m_lineNumber;
MethodInfo m_methodInfo;
};
#endif // !defined(__MCI_H__)
(b)
#include "Mci.h"
#include "IMciEvents.h"
#include "MethodAnalyzer.h"
#include <fstream>
using std::string;
using std::ifstream;
Mci::Mci(const string & filename, int lineNumber, string line) :
m_filename(filename),
m_lineNumber(lineNumber)
{
if (!GetSink())
return;
if (line.empty())
line = GetLine(filename, lineNumber-2);
m_methodInfo = MethodAnalyzer::Analyze(line);
// verify corectness of class name using typeinfo
GetSink()->OnEnter(m_filename, m_lineNumber, m_methodInfo);
}
Mci::~Mci()
{
if (!GetSink())
return;
GetSink()->OnLeave(m_filename, m_lineNumber, m_methodInfo);
}
IMciEvents * & Mci::GetSink()
{
static IMciEvents * pSink = 0;
return pSink;
}
void Mci::Register(IMciEvents * pSink)
{
GetSink() = pSink;
}
string Mci::GetLine(const string & filename, int lineNumber)
{
ifstream f;
f.open(filename.c_str());
const int BUFF_SIZE = 1024;
char buff[BUFF_SIZE];
for (int i = 0; i < lineNumber; i++)
f.getline(buff, BUFF_SIZE);
return string(buff);
}