colobot/test/cbot/CBot_console/CBotConsole.cpp

176 lines
3.3 KiB
C++

/*
* CBotConsole.cpp
*
* Created on: 08-08-2012
* Author: michal
*/
#include "CBotConsole.h"
#include "CClass.h"
#include <ctime>
#include <iostream>
CBotConsole::CBotConsole() {
// TODO Auto-generated constructor stub
m_pProg = NULL;
m_threadinfo.m_bRun = false;
m_code = 0;
}
CBotConsole::~CBotConsole() {
// TODO Auto-generated destructor stub
}
uint ThreadProc(ThreadInfo *info)
{
time_t t0,t1;
time(&t0);
int Cpt = 0;
info->m_pProg->Start("LaCommande");
while ( !info->m_bStop && !info->m_pProg->Run() )
{
#if 0
const char* FunctionName;
const char* FN;
int start, end;
info->m_pProg->GetRunPos(FunctionName, start, end);
if ( FunctionName != NULL )
{
info->m_pEditx->SetSel(start, end);
char buffer[200];
sprintf( buffer, "step %s, %d, %d",FunctionName, start, end);
AfxMessageBox( buffer );
int level = 0;
do
{
CBotVar* t = info->m_pProg->GetStackVars(FN, level--);
if ( FN != FunctionName ) break;
if ( t != NULL )
{
CString s ;
while ( t != NULL )
{
if (s.IsEmpty()) s+= "Stack -> ";
else s+= " , ";
s += t->GetValString();
t = t->GetNext();
}
AfxMessageBox(s);
}
} while (TRUE);
}
#endif
Cpt++;
if ( Cpt%50 == 0 ) std::cout << ".";
}
if ( info->m_bStop )
{
std::cout << "\nInterrupt\n";
}
else if (info->m_pProg->GetError() == 0)
{
time(&t1);
double prog_time = difftime(t0,t1);
char buffer[200];
sprintf( buffer, "\nExecution terminated in %f seconds.\nInterrupted %d time(s).\n",
prog_time, Cpt);
std::cout << buffer;
}
// info->m_pWndMessage->SendMessage(WM_ENDPROG, 0, 0) ;
return 0 ;
}
long CBotConsole::EndProg()
{
m_threadinfo.m_bRun = false;
if (m_pProg->GetError(m_code, m_start, m_end))
{
CBotString TextError;
TextError = CBotProgram::GetErrorText(m_code);
std::cout << TextError;
return 1;
}
delete m_pProg;
m_pProg = NULL;
return 0 ;
}
void CBotConsole::OnOK()
{
m_code = 0;
std::string Commande;
std::cin >> Commande;
std::string s = "void LaCommande() { " + Commande + " ;}";
m_pProg = new CBotProgram();
CBotStringArray liste;
m_pProg->Compile(s.c_str(), liste);
int err, start, end;
if ( m_pProg->GetError(err, start, end) )
{
CBotString TextError;
TextError = CBotProgram::GetErrorText(err);
std::cout << TextError;
return;
}
std::cout << "\n" + Commande + " ->\n";
// m_Edit2.SetWindowText("");
// m_Edit1.SetFocus();
// m_Edit2.EnableWindow(FALSE);
// m_cOK.EnableWindow(FALSE);
// lance un processus paralèle pour l'exécution
// m_threadinfo.m_pWndMessage = this ;
// m_threadinfo.m_pEdit1 = &m_Edit1;
// m_threadinfo.m_pEditx = m_pEditx;
m_threadinfo.m_pProg = m_pProg;
m_threadinfo.m_bStop = false;
m_threadinfo.m_bRun = true;
ThreadProc(&m_threadinfo);
// here program starts
// AfxBeginThread((AFX_THREADPROC)ThreadProc, &m_threadinfo) ;
}
void CBotConsole::OnCancel()
{
m_threadinfo.m_bStop = true ;
}
bool CBotConsole::OnInitDialog()
{
// CDialog::OnInitDialog();
std::cout << "Following functions are availible:\n";
for ( int i = 0; i < m_pListe->GetSize(); i++ )
{
CBotString x = (*m_pListe)[i] + CBotString("\n");
std::cout << x;
}
std::cout << "Enter a command:\n";
return true; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}