fix: 修复增强预处理器和缺失的字符串函数

This commit is contained in:
寂静的羽夏 2025-05-06 13:44:59 +08:00
parent 960de3afb6
commit b49523e952
7 changed files with 194 additions and 85 deletions

View File

@ -8,7 +8,7 @@ set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(PROJECT_VERSION "2.2.2") set(PROJECT_VERSION "2.2.3")
find_package( find_package(
QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Network Concurrent QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Network Concurrent
@ -40,7 +40,6 @@ add_definitions(-DWINGHEX_VERSION="${PROJECT_VERSION}"
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/WINGHEX_VERSION" ${PROJECT_VERSION}) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/WINGHEX_VERSION" ${PROJECT_VERSION})
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/QT_VERSION" ${QT_VERSION_MAJOR}) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/QT_VERSION" ${QT_VERSION_MAJOR})
if(WIN32) if(WIN32)
find_package(QT NAMES Qt6 Qt5 REQUIRED AxContainer) find_package(QT NAMES Qt6 Qt5 REQUIRED AxContainer)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED AxContainer) find_package(Qt${QT_VERSION_MAJOR} REQUIRED AxContainer)

View File

@ -2678,13 +2678,13 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="816"/> <location filename="../../src/class/aspreprocesser.cpp" line="813"/>
<source>Failed to open script file </source> <source>Failed to open script file </source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="651"/> <location filename="../../src/class/aspreprocesser.cpp" line="648"/>
<location filename="../../src/class/aspreprocesser.cpp" line="699"/> <location filename="../../src/class/aspreprocesser.cpp" line="694"/>
<source>Invalid file name for #include; it contains a line-break: </source> <source>Invalid file name for #include; it contains a line-break: </source>
<translation>#include </translation> <translation>#include </translation>
</message> </message>
@ -2699,55 +2699,54 @@
<translation>ifdef </translation> <translation>ifdef </translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="279"/> <location filename="../../src/class/aspreprocesser.cpp" line="369"/>
<location filename="../../src/class/aspreprocesser.cpp" line="378"/> <location filename="../../src/class/aspreprocesser.cpp" line="384"/>
<location filename="../../src/class/aspreprocesser.cpp" line="393"/> <location filename="../../src/class/aspreprocesser.cpp" line="445"/>
<location filename="../../src/class/aspreprocesser.cpp" line="454"/> <location filename="../../src/class/aspreprocesser.cpp" line="481"/>
<location filename="../../src/class/aspreprocesser.cpp" line="490"/> <location filename="../../src/class/aspreprocesser.cpp" line="517"/>
<location filename="../../src/class/aspreprocesser.cpp" line="526"/> <location filename="../../src/class/aspreprocesser.cpp" line="557"/>
<location filename="../../src/class/aspreprocesser.cpp" line="566"/>
<source>UnexceptedToken</source> <source>UnexceptedToken</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="315"/> <location filename="../../src/class/aspreprocesser.cpp" line="306"/>
<source>CalIfFailed</source> <source>CalIfFailed</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="412"/> <location filename="../../src/class/aspreprocesser.cpp" line="403"/>
<location filename="../../src/class/aspreprocesser.cpp" line="461"/> <location filename="../../src/class/aspreprocesser.cpp" line="452"/>
<source>InvalidDef</source> <source>InvalidDef</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="439"/> <location filename="../../src/class/aspreprocesser.cpp" line="430"/>
<source>ReservedMarcoType</source> <source>ReservedMarcoType</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="445"/> <location filename="../../src/class/aspreprocesser.cpp" line="436"/>
<source>MarcoNotFound:</source> <source>MarcoNotFound:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="474"/> <location filename="../../src/class/aspreprocesser.cpp" line="465"/>
<location filename="../../src/class/aspreprocesser.cpp" line="514"/> <location filename="../../src/class/aspreprocesser.cpp" line="505"/>
<source>NoMatchingIf</source> <source>NoMatchingIf</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="497"/> <location filename="../../src/class/aspreprocesser.cpp" line="488"/>
<source>DupElseDef</source> <source>DupElseDef</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="718"/> <location filename="../../src/class/aspreprocesser.cpp" line="714"/>
<source>Invalid file name for #include; it contains a line-break or unpaired symbol</source> <source>Invalid file name for #include; it contains a line-break or unpaired symbol</source>
<translation>#include </translation> <translation>#include </translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="750"/> <location filename="../../src/class/aspreprocesser.cpp" line="747"/>
<source>Invalid #pragma directive</source> <source>Invalid #pragma directive</source>
<translation>#pragma </translation> <translation>#pragma </translation>
</message> </message>
@ -2849,7 +2848,7 @@
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="473"/> <location filename="../../src/class/scriptmachine.cpp" line="473"/>
<location filename="../../src/class/scriptmachine.cpp" line="2107"/> <location filename="../../src/class/scriptmachine.cpp" line="2168"/>
<source>Code must be exec in the main thread</source> <source>Code must be exec in the main thread</source>
<translation>线</translation> <translation>线</translation>
</message> </message>
@ -2860,8 +2859,8 @@
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="528"/> <location filename="../../src/class/scriptmachine.cpp" line="528"/>
<location filename="../../src/class/scriptmachine.cpp" line="2156"/> <location filename="../../src/class/scriptmachine.cpp" line="2217"/>
<location filename="../../src/class/scriptmachine.cpp" line="2272"/> <location filename="../../src/class/scriptmachine.cpp" line="2333"/>
<source>Script failed to build</source> <source>Script failed to build</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2882,19 +2881,19 @@
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="615"/> <location filename="../../src/class/scriptmachine.cpp" line="615"/>
<location filename="../../src/class/scriptmachine.cpp" line="2206"/> <location filename="../../src/class/scriptmachine.cpp" line="2267"/>
<source>The script failed with an exception</source> <source>The script failed with an exception</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="624"/> <location filename="../../src/class/scriptmachine.cpp" line="624"/>
<location filename="../../src/class/scriptmachine.cpp" line="2215"/> <location filename="../../src/class/scriptmachine.cpp" line="2276"/>
<source>The script was aborted</source> <source>The script was aborted</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="632"/> <location filename="../../src/class/scriptmachine.cpp" line="632"/>
<location filename="../../src/class/scriptmachine.cpp" line="2223"/> <location filename="../../src/class/scriptmachine.cpp" line="2284"/>
<source>The script terminated unexpectedly</source> <source>The script terminated unexpectedly</source>
<translation>退</translation> <translation>退</translation>
</message> </message>
@ -4405,18 +4404,18 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="2063"/> <location filename="../../src/class/scriptmachine.cpp" line="2103"/>
<location filename="../../src/class/scriptmachine.cpp" line="2075"/> <location filename="../../src/class/scriptmachine.cpp" line="2115"/>
<source>Assert failed</source> <source>Assert failed</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="2254"/> <location filename="../../src/class/scriptmachine.cpp" line="2315"/>
<source>BadDecl:</source> <source>BadDecl:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="2263"/> <location filename="../../src/class/scriptmachine.cpp" line="2324"/>
<source>GlobalBadDecl</source> <source>GlobalBadDecl</source>
<translation></translation> <translation></translation>
</message> </message>

View File

@ -2678,13 +2678,13 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="816"/> <location filename="../../src/class/aspreprocesser.cpp" line="813"/>
<source>Failed to open script file </source> <source>Failed to open script file </source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="651"/> <location filename="../../src/class/aspreprocesser.cpp" line="648"/>
<location filename="../../src/class/aspreprocesser.cpp" line="699"/> <location filename="../../src/class/aspreprocesser.cpp" line="694"/>
<source>Invalid file name for #include; it contains a line-break: </source> <source>Invalid file name for #include; it contains a line-break: </source>
<translation>#include </translation> <translation>#include </translation>
</message> </message>
@ -2699,55 +2699,54 @@
<translation>ifdef </translation> <translation>ifdef </translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="279"/> <location filename="../../src/class/aspreprocesser.cpp" line="369"/>
<location filename="../../src/class/aspreprocesser.cpp" line="378"/> <location filename="../../src/class/aspreprocesser.cpp" line="384"/>
<location filename="../../src/class/aspreprocesser.cpp" line="393"/> <location filename="../../src/class/aspreprocesser.cpp" line="445"/>
<location filename="../../src/class/aspreprocesser.cpp" line="454"/> <location filename="../../src/class/aspreprocesser.cpp" line="481"/>
<location filename="../../src/class/aspreprocesser.cpp" line="490"/> <location filename="../../src/class/aspreprocesser.cpp" line="517"/>
<location filename="../../src/class/aspreprocesser.cpp" line="526"/> <location filename="../../src/class/aspreprocesser.cpp" line="557"/>
<location filename="../../src/class/aspreprocesser.cpp" line="566"/>
<source>UnexceptedToken</source> <source>UnexceptedToken</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="315"/> <location filename="../../src/class/aspreprocesser.cpp" line="306"/>
<source>CalIfFailed</source> <source>CalIfFailed</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="412"/> <location filename="../../src/class/aspreprocesser.cpp" line="403"/>
<location filename="../../src/class/aspreprocesser.cpp" line="461"/> <location filename="../../src/class/aspreprocesser.cpp" line="452"/>
<source>InvalidDef</source> <source>InvalidDef</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="439"/> <location filename="../../src/class/aspreprocesser.cpp" line="430"/>
<source>ReservedMarcoType</source> <source>ReservedMarcoType</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="445"/> <location filename="../../src/class/aspreprocesser.cpp" line="436"/>
<source>MarcoNotFound:</source> <source>MarcoNotFound:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="474"/> <location filename="../../src/class/aspreprocesser.cpp" line="465"/>
<location filename="../../src/class/aspreprocesser.cpp" line="514"/> <location filename="../../src/class/aspreprocesser.cpp" line="505"/>
<source>NoMatchingIf</source> <source>NoMatchingIf</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="497"/> <location filename="../../src/class/aspreprocesser.cpp" line="488"/>
<source>DupElseDef</source> <source>DupElseDef</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="718"/> <location filename="../../src/class/aspreprocesser.cpp" line="714"/>
<source>Invalid file name for #include; it contains a line-break or unpaired symbol</source> <source>Invalid file name for #include; it contains a line-break or unpaired symbol</source>
<translation>#include </translation> <translation>#include </translation>
</message> </message>
<message> <message>
<location filename="../../src/class/aspreprocesser.cpp" line="750"/> <location filename="../../src/class/aspreprocesser.cpp" line="747"/>
<source>Invalid #pragma directive</source> <source>Invalid #pragma directive</source>
<translation>#pragma </translation> <translation>#pragma </translation>
</message> </message>
@ -2849,7 +2848,7 @@
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="473"/> <location filename="../../src/class/scriptmachine.cpp" line="473"/>
<location filename="../../src/class/scriptmachine.cpp" line="2107"/> <location filename="../../src/class/scriptmachine.cpp" line="2168"/>
<source>Code must be exec in the main thread</source> <source>Code must be exec in the main thread</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2860,8 +2859,8 @@
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="528"/> <location filename="../../src/class/scriptmachine.cpp" line="528"/>
<location filename="../../src/class/scriptmachine.cpp" line="2156"/> <location filename="../../src/class/scriptmachine.cpp" line="2217"/>
<location filename="../../src/class/scriptmachine.cpp" line="2272"/> <location filename="../../src/class/scriptmachine.cpp" line="2333"/>
<source>Script failed to build</source> <source>Script failed to build</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2882,19 +2881,19 @@
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="615"/> <location filename="../../src/class/scriptmachine.cpp" line="615"/>
<location filename="../../src/class/scriptmachine.cpp" line="2206"/> <location filename="../../src/class/scriptmachine.cpp" line="2267"/>
<source>The script failed with an exception</source> <source>The script failed with an exception</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="624"/> <location filename="../../src/class/scriptmachine.cpp" line="624"/>
<location filename="../../src/class/scriptmachine.cpp" line="2215"/> <location filename="../../src/class/scriptmachine.cpp" line="2276"/>
<source>The script was aborted</source> <source>The script was aborted</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="632"/> <location filename="../../src/class/scriptmachine.cpp" line="632"/>
<location filename="../../src/class/scriptmachine.cpp" line="2223"/> <location filename="../../src/class/scriptmachine.cpp" line="2284"/>
<source>The script terminated unexpectedly</source> <source>The script terminated unexpectedly</source>
<translation>退</translation> <translation>退</translation>
</message> </message>
@ -4405,18 +4404,18 @@
<translation>調</translation> <translation>調</translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="2063"/> <location filename="../../src/class/scriptmachine.cpp" line="2103"/>
<location filename="../../src/class/scriptmachine.cpp" line="2075"/> <location filename="../../src/class/scriptmachine.cpp" line="2115"/>
<source>Assert failed</source> <source>Assert failed</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="2254"/> <location filename="../../src/class/scriptmachine.cpp" line="2315"/>
<source>BadDecl:</source> <source>BadDecl:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmachine.cpp" line="2263"/> <location filename="../../src/class/scriptmachine.cpp" line="2324"/>
<source>GlobalBadDecl</source> <source>GlobalBadDecl</source>
<translation></translation> <translation></translation>
</message> </message>

View File

@ -32,13 +32,13 @@
Q_GLOBAL_STATIC_WITH_ARGS( Q_GLOBAL_STATIC_WITH_ARGS(
QByteArrayList, DEFAULT_MARCO, QByteArrayList, DEFAULT_MARCO,
({// special marcos ({// special marcos
"__LINE__", "__SECTION__", "__LINE__", "__SECTION__", "__SECTION_BASE__",
// functions // functions
"__AS_ARRAY__", "__AS_ANY__", "__AS_GRID__", "__AS_HANDLE__", "__AS_ARRAY__", "__AS_ANY__", "__AS_GRID__", "__AS_HANDLE__",
"__AS_MATH__", "__AS_WEAKREF__", "__AS_COROUTINE__", "__WING_FILE__", "__AS_MATH__", "__AS_WEAKREF__", "__AS_COROUTINE__", "__WING_FILE__",
"__WING_STRING__", "__WING_COLOR__", "__WING_JSON__", "__WING_REGEX__", "__WING_STRING__", "__WING_COLOR__", "__WING_JSON__", "__WING_REGEX__",
"__WING_DICTIONARY__", "__WING_PRINT_VAR__", "__WING_PRINT_LN__", "__WING_DICTIONARY__", "__WING_PRINT_VAR__", "__WING_PRINT_LN__",
"__AS_PROMISE__"})); "__AS_PROMISE__", "__WING_CLIPBOARD__"}));
AsPreprocesser::AsPreprocesser(asIScriptEngine *engine) : engine(engine) { AsPreprocesser::AsPreprocesser(asIScriptEngine *engine) : engine(engine) {
Q_ASSERT(engine); Q_ASSERT(engine);
@ -273,15 +273,6 @@ int AsPreprocesser::processScriptSection(const QByteArray &script,
1, asMSGTYPE_ERROR, str.toUtf8()); 1, asMSGTYPE_ERROR, str.toUtf8());
return asERROR; return asERROR;
} }
// ensure end line
if (endLinePassFailed(modifiedScript, pos)) {
auto str = QObject::tr("UnexceptedToken");
engine->WriteMessage(SECTION,
getLineCount(modifiedScript, pos),
1, asMSGTYPE_ERROR, str.toUtf8());
return asERROR;
}
} else if (isIf) { } else if (isIf) {
if (_isCodeCompleteMode) { if (_isCodeCompleteMode) {
auto pos = modifiedScript.indexOf('\n', start); auto pos = modifiedScript.indexOf('\n', start);
@ -580,6 +571,12 @@ int AsPreprocesser::processScriptSection(const QByteArray &script,
modifiedScript.replace(pos, len, data); modifiedScript.replace(pos, len, data);
pos += data.length(); pos += data.length();
continue; continue;
} else if (word == "__SECTION_BASE__") {
auto data = QFileInfo(SECTION).baseName().toUtf8();
data.prepend('"').append('"');
modifiedScript.replace(pos, len, data);
pos += data.length();
continue;
} else { } else {
auto rword = findReplaceResult(word); auto rword = findReplaceResult(word);
if (word != rword) { if (word != rword) {
@ -693,17 +690,16 @@ int AsPreprocesser::processScriptSection(const QByteArray &script,
auto p = includefile.indexOf('\n'); auto p = includefile.indexOf('\n');
auto ws = includefile.indexOf(' '); auto ws = includefile.indexOf(' ');
if (!includefile.isEmpty() && p >= 0 && ws >= 0) { if (!includefile.isEmpty() && p >= 0 && ws >= 0) {
// TODO: Show the correct line number for
// the error
auto str = auto str =
QObject::tr( QObject::tr(
"Invalid file name for #include; " "Invalid file name for #include; "
"it contains a line-break: ") + "it contains a line-break: ") +
QStringLiteral("'") + includefile.left(p) + QStringLiteral("'") + includefile.left(p) +
QStringLiteral("'"); QStringLiteral("'");
engine->WriteMessage(sectionname.toUtf8(), 0, 0, engine->WriteMessage(
asMSGTYPE_ERROR, sectionname.toUtf8(),
str.toUtf8()); getLineCount(modifiedScript, pos), 1,
asMSGTYPE_ERROR, str.toUtf8());
} else { } else {
// Store it for later processing // Store it for later processing
includes.append({includefile, false}); includes.append({includefile, false});
@ -744,9 +740,10 @@ int AsPreprocesser::processScriptSection(const QByteArray &script,
sectionname, pragmaParam) sectionname, pragmaParam)
: -1; : -1;
if (r < 0) { if (r < 0) {
// TODO: Report the correct line number
engine->WriteMessage( engine->WriteMessage(
sectionname.toUtf8(), 0, 0, asMSGTYPE_ERROR, sectionname.toUtf8(),
getLineCount(modifiedScript, pos), 1,
asMSGTYPE_ERROR,
QObject::tr("Invalid #pragma directive") QObject::tr("Invalid #pragma directive")
.toUtf8()); .toUtf8());
return r; return r;

View File

@ -43,6 +43,8 @@
#include "scriptaddon/scriptqstring.h" #include "scriptaddon/scriptqstring.h"
#include "scriptaddon/scriptregex.h" #include "scriptaddon/scriptregex.h"
#include <QClipboard>
#include <QMimeData>
#include <QProcess> #include <QProcess>
#include <QScopeGuard> #include <QScopeGuard>
@ -153,8 +155,6 @@ bool ScriptMachine::configureEngine() {
return false; return false;
} }
_engine->SetDefaultAccessMask(0x1);
// we need utf8, the default is what we want // we need utf8, the default is what we want
_engine->SetEngineProperty(asEP_EXPAND_DEF_ARRAY_TO_TMPL, true); _engine->SetEngineProperty(asEP_EXPAND_DEF_ARRAY_TO_TMPL, true);
_engine->SetEngineProperty(asEP_DISALLOW_EMPTY_LIST_ELEMENTS, true); _engine->SetEngineProperty(asEP_DISALLOW_EMPTY_LIST_ELEMENTS, true);
@ -1998,6 +1998,8 @@ void ScriptMachine::translation() {
} }
void ScriptMachine::registerEngineAddon(asIScriptEngine *engine) { void ScriptMachine::registerEngineAddon(asIScriptEngine *engine) {
// all modules can access
engine->SetDefaultAccessMask(0x3);
RegisterScriptArray(engine, true); RegisterScriptArray(engine, true);
RegisterQString(engine); RegisterQString(engine);
RegisterScriptRegex(engine); RegisterScriptRegex(engine);
@ -2012,9 +2014,12 @@ void ScriptMachine::registerEngineAddon(asIScriptEngine *engine) {
RegisterScriptHandle(engine); RegisterScriptHandle(engine);
RegisterColor(engine); RegisterColor(engine);
RegisterQJson(engine); RegisterQJson(engine);
engine->SetDefaultAccessMask(0x1);
RegisterScriptFile(engine); RegisterScriptFile(engine);
registerExceptionRoutines(engine); registerExceptionRoutines(engine);
registerEngineAssert(engine); registerEngineAssert(engine);
registerEngineClipboard(engine);
AsDirectPromise::Register(engine); AsDirectPromise::Register(engine);
} }
@ -2051,6 +2056,41 @@ void ScriptMachine::registerEngineAssert(asIScriptEngine *engine) {
} }
} }
void ScriptMachine::registerEngineClipboard(asIScriptEngine *engine) {
int r = engine->SetDefaultNamespace("clipboard");
Q_ASSERT(r >= 0);
Q_UNUSED(r);
// The string type must be available
Q_ASSERT(engine->GetTypeInfoByDecl("string"));
if (strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") == 0) {
r = engine->RegisterGlobalFunction(
"void setText(const string &in text)", asFUNCTION(clip_setText),
asCALL_CDECL);
Q_ASSERT(r >= 0);
Q_UNUSED(r);
r = engine->RegisterGlobalFunction(
"void setBinary(const uint8[]@ data)", asFUNCTION(clip_setBinary),
asCALL_CDECL);
Q_ASSERT(r >= 0);
Q_UNUSED(r);
} else {
r = engine->RegisterGlobalFunction(
"void setText(const string &in text)", WRAP_FN(clip_setText),
asCALL_GENERIC);
Q_ASSERT(r >= 0);
Q_UNUSED(r);
r = engine->RegisterGlobalFunction(
"void setBinary(const uint8[]@ data)", WRAP_FN(clip_setBinary),
asCALL_GENERIC);
Q_ASSERT(r >= 0);
Q_UNUSED(r);
}
engine->SetDefaultNamespace("");
}
void ScriptMachine::registerCallBack(ConsoleMode mode, void ScriptMachine::registerCallBack(ConsoleMode mode,
const RegCallBacks &callbacks) { const RegCallBacks &callbacks) {
_regcalls.insert(mode, callbacks); _regcalls.insert(mode, callbacks);
@ -2079,6 +2119,27 @@ void ScriptMachine::scriptAssert_X(bool b, const QString &msg) {
} }
} }
void ScriptMachine::clip_setText(const QString &text) {
qApp->clipboard()->setText(text);
}
void ScriptMachine::clip_setBinary(const CScriptArray &array) {
QByteArray buffer;
buffer.reserve(array.GetSize());
array.AddRef();
for (asUINT i = 0; i < array.GetSize(); ++i) {
auto item = reinterpret_cast<const asBYTE *>(array.At(i));
buffer.append(*item);
}
array.Release();
auto c = qApp->clipboard();
auto mime = new QMimeData;
mime->setData(QStringLiteral("application/octet-stream"),
buffer); // don't use setText()
c->setMimeData(mime);
}
void ScriptMachine::scriptThrow(const QString &msg) { void ScriptMachine::scriptThrow(const QString &msg) {
asIScriptContext *ctx = asGetActiveContext(); asIScriptContext *ctx = asGetActiveContext();
if (ctx) { if (ctx) {

View File

@ -28,6 +28,8 @@
#include <QObject> #include <QObject>
#include <QQueue> #include <QQueue>
class CScriptArray;
class ScriptMachine : public QObject { class ScriptMachine : public QObject {
Q_OBJECT Q_OBJECT
private: private:
@ -118,6 +120,7 @@ public:
static void registerEngineAddon(asIScriptEngine *engine); static void registerEngineAddon(asIScriptEngine *engine);
static void registerEngineAssert(asIScriptEngine *engine); static void registerEngineAssert(asIScriptEngine *engine);
static void registerEngineClipboard(asIScriptEngine *engine);
void registerCallBack(ConsoleMode mode, const RegCallBacks &callbacks); void registerCallBack(ConsoleMode mode, const RegCallBacks &callbacks);
@ -132,6 +135,9 @@ public:
static void scriptAssert(bool b); static void scriptAssert(bool b);
static void scriptAssert_X(bool b, const QString &msg); static void scriptAssert_X(bool b, const QString &msg);
static void clip_setText(const QString &text);
static void clip_setBinary(const CScriptArray &array);
static void scriptThrow(const QString &msg); static void scriptThrow(const QString &msg);
static QString scriptGetExceptionInfo(); static QString scriptGetExceptionInfo();

View File

@ -148,6 +148,10 @@ static void ConstructString(QString *thisPointer) {
new (thisPointer) QString(); new (thisPointer) QString();
} }
static void ConstructStringChar(const QChar &ch, QString *thisPointer) {
new (thisPointer) QString(ch);
}
static void CopyConstructString(const QString &other, QString *thisPointer) { static void CopyConstructString(const QString &other, QString *thisPointer) {
new (thisPointer) QString(other); new (thisPointer) QString(other);
} }
@ -230,6 +234,16 @@ static QString &AddAssignFloatToString(float f, QString &dest) {
return dest; return dest;
} }
static QString &AssignCharToString(const QChar &ch, QString &dest) {
dest = ch;
return dest;
}
static QString &AddAssignCharToString(const QChar &ch, QString &dest) {
dest += ch;
return dest;
}
static QString &AssignBoolToString(bool b, QString &dest) { static QString &AssignBoolToString(bool b, QString &dest) {
dest = b ? QStringLiteral("true") : QStringLiteral("false"); dest = b ? QStringLiteral("true") : QStringLiteral("false");
return dest; return dest;
@ -256,6 +270,14 @@ static QString AddFloatString(float f, const QString &str) {
return QString::number(f) + str; return QString::number(f) + str;
} }
static QString AddStringChar(const QString &str, const QChar &ch) {
return str + ch;
}
static QString AddCharString(const QChar &ch, const QString &str) {
return ch + str;
}
static QString AddStringBool(const QString &str, bool b) { static QString AddStringBool(const QString &str, bool b) {
return str + (b ? QStringLiteral("true") : QStringLiteral("false")); return str + (b ? QStringLiteral("true") : QStringLiteral("false"));
} }
@ -265,7 +287,7 @@ static QString AddBoolString(bool b, const QString &str) {
} }
#endif #endif
static char *StringCharAt(unsigned int i, QString &str) { static QChar *StringCharAt(unsigned int i, QString &str) {
if (asDWORD(i) >= asDWORD(str.size())) { if (asDWORD(i) >= asDWORD(str.size())) {
// Set a script exception // Set a script exception
asIScriptContext *ctx = asGetActiveContext(); asIScriptContext *ctx = asGetActiveContext();
@ -275,7 +297,7 @@ static char *StringCharAt(unsigned int i, QString &str) {
return nullptr; return nullptr;
} }
return reinterpret_cast<char *>(str.data() + i); return str.data() + i;
} }
// AngelScript signature: // AngelScript signature:
@ -595,6 +617,11 @@ void RegisterQString_Native(asIScriptEngine *engine) {
asCALL_CDECL_OBJLAST); asCALL_CDECL_OBJLAST);
Q_ASSERT(r >= 0); Q_ASSERT(r >= 0);
Q_UNUSED(r); Q_UNUSED(r);
r = engine->RegisterObjectBehaviour(
"string", asBEHAVE_CONSTRUCT, "void f(const char &in)",
asFUNCTION(ConstructStringChar), asCALL_CDECL_OBJLAST);
Q_ASSERT(r >= 0);
Q_UNUSED(r);
r = engine->RegisterObjectMethod( r = engine->RegisterObjectMethod(
"string", "string &opAssign(const string &in)", "string", "string &opAssign(const string &in)",
asMETHODPR(QString, operator=, (const QString &), QString &), asMETHODPR(QString, operator=, (const QString &), QString &),
@ -717,8 +744,29 @@ void RegisterQString_Native(asIScriptEngine *engine) {
Q_ASSERT(r >= 0); Q_ASSERT(r >= 0);
Q_UNUSED(r); Q_UNUSED(r);
r = engine->RegisterObjectMethod(
"string", "string &opAssign(const char &in)",
asFUNCTION(AssignCharToString), asCALL_CDECL_OBJLAST);
Q_ASSERT(r >= 0);
Q_UNUSED(r);
r = engine->RegisterObjectMethod(
"string", "string &opAddAssign(const char &in)",
asFUNCTION(AddAssignCharToString), asCALL_CDECL_OBJLAST);
Q_ASSERT(r >= 0);
Q_UNUSED(r);
r = engine->RegisterObjectMethod(
"string", "string opAdd(const char &in) const",
asFUNCTION(AddStringChar), asCALL_CDECL_OBJFIRST);
Q_ASSERT(r >= 0);
Q_UNUSED(r);
r = engine->RegisterObjectMethod(
"string", "string opAdd_r(const char &in) const",
asFUNCTION(AddCharString), asCALL_CDECL_OBJLAST);
Q_ASSERT(r >= 0);
Q_UNUSED(r);
r = engine->RegisterObjectMethod("string", "string &opAssign(float)", r = engine->RegisterObjectMethod("string", "string &opAssign(float)",
asFUNCTION(AssignFloatToString), asFUNCTION(AssignCharToString),
asCALL_CDECL_OBJLAST); asCALL_CDECL_OBJLAST);
Q_ASSERT(r >= 0); Q_ASSERT(r >= 0);
Q_UNUSED(r); Q_UNUSED(r);