Transition from QtCore to stdc++ / STL / boost
This looks like a pretty major change, but in reality, 80% of it is just renames of types and corresponding methods. The config parsing code has been completely replaced with a boost::program_options based version. This means that the config file format slightly changed (checkout the updated README). I still expect there to be bugs / unforseen events. Those should be fixed in follow up commits. Also, finally reverted back to using pkg-config to locate and link libruby. Yay for less hacks!
This commit is contained in:
parent
01529c5741
commit
2adf8ab265
40 changed files with 722 additions and 456 deletions
|
@ -24,19 +24,18 @@
|
|||
#include "sharedstate.h"
|
||||
#include "eventthread.h"
|
||||
#include "filesystem.h"
|
||||
#include "util.h"
|
||||
#include "debugwriter.h"
|
||||
|
||||
#include "./ruby/include/ruby.h"
|
||||
#include "./ruby/include/ruby/encoding.h"
|
||||
#include <ruby.h>
|
||||
#include <ruby/encoding.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <zlib.h>
|
||||
|
||||
#include <SDL_filesystem.h>
|
||||
|
||||
#include <QFile>
|
||||
#include <QByteArray>
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
extern const char module_rpg[];
|
||||
|
||||
static void mriBindingExecute();
|
||||
|
@ -102,9 +101,9 @@ static void mriBindingInit()
|
|||
}
|
||||
|
||||
static void
|
||||
showMsg(const QByteArray &msg)
|
||||
showMsg(const std::string &msg)
|
||||
{
|
||||
shState->eThread().showMessageBox(msg.constData());
|
||||
shState->eThread().showMessageBox(msg.c_str());
|
||||
}
|
||||
|
||||
RB_METHOD(mkxpPuts)
|
||||
|
@ -114,7 +113,7 @@ RB_METHOD(mkxpPuts)
|
|||
const char *str;
|
||||
rb_get_args(argc, argv, "z", &str RB_ARG_END);
|
||||
|
||||
qDebug() << str;
|
||||
Debug() << str;
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
@ -174,49 +173,45 @@ RB_METHOD(mriDataDirectory)
|
|||
|
||||
static void runCustomScript(const char *filename)
|
||||
{
|
||||
QFile scriptFile(filename);
|
||||
if (!scriptFile.open(QFile::ReadOnly))
|
||||
std::string scriptData("#encoding:utf-8\n");
|
||||
|
||||
if (!readFile(filename, scriptData))
|
||||
{
|
||||
showMsg(QByteArray("Unable to open '") + filename + "'");
|
||||
showMsg(std::string("Unable to open '") + filename + "'");
|
||||
return;
|
||||
}
|
||||
|
||||
QByteArray scriptData = scriptFile.readAll();
|
||||
scriptFile.close();
|
||||
|
||||
scriptData.prepend("#encoding:utf-8\n");
|
||||
|
||||
rb_eval_string_protect(scriptData.constData(), 0);
|
||||
rb_eval_string_protect(scriptData.c_str(), 0);
|
||||
}
|
||||
|
||||
VALUE kernelLoadDataInt(const char *filename);
|
||||
|
||||
struct Script
|
||||
{
|
||||
QByteArray name;
|
||||
QByteArray encData;
|
||||
std::string name;
|
||||
std::string encData;
|
||||
uint32_t unknown;
|
||||
|
||||
QByteArray decData;
|
||||
std::string decData;
|
||||
};
|
||||
|
||||
static void runRMXPScripts()
|
||||
{
|
||||
const QByteArray &scriptPack = shState->rtData().config.game.scripts;
|
||||
const std::string &scriptPack = shState->rtData().config.game.scripts;
|
||||
|
||||
if (scriptPack.isEmpty())
|
||||
if (scriptPack.empty())
|
||||
{
|
||||
showMsg("No game scripts specified (missing Game.ini?)");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!shState->fileSystem().exists(scriptPack.constData()))
|
||||
if (!shState->fileSystem().exists(scriptPack.c_str()))
|
||||
{
|
||||
showMsg("Unable to open '" + scriptPack + "'");
|
||||
return;
|
||||
}
|
||||
|
||||
VALUE scriptArray = kernelLoadDataInt(scriptPack.constData());
|
||||
VALUE scriptArray = kernelLoadDataInt(scriptPack.c_str());
|
||||
|
||||
if (rb_type(scriptArray) != RUBY_T_ARRAY)
|
||||
{
|
||||
|
@ -226,7 +221,7 @@ static void runRMXPScripts()
|
|||
|
||||
size_t scriptCount = RARRAY_LEN(scriptArray);
|
||||
|
||||
QByteArray decodeBuffer;
|
||||
std::string decodeBuffer;
|
||||
decodeBuffer.resize(0x1000);
|
||||
|
||||
std::vector<Script> encScripts(scriptCount);
|
||||
|
@ -246,7 +241,7 @@ static void runRMXPScripts()
|
|||
|
||||
Script &sc = encScripts[i];
|
||||
sc.name = RSTRING_PTR(scriptName);
|
||||
sc.encData = QByteArray(RSTRING_PTR(scriptString), RSTRING_LEN(scriptString));
|
||||
sc.encData = std::string(RSTRING_PTR(scriptString), RSTRING_LEN(scriptString));
|
||||
sc.unknown = FIX2UINT(scriptUnknown);
|
||||
}
|
||||
|
||||
|
@ -260,9 +255,9 @@ static void runRMXPScripts()
|
|||
while (true)
|
||||
{
|
||||
unsigned char *bufferPtr =
|
||||
reinterpret_cast<unsigned char*>(const_cast<char*>(decodeBuffer.constData()));
|
||||
reinterpret_cast<unsigned char*>(const_cast<char*>(decodeBuffer.c_str()));
|
||||
const unsigned char *sourcePtr =
|
||||
reinterpret_cast<const unsigned char*>(sc.encData.constData());
|
||||
reinterpret_cast<const unsigned char*>(sc.encData.c_str());
|
||||
|
||||
bufferLen = decodeBuffer.length();
|
||||
|
||||
|
@ -282,21 +277,25 @@ static void runRMXPScripts()
|
|||
static char buffer[256];
|
||||
/* FIXME: '%zu' apparently gcc only? */
|
||||
snprintf(buffer, sizeof(buffer), "Error decoding script %zu: '%s'",
|
||||
i, sc.name.constData());
|
||||
i, sc.name.c_str());
|
||||
|
||||
showMsg(buffer);
|
||||
break;
|
||||
}
|
||||
|
||||
sc.decData = QByteArray(decodeBuffer.constData(), bufferLen);
|
||||
sc.decData.prepend("#encoding:utf-8\n");
|
||||
/* Store encoding header + the decoded script
|
||||
* in 'sc.decData' */
|
||||
sc.decData = "#encoding:utf-8\n";
|
||||
size_t hdSize = sc.decData.size();
|
||||
sc.decData.resize(hdSize + bufferLen);
|
||||
memcpy(&sc.decData[hdSize], decodeBuffer.c_str(), bufferLen);
|
||||
|
||||
ruby_script(sc.name.constData());
|
||||
ruby_script(sc.name.c_str());
|
||||
|
||||
rb_gc_start();
|
||||
|
||||
/* Execute code */
|
||||
rb_eval_string_protect(sc.decData.constData(), 0);
|
||||
rb_eval_string_protect(sc.decData.c_str(), 0);
|
||||
|
||||
VALUE exc = rb_gv_get("$!");
|
||||
if (rb_type(exc) != RUBY_T_NIL)
|
||||
|
@ -314,23 +313,23 @@ static void mriBindingExecute()
|
|||
|
||||
mriBindingInit();
|
||||
|
||||
QByteArray &customScript = shState->rtData().config.customScript;
|
||||
if (!customScript.isEmpty())
|
||||
runCustomScript(customScript.constData());
|
||||
std::string &customScript = shState->rtData().config.customScript;
|
||||
if (!customScript.empty())
|
||||
runCustomScript(customScript.c_str());
|
||||
else
|
||||
runRMXPScripts();
|
||||
|
||||
VALUE exc = rb_gv_get("$!");
|
||||
if (rb_type(exc) != RUBY_T_NIL && !rb_eql(rb_obj_class(exc), rb_eSystemExit))
|
||||
{
|
||||
qDebug() << "Had exception:" << rb_class2name(rb_obj_class(exc));
|
||||
Debug() << "Had exception:" << rb_class2name(rb_obj_class(exc));
|
||||
VALUE bt = rb_funcall(exc, rb_intern("backtrace"), 0);
|
||||
rb_p(bt);
|
||||
VALUE msg = rb_funcall(exc, rb_intern("message"), 0);
|
||||
if (RSTRING_LEN(msg) < 256)
|
||||
showMsg(RSTRING_PTR(msg));
|
||||
else
|
||||
qDebug() << (RSTRING_PTR(msg));
|
||||
Debug() << (RSTRING_PTR(msg));
|
||||
}
|
||||
|
||||
ruby_cleanup(0);
|
||||
|
|
|
@ -26,8 +26,7 @@
|
|||
#include "util.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <QDebug>
|
||||
#include <assert.h>
|
||||
|
||||
void initType(rb_data_type_struct &type,
|
||||
const char *name,
|
||||
|
@ -244,7 +243,7 @@ rb_get_args(int argc, VALUE *argv, const char *format, ...)
|
|||
}
|
||||
}
|
||||
|
||||
#ifndef QT_NO_DEBUG
|
||||
#ifndef NDEBUG
|
||||
|
||||
/* Pop remaining arg pointers off
|
||||
* the stack to check for RB_ARG_END */
|
||||
|
@ -288,8 +287,8 @@ rb_get_args(int argc, VALUE *argv, const char *format, ...)
|
|||
|
||||
/* Verify correct termination */
|
||||
void *argEnd = va_arg(ap, void*);
|
||||
Q_UNUSED(argEnd);
|
||||
Q_ASSERT(argEnd == RB_ARG_END_VAL);
|
||||
(void) argEnd;
|
||||
assert(argEnd == RB_ARG_END_VAL);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#ifndef BINDING_UTIL_H
|
||||
#define BINDING_UTIL_H
|
||||
|
||||
#include "./ruby/ruby.h"
|
||||
#include <ruby.h>
|
||||
|
||||
enum RbException
|
||||
{
|
||||
|
@ -134,7 +134,7 @@ int
|
|||
rb_get_args(int argc, VALUE *argv, const char *format, ...);
|
||||
|
||||
/* Always terminate 'rb_get_args' with this */
|
||||
#ifndef QT_NO_DEBUG
|
||||
#ifndef NDEBUG
|
||||
# define RB_ARG_END_VAL ((void*) -1)
|
||||
# define RB_ARG_END ,RB_ARG_END_VAL
|
||||
#else
|
||||
|
|
|
@ -26,8 +26,6 @@
|
|||
#include "binding-util.h"
|
||||
#include "binding-types.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
#define DISP_CLASS_NAME "bitmap"
|
||||
|
||||
DEF_TYPE(Bitmap);
|
||||
|
|
|
@ -23,8 +23,6 @@
|
|||
#include "binding-util.h"
|
||||
#include "serializable-binding.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
DEF_TYPE(Color);
|
||||
DEF_TYPE(Tone);
|
||||
DEF_TYPE(Rect);
|
||||
|
|
|
@ -27,8 +27,6 @@
|
|||
#include "ruby/encoding.h"
|
||||
#include "ruby/intern.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
DEF_TYPE(FileInt);
|
||||
|
||||
static VALUE
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue