#include "cmd_manager.h"
#include <sstream>
#include <algorithm>

//
//  CCommandManager
//////////////////////////////////////////////////

CCommandManager::CCommandManager() {
}

int CCommandManager::Execute(string &sName, const char *cmdline) {
  ICommandHandler *handler = find(sName.c_str());
  if (handler != NULL) {
    return handler->Execute(cmdline, &GetConsole());
  }
  return CMD_ERR_PROCESSORNOTDEFINED;
}

int CCommandManager::Register(ICommandHandler * ch) {
  List::iterator it = lower_bound(m_HandlerList.begin( ), m_HandlerList.end( ),
    ch, lessThan());
  if (it != m_HandlerList.end() &&
    strcmp((*it)->GetName(), ch->GetName()) == 0) {
    return CMD_ERR_PROCESSORDEFINED;
  }
  m_HandlerList.insert(it, ch);
  return CMD_ERR_OK;
}

ICommandHandler * CCommandManager::find(const char *name) {
  CommandHandlerKey key(name);
  List::iterator it = lower_bound(m_HandlerList.begin( ), m_HandlerList.end( ),
    (ICommandHandler*)&key, lessThan());
  if (it != m_HandlerList.end() &&
    strcmp((*it)->GetName(), name) == 0) {
    return *it;
  }
  return NULL;
}

CCommandManager CCommandManager::m_CommandManger;

CCommandManager &CCommandManager::GetManager() {
  return m_CommandManger;
}

void CCommandManager::ListToConsole() {
  ISimConsole &console = GetConsole();
  List::iterator it;
  List::iterator itEnd = m_HandlerList.end();
  for(it = m_HandlerList.begin( ); it != itEnd; it++) {
    console.Printf("%s\n", (*it)->GetName());
  }
}


syntax highlighted by Code2HTML, v. 0.9.1