mirror of
git://git.savannah.nongnu.org/eliot.git
synced 2024-12-25 21:59:30 +01:00
Various fixes for problems detected by Coverity.
Most of them where not actual problems, though.
This commit is contained in:
parent
c7831a28bd
commit
02249c214e
8 changed files with 162 additions and 86 deletions
|
@ -60,6 +60,8 @@
|
||||||
# define _(String) String
|
# define _(String) String
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MAX_STRING_LENGTH 200
|
||||||
|
|
||||||
// Useful shortcut
|
// Useful shortcut
|
||||||
#define fmt(a) boost::format(a)
|
#define fmt(a) boost::format(a)
|
||||||
|
|
||||||
|
@ -76,6 +78,15 @@ CompDic::CompDic()
|
||||||
m_headerInfo.edgesused = 1;
|
m_headerInfo.edgesused = 1;
|
||||||
m_headerInfo.nodessaved = 0;
|
m_headerInfo.nodessaved = 0;
|
||||||
m_headerInfo.edgessaved = 0;
|
m_headerInfo.edgessaved = 0;
|
||||||
|
|
||||||
|
m_stringBuf = new wchar_t[MAX_STRING_LENGTH];
|
||||||
|
m_endString = m_stringBuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CompDic::~CompDic()
|
||||||
|
{
|
||||||
|
delete[] m_stringBuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ class CompDic
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CompDic();
|
CompDic();
|
||||||
|
~CompDic();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define a new letter. The letter must be alphabetic (i.e. iswalpha()
|
* Define a new letter. The letter must be alphabetic (i.e. iswalpha()
|
||||||
|
@ -93,12 +94,10 @@ private:
|
||||||
|
|
||||||
HashMap m_hashMap;
|
HashMap m_hashMap;
|
||||||
|
|
||||||
#define MAX_STRING_LENGTH 200
|
|
||||||
|
|
||||||
/// Space for the current string
|
/// Space for the current string
|
||||||
wchar_t m_stringBuf[MAX_STRING_LENGTH];
|
wchar_t *m_stringBuf;
|
||||||
/// Point to the end of the string
|
/// Point to the end of the string
|
||||||
wchar_t* m_endString;
|
wchar_t *m_endString;
|
||||||
#ifdef CHECK_RECURSION
|
#ifdef CHECK_RECURSION
|
||||||
map<int, vector<DicEdge> > m_mapForDepth;
|
map<int, vector<DicEdge> > m_mapForDepth;
|
||||||
int m_currentRec;
|
int m_currentRec;
|
||||||
|
|
|
@ -260,10 +260,14 @@ int main(int argc, char* argv[])
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
catch (const BaseException &e)
|
||||||
|
{
|
||||||
|
cerr << "Exception caught: " << e.what() << "\n" << e.getStackTrace();
|
||||||
|
}
|
||||||
catch (std::exception &e)
|
catch (std::exception &e)
|
||||||
{
|
{
|
||||||
cerr << fmt(_("Exception caught: %1%")) % e.what() << endl;
|
cerr << "Exception caught: " << e.what() << endl;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include "dic.h"
|
#include "dic.h"
|
||||||
#include "regexp.h"
|
#include "regexp.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
using boost::format;
|
using boost::format;
|
||||||
|
|
||||||
|
@ -68,24 +69,30 @@ void Node::traverse(int &p, int &n, int ptl[])
|
||||||
m_DP = 1 << (m_position - 1);
|
m_DP = 1 << (m_position - 1);
|
||||||
break;
|
break;
|
||||||
case NODE_OR:
|
case NODE_OR:
|
||||||
|
ASSERT(m_fg, "The left child node should not be NULL");
|
||||||
|
ASSERT(m_fd, "The right child node should not be NULL");
|
||||||
m_position = 0;
|
m_position = 0;
|
||||||
m_annulable = m_fg->m_annulable || m_fd->m_annulable;
|
m_annulable = m_fg->m_annulable || m_fd->m_annulable;
|
||||||
m_PP = m_fg->m_PP | m_fd->m_PP;
|
m_PP = m_fg->m_PP | m_fd->m_PP;
|
||||||
m_DP = m_fg->m_DP | m_fd->m_DP;
|
m_DP = m_fg->m_DP | m_fd->m_DP;
|
||||||
break;
|
break;
|
||||||
case NODE_AND:
|
case NODE_AND:
|
||||||
|
ASSERT(m_fg, "The left child node should not be NULL");
|
||||||
|
ASSERT(m_fd, "The right child node should not be NULL");
|
||||||
m_position = 0;
|
m_position = 0;
|
||||||
m_annulable = m_fg->m_annulable && m_fd->m_annulable;
|
m_annulable = m_fg->m_annulable && m_fd->m_annulable;
|
||||||
m_PP = (m_fg->m_annulable) ? (m_fg->m_PP | m_fd->m_PP) : m_fg->m_PP;
|
m_PP = (m_fg->m_annulable) ? (m_fg->m_PP | m_fd->m_PP) : m_fg->m_PP;
|
||||||
m_DP = (m_fd->m_annulable) ? (m_fg->m_DP | m_fd->m_DP) : m_fd->m_DP;
|
m_DP = (m_fd->m_annulable) ? (m_fg->m_DP | m_fd->m_DP) : m_fd->m_DP;
|
||||||
break;
|
break;
|
||||||
case NODE_PLUS:
|
case NODE_PLUS:
|
||||||
|
ASSERT(m_fg, "The left child node should not be NULL");
|
||||||
m_position = 0;
|
m_position = 0;
|
||||||
m_annulable = false;
|
m_annulable = false;
|
||||||
m_PP = m_fg->m_PP;
|
m_PP = m_fg->m_PP;
|
||||||
m_DP = m_fg->m_DP;
|
m_DP = m_fg->m_DP;
|
||||||
break;
|
break;
|
||||||
case NODE_STAR:
|
case NODE_STAR:
|
||||||
|
ASSERT(m_fg, "The left child node should not be NULL");
|
||||||
m_position = 0;
|
m_position = 0;
|
||||||
m_annulable = true;
|
m_annulable = true;
|
||||||
m_PP = m_fg->m_PP;
|
m_PP = m_fg->m_PP;
|
||||||
|
@ -109,6 +116,8 @@ void Node::nextPos(uint64_t PS[])
|
||||||
/* \forall p \in DP(left) */
|
/* \forall p \in DP(left) */
|
||||||
/* PS[p] = PS[p] \cup PP(right) */
|
/* PS[p] = PS[p] \cup PP(right) */
|
||||||
/************************************/
|
/************************************/
|
||||||
|
ASSERT(m_fg, "The left child node should not be NULL");
|
||||||
|
ASSERT(m_fd, "The right child node should not be NULL");
|
||||||
for (uint32_t pos = 1; pos <= PS[0]; pos++)
|
for (uint32_t pos = 1; pos <= PS[0]; pos++)
|
||||||
{
|
{
|
||||||
if (m_fg->m_DP & (1 << (pos-1)))
|
if (m_fg->m_DP & (1 << (pos-1)))
|
||||||
|
|
23
qt/main.cpp
23
qt/main.cpp
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
@ -162,9 +163,25 @@ int main(int argc, char **argv)
|
||||||
app.installTranslator(&translator);
|
app.installTranslator(&translator);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MainWindow qmain;
|
try
|
||||||
qmain.show();
|
{
|
||||||
return app.exec();
|
MainWindow qmain;
|
||||||
|
qmain.show();
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
|
catch (const BaseException &e)
|
||||||
|
{
|
||||||
|
cerr << "Exception caught: " << e.what() << "\n" << e.getStackTrace();
|
||||||
|
}
|
||||||
|
catch (const std::exception &e)
|
||||||
|
{
|
||||||
|
cerr << "Exception caught: " << e.what();
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
cerr << "Unknown exception caught";
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_EXECINFO_H
|
#ifdef HAVE_EXECINFO_H
|
||||||
|
|
|
@ -188,7 +188,7 @@ MainWindow::MainWindow(QWidget *iParent)
|
||||||
{
|
{
|
||||||
m_dic = new Dictionary(lfq(dicPath));
|
m_dic = new Dictionary(lfq(dicPath));
|
||||||
}
|
}
|
||||||
catch (DicException &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
displayErrorMsg(_q("Cannot load dictionary '%1' indicated in the "
|
displayErrorMsg(_q("Cannot load dictionary '%1' indicated in the "
|
||||||
"preferences.\nReason: %2").arg(dicPath).arg(e.what()));
|
"preferences.\nReason: %2").arg(dicPath).arg(e.what()));
|
||||||
|
@ -272,7 +272,7 @@ void MainWindow::refresh()
|
||||||
{
|
{
|
||||||
m_game->save(m_autoSaveGame);
|
m_game->save(m_autoSaveGame);
|
||||||
}
|
}
|
||||||
catch (std::exception &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Error during auto-save: " << e.what());
|
LOG_ERROR("Error during auto-save: " << e.what());
|
||||||
displayErrorMsg(_q("Error during auto-save of the game: %1").arg(e.what()));
|
displayErrorMsg(_q("Error during auto-save of the game: %1").arg(e.what()));
|
||||||
|
@ -615,7 +615,7 @@ void MainWindow::changeDictionary(QString iFileName)
|
||||||
QSettings qs;
|
QSettings qs;
|
||||||
qs.setValue(PrefsDialog::kINTF_DIC_PATH, iFileName);
|
qs.setValue(PrefsDialog::kINTF_DIC_PATH, iFileName);
|
||||||
}
|
}
|
||||||
catch (std::exception &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
displayErrorMsg(e.what());
|
displayErrorMsg(e.what());
|
||||||
}
|
}
|
||||||
|
@ -829,7 +829,7 @@ void MainWindow::loadGame(QString fileName)
|
||||||
destroyCurrentGame();
|
destroyCurrentGame();
|
||||||
m_game = tmpGame;
|
m_game = tmpGame;
|
||||||
}
|
}
|
||||||
catch (std::exception &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
displayErrorMsg(_q("Error while loading the game:\n") + e.what());
|
displayErrorMsg(_q("Error while loading the game:\n") + e.what());
|
||||||
return;
|
return;
|
||||||
|
@ -856,7 +856,7 @@ void MainWindow::onGameSaveAs()
|
||||||
m_game->save(lfq(fileName));
|
m_game->save(lfq(fileName));
|
||||||
displayInfoMsg(_q("Game saved"));
|
displayInfoMsg(_q("Game saved"));
|
||||||
}
|
}
|
||||||
catch (std::exception &e)
|
catch (const std::exception &e)
|
||||||
{
|
{
|
||||||
displayErrorMsg(_q("Error saving game: %1").arg(e.what()));
|
displayErrorMsg(_q("Error saving game: %1").arg(e.what()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,9 +31,11 @@
|
||||||
#include <QtGui/QLayout>
|
#include <QtGui/QLayout>
|
||||||
#include <QtCore/QSettings>
|
#include <QtCore/QSettings>
|
||||||
|
|
||||||
#include "qtcommon.h"
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "qtcommon.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,11 +62,13 @@ QString qfw(const wstring &wstr)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void logFailedTest(const string &testName)
|
static void logFailedTest(const string &testName, bool & oFailure)
|
||||||
{
|
{
|
||||||
cerr << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
|
cerr << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
|
||||||
cerr << "@@@@@@@ Test " + testName + " failed! @@@@@@@" << endl;
|
cerr << "@@@@@@@ Test " + testName + " failed! @@@@@@@" << endl;
|
||||||
cerr << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl << endl;
|
cerr << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl << endl;
|
||||||
|
|
||||||
|
oFailure = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -72,47 +76,51 @@ void QtCommon::CheckConversions()
|
||||||
{
|
{
|
||||||
string s = "abcdéöùßĿ";
|
string s = "abcdéöùßĿ";
|
||||||
|
|
||||||
|
bool failure = false;
|
||||||
|
|
||||||
// Check identities
|
// Check identities
|
||||||
if (s != lfw(wfl(s)))
|
if (s != lfw(wfl(s)))
|
||||||
logFailedTest("1");
|
logFailedTest("1", failure);
|
||||||
if (s != lfu(ufl(s)))
|
if (s != lfu(ufl(s)))
|
||||||
logFailedTest("2");
|
logFailedTest("2", failure);
|
||||||
if (s != lfq(qfl(s)))
|
if (s != lfq(qfl(s)))
|
||||||
logFailedTest("3");
|
logFailedTest("3", failure);
|
||||||
|
|
||||||
wstring w = wfl(s);
|
wstring w = wfl(s);
|
||||||
if (w != wfl(lfw(w)))
|
if (w != wfl(lfw(w)))
|
||||||
logFailedTest("4");
|
logFailedTest("4", failure);
|
||||||
if (w != wfu(ufw(w)))
|
if (w != wfu(ufw(w)))
|
||||||
logFailedTest("5");
|
logFailedTest("5", failure);
|
||||||
if (w != wfq(qfw(w)))
|
if (w != wfq(qfw(w)))
|
||||||
logFailedTest("6");
|
logFailedTest("6", failure);
|
||||||
|
|
||||||
QString q = qfl(s);
|
QString q = qfl(s);
|
||||||
if (q != qfl(lfq(q)))
|
if (q != qfl(lfq(q)))
|
||||||
logFailedTest("7");
|
logFailedTest("7", failure);
|
||||||
if (q != qfu(ufq(q)))
|
if (q != qfu(ufq(q)))
|
||||||
logFailedTest("8");
|
logFailedTest("8", failure);
|
||||||
if (q != qfw(wfq(q)))
|
if (q != qfw(wfq(q)))
|
||||||
logFailedTest("9");
|
logFailedTest("9", failure);
|
||||||
|
|
||||||
// Check some cycles
|
// Check some cycles
|
||||||
if (s != lfu(ufw(wfl(s))))
|
if (s != lfu(ufw(wfl(s))))
|
||||||
logFailedTest("10");
|
logFailedTest("10", failure);
|
||||||
if (s != lfw(wfu(ufl(s))))
|
if (s != lfw(wfu(ufl(s))))
|
||||||
logFailedTest("11");
|
logFailedTest("11", failure);
|
||||||
if (s != lfq(qfw(wfl(s))))
|
if (s != lfq(qfw(wfl(s))))
|
||||||
logFailedTest("12");
|
logFailedTest("12", failure);
|
||||||
if (s != lfw(wfq(qfl(s))))
|
if (s != lfw(wfq(qfl(s))))
|
||||||
logFailedTest("13");
|
logFailedTest("13", failure);
|
||||||
if (s != lfu(ufw(wfq(qfl(s)))))
|
if (s != lfu(ufw(wfq(qfl(s)))))
|
||||||
logFailedTest("14");
|
logFailedTest("14", failure);
|
||||||
if (s != lfq(qfw(wfu(ufl(s)))))
|
if (s != lfq(qfw(wfu(ufl(s)))))
|
||||||
logFailedTest("15");
|
logFailedTest("15", failure);
|
||||||
if (s != lfu(ufq(qfw(wfl(s)))))
|
if (s != lfu(ufq(qfw(wfl(s)))))
|
||||||
logFailedTest("16");
|
logFailedTest("16", failure);
|
||||||
if (s != lfw(wfq(qfu(ufl(s)))))
|
if (s != lfw(wfq(qfu(ufl(s)))))
|
||||||
logFailedTest("17");
|
logFailedTest("17", failure);
|
||||||
|
|
||||||
|
ASSERT(!failure, "Some string conversions failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <cstring> // For strlen
|
#include <cstring> // For strlen
|
||||||
#include <cwctype> // For iswalnum
|
#include <cwctype> // For iswalnum
|
||||||
|
@ -1160,64 +1161,91 @@ int main(int argc, char ** argv)
|
||||||
|
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
|
|
||||||
Game *realGame = GameFactory::Instance()->createFromCmdLine(argc, argv);
|
int retCode = 1;
|
||||||
if (realGame == NULL)
|
try
|
||||||
{
|
{
|
||||||
GameFactory::Destroy();
|
Game *realGame = GameFactory::Instance()->createFromCmdLine(argc, argv);
|
||||||
return 1;
|
if (realGame == NULL)
|
||||||
}
|
|
||||||
PublicGame *game = new PublicGame(*realGame);
|
|
||||||
|
|
||||||
game->start();
|
|
||||||
|
|
||||||
// Initialize the ncurses library
|
|
||||||
WINDOW *wBoard = initscr();
|
|
||||||
keypad(wBoard, true);
|
|
||||||
// Take input chars one at a time
|
|
||||||
cbreak();
|
|
||||||
// Do not do NL -> NL/CR
|
|
||||||
nonl();
|
|
||||||
// Hide the cursor
|
|
||||||
curs_set(0);
|
|
||||||
|
|
||||||
if (has_colors())
|
|
||||||
{
|
|
||||||
start_color();
|
|
||||||
|
|
||||||
// Simple color assignment
|
|
||||||
init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK);
|
|
||||||
init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK);
|
|
||||||
init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
|
|
||||||
init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_RED);
|
|
||||||
|
|
||||||
init_pair(COLOR_BLUE, COLOR_BLACK, COLOR_BLUE);
|
|
||||||
init_pair(COLOR_CYAN, COLOR_BLACK, COLOR_CYAN);
|
|
||||||
init_pair(COLOR_MAGENTA, COLOR_BLACK, COLOR_MAGENTA);
|
|
||||||
init_pair(COLOR_RED, COLOR_BLACK, COLOR_RED);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do not echo
|
|
||||||
noecho();
|
|
||||||
|
|
||||||
// mainIntf will take care of destroying game for us
|
|
||||||
CursesIntf mainIntf(wBoard, *game);
|
|
||||||
mainIntf.redraw(wBoard);
|
|
||||||
|
|
||||||
while (!mainIntf.isDying())
|
|
||||||
{
|
|
||||||
int c = getch();
|
|
||||||
if (mainIntf.handleKey(c) == 1)
|
|
||||||
{
|
{
|
||||||
mainIntf.redraw(wBoard);
|
GameFactory::Destroy();
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
PublicGame *game = new PublicGame(*realGame);
|
||||||
|
|
||||||
|
game->start();
|
||||||
|
|
||||||
|
// Initialize the ncurses library
|
||||||
|
WINDOW *wBoard = initscr();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
keypad(wBoard, true);
|
||||||
|
// Take input chars one at a time
|
||||||
|
cbreak();
|
||||||
|
// Do not do NL -> NL/CR
|
||||||
|
nonl();
|
||||||
|
// Hide the cursor
|
||||||
|
curs_set(0);
|
||||||
|
|
||||||
|
if (has_colors())
|
||||||
|
{
|
||||||
|
start_color();
|
||||||
|
|
||||||
|
// Simple color assignment
|
||||||
|
init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK);
|
||||||
|
init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK);
|
||||||
|
init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
|
||||||
|
init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_RED);
|
||||||
|
|
||||||
|
init_pair(COLOR_BLUE, COLOR_BLACK, COLOR_BLUE);
|
||||||
|
init_pair(COLOR_CYAN, COLOR_BLACK, COLOR_CYAN);
|
||||||
|
init_pair(COLOR_MAGENTA, COLOR_BLACK, COLOR_MAGENTA);
|
||||||
|
init_pair(COLOR_RED, COLOR_BLACK, COLOR_RED);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do not echo
|
||||||
|
noecho();
|
||||||
|
|
||||||
|
// mainIntf will take care of destroying game for us
|
||||||
|
CursesIntf mainIntf(wBoard, *game);
|
||||||
|
mainIntf.redraw(wBoard);
|
||||||
|
|
||||||
|
while (!mainIntf.isDying())
|
||||||
|
{
|
||||||
|
int c = getch();
|
||||||
|
if (mainIntf.handleKey(c) == 1)
|
||||||
|
{
|
||||||
|
mainIntf.redraw(wBoard);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
// Clean up
|
||||||
|
delwin(wBoard);
|
||||||
|
|
||||||
|
// Exit the ncurses library
|
||||||
|
endwin();
|
||||||
|
|
||||||
|
// Rethrow the exception
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
retCode = 0;
|
||||||
|
}
|
||||||
|
catch (const BaseException &e)
|
||||||
|
{
|
||||||
|
cerr << "Exception caught: " << e.what() << "\n" << e.getStackTrace();
|
||||||
|
}
|
||||||
|
catch (const std::exception &e)
|
||||||
|
{
|
||||||
|
cerr << "Exception caught: " << e.what();
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
cerr << "Unknown exception caught";
|
||||||
}
|
}
|
||||||
|
|
||||||
delwin(wBoard);
|
|
||||||
|
|
||||||
// Exit the ncurses library
|
|
||||||
endwin();
|
|
||||||
|
|
||||||
GameFactory::Destroy();
|
GameFactory::Destroy();
|
||||||
|
|
||||||
return 0;
|
return retCode;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue