Refactor ParseUtil to stop using pointers and output-parameters
This commit is contained in:
parent
fa8b387120
commit
fdd12cde25
3 changed files with 81 additions and 100 deletions
|
@ -39,31 +39,30 @@ public:
|
||||||
class ParseUtil
|
class ParseUtil
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ParseUtil();
|
ParseUtil() { };
|
||||||
void set_root(QString);
|
void set_root(const QString &dir);
|
||||||
static QString readTextFile(QString);
|
static QString readTextFile(const QString &path);
|
||||||
static int textFileLineCount(const QString &path);
|
static int textFileLineCount(const QString &path);
|
||||||
void strip_comment(QString*);
|
|
||||||
QList<QStringList> parseAsm(const QString &filename);
|
QList<QStringList> parseAsm(const QString &filename);
|
||||||
int evaluateDefine(QString, QMap<QString, int>*);
|
int evaluateDefine(const QString&, const QMap<QString, int>&);
|
||||||
QStringList readCArray(QString text, QString label);
|
QStringList readCArray(const QString &text, const QString &label);
|
||||||
QMap<QString, QString> readNamedIndexCArray(QString text, QString label);
|
QMap<QString, QString> readNamedIndexCArray(const QString &text, const QString &label);
|
||||||
QString readCIncbin(QString text, QString label);
|
QString readCIncbin(const QString &text, const QString &label);
|
||||||
QMap<QString, int> readCDefines(QString filename, QStringList prefixes, QMap<QString, int> = QMap<QString, int>());
|
QMap<QString, int> readCDefines(const QString &filename, const QStringList &prefixes, QMap<QString, int> = { });
|
||||||
void readCDefinesSorted(QString, QStringList, QStringList*, QMap<QString, int> = QMap<QString, int>());
|
QStringList readCDefinesSorted(const QString&, const QStringList&, const QMap<QString, int>& = { });
|
||||||
QList<QStringList> getLabelMacros(const QList<QStringList> &, const QString &);
|
QList<QStringList> getLabelMacros(const QList<QStringList>&, const QString&);
|
||||||
QStringList getLabelValues(const QList<QStringList> &, const QString &);
|
QStringList getLabelValues(const QList<QStringList>&, const QString&);
|
||||||
bool tryParseJsonFile(QJsonDocument *out, QString filepath);
|
bool tryParseJsonFile(QJsonDocument *out, const QString &filepath);
|
||||||
bool ensureFieldsExist(QJsonObject obj, QList<QString> fields);
|
bool ensureFieldsExist(const QJsonObject &obj, const QList<QString> &fields);
|
||||||
|
|
||||||
// Returns the 1-indexed line number for the definition of scriptLabel in the scripts file at filePath.
|
// Returns the 1-indexed line number for the definition of scriptLabel in the scripts file at filePath.
|
||||||
// Returns 0 if a definition for scriptLabel cannot be found.
|
// Returns 0 if a definition for scriptLabel cannot be found.
|
||||||
static int getScriptLineNumber(const QString &filePath, const QString &scriptLabel);
|
static int getScriptLineNumber(const QString &filePath, const QString &scriptLabel);
|
||||||
static int getRawScriptLineNumber(QString text, const QString &scriptLabel);
|
static int getRawScriptLineNumber(QString text, const QString &scriptLabel);
|
||||||
static int getPoryScriptLineNumber(QString text, const QString &scriptLabel);
|
static int getPoryScriptLineNumber(QString text, const QString &scriptLabel);
|
||||||
static QString &removeStringLiterals(QString &text);
|
static QString removeStringLiterals(QString text);
|
||||||
static QString &removeLineComments(QString &text, const QString &commentSymbol);
|
static QString removeLineComments(QString text, const QString &commentSymbol);
|
||||||
static QString &removeLineComments(QString &text, const QStringList &commentSymbols);
|
static QString removeLineComments(QString text, const QStringList &commentSymbols);
|
||||||
|
|
||||||
static QStringList splitShellCommand(QStringView command);
|
static QStringList splitShellCommand(QStringView command);
|
||||||
|
|
||||||
|
@ -71,10 +70,10 @@ private:
|
||||||
QString root;
|
QString root;
|
||||||
QString text;
|
QString text;
|
||||||
QString file;
|
QString file;
|
||||||
QList<Token> tokenizeExpression(QString expression, QMap<QString, int>* knownIdentifiers);
|
QList<Token> tokenizeExpression(QString expression, const QMap<QString, int> &knownIdentifiers);
|
||||||
QList<Token> generatePostfix(QList<Token> tokens);
|
QList<Token> generatePostfix(const QList<Token> &tokens);
|
||||||
int evaluatePostfix(QList<Token> postfix);
|
int evaluatePostfix(const QList<Token> &postfix);
|
||||||
void error(QString message, QString expression);
|
void error(const QString &message, const QString &expression);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PARSEUTIL_H
|
#endif // PARSEUTIL_H
|
||||||
|
|
|
@ -6,15 +6,12 @@
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QStack>
|
#include <QStack>
|
||||||
|
|
||||||
ParseUtil::ParseUtil()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void ParseUtil::set_root(QString dir) {
|
void ParseUtil::set_root(const QString &dir) {
|
||||||
this->root = dir;
|
this->root = dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParseUtil::error(QString message, QString expression) {
|
void ParseUtil::error(const QString &message, const QString &expression) {
|
||||||
QStringList lines = text.split(QRegularExpression("[\r\n]"));
|
QStringList lines = text.split(QRegularExpression("[\r\n]"));
|
||||||
int lineNum = 0, colNum = 0;
|
int lineNum = 0, colNum = 0;
|
||||||
for (QString line : lines) {
|
for (QString line : lines) {
|
||||||
|
@ -25,21 +22,7 @@ void ParseUtil::error(QString message, QString expression) {
|
||||||
logError(QString("%1:%2:%3: %4").arg(file).arg(lineNum).arg(colNum).arg(message));
|
logError(QString("%1:%2:%3: %4").arg(file).arg(lineNum).arg(colNum).arg(message));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParseUtil::strip_comment(QString *line) {
|
QString ParseUtil::readTextFile(const QString &path) {
|
||||||
bool in_string = false;
|
|
||||||
for (int i = 0; i < line->length(); i++) {
|
|
||||||
if (line->at(i) == '"') {
|
|
||||||
in_string = !in_string;
|
|
||||||
} else if (line->at(i) == '@') {
|
|
||||||
if (!in_string) {
|
|
||||||
line->truncate(i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString ParseUtil::readTextFile(QString path) {
|
|
||||||
QFile file(path);
|
QFile file(path);
|
||||||
if (!file.open(QIODevice::ReadOnly)) {
|
if (!file.open(QIODevice::ReadOnly)) {
|
||||||
logError(QString("Could not open '%1': ").arg(path) + file.errorString());
|
logError(QString("Could not open '%1': ").arg(path) + file.errorString());
|
||||||
|
@ -63,21 +46,23 @@ QList<QStringList> ParseUtil::parseAsm(const QString &filename) {
|
||||||
QList<QStringList> parsed;
|
QList<QStringList> parsed;
|
||||||
|
|
||||||
text = readTextFile(root + '/' + filename);
|
text = readTextFile(root + '/' + filename);
|
||||||
const QStringList lines = text.split('\n');
|
const QStringList lines = removeLineComments(text, "@").split('\n');
|
||||||
for (QString line : lines) {
|
for (const auto &line : lines) {
|
||||||
strip_comment(&line);
|
const QString trimmedLine = line.trimmed();
|
||||||
if (line.trimmed().isEmpty()) {
|
if (trimmedLine.isEmpty()) {
|
||||||
} else if (line.contains(':')) {
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.contains(':')) {
|
||||||
const QString label = line.left(line.indexOf(':'));
|
const QString label = line.left(line.indexOf(':'));
|
||||||
const QStringList list{ ".label", label }; // .label is not a real keyword. It's used only to make the output more regular.
|
const QStringList list{ ".label", label }; // .label is not a real keyword. It's used only to make the output more regular.
|
||||||
parsed.append(list);
|
parsed.append(list);
|
||||||
// There should not be anything else on the line.
|
// There should not be anything else on the line.
|
||||||
// gas will raise a syntax error if there is.
|
// gas will raise a syntax error if there is.
|
||||||
} else {
|
} else {
|
||||||
line = line.trimmed();
|
int index = trimmedLine.indexOf(QRegExp("\\s+"));
|
||||||
int index = line.indexOf(QRegExp("\\s+"));
|
const QString macro = trimmedLine.left(index);
|
||||||
const QString macro = line.left(index);
|
QStringList params(trimmedLine.right(trimmedLine.length() - index).trimmed().split(QRegExp("\\s*,\\s*")));
|
||||||
QStringList params(line.right(line.length() - index).trimmed().split(QRegExp("\\s*,\\s*")));
|
|
||||||
params.prepend(macro);
|
params.prepend(macro);
|
||||||
parsed.append(params);
|
parsed.append(params);
|
||||||
}
|
}
|
||||||
|
@ -85,13 +70,13 @@ QList<QStringList> ParseUtil::parseAsm(const QString &filename) {
|
||||||
return parsed;
|
return parsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ParseUtil::evaluateDefine(QString define, QMap<QString, int>* knownDefines) {
|
int ParseUtil::evaluateDefine(const QString &define, const QMap<QString, int> &knownDefines) {
|
||||||
QList<Token> tokens = tokenizeExpression(define, knownDefines);
|
QList<Token> tokens = tokenizeExpression(define, knownDefines);
|
||||||
QList<Token> postfixExpression = generatePostfix(tokens);
|
QList<Token> postfixExpression = generatePostfix(tokens);
|
||||||
return evaluatePostfix(postfixExpression);
|
return evaluatePostfix(postfixExpression);
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<Token> ParseUtil::tokenizeExpression(QString expression, QMap<QString, int>* knownIdentifiers) {
|
QList<Token> ParseUtil::tokenizeExpression(QString expression, const QMap<QString, int> &knownIdentifiers) {
|
||||||
QList<Token> tokens;
|
QList<Token> tokens;
|
||||||
|
|
||||||
QStringList tokenTypes = (QStringList() << "hex" << "decimal" << "identifier" << "operator" << "leftparen" << "rightparen");
|
QStringList tokenTypes = (QStringList() << "hex" << "decimal" << "identifier" << "operator" << "leftparen" << "rightparen");
|
||||||
|
@ -108,8 +93,8 @@ QList<Token> ParseUtil::tokenizeExpression(QString expression, QMap<QString, int
|
||||||
QString token = match.captured(tokenType);
|
QString token = match.captured(tokenType);
|
||||||
if (!token.isEmpty()) {
|
if (!token.isEmpty()) {
|
||||||
if (tokenType == "identifier") {
|
if (tokenType == "identifier") {
|
||||||
if (knownIdentifiers->contains(token)) {
|
if (knownIdentifiers.contains(token)) {
|
||||||
QString actualToken = QString("%1").arg(knownIdentifiers->value(token));
|
QString actualToken = QString("%1").arg(knownIdentifiers.value(token));
|
||||||
expression = expression.replace(0, token.length(), actualToken);
|
expression = expression.replace(0, token.length(), actualToken);
|
||||||
token = actualToken;
|
token = actualToken;
|
||||||
tokenType = "decimal";
|
tokenType = "decimal";
|
||||||
|
@ -152,7 +137,7 @@ QMap<QString, int> Token::precedenceMap = QMap<QString, int>(
|
||||||
|
|
||||||
// Shunting-yard algorithm for generating postfix notation.
|
// Shunting-yard algorithm for generating postfix notation.
|
||||||
// https://en.wikipedia.org/wiki/Shunting-yard_algorithm
|
// https://en.wikipedia.org/wiki/Shunting-yard_algorithm
|
||||||
QList<Token> ParseUtil::generatePostfix(QList<Token> tokens) {
|
QList<Token> ParseUtil::generatePostfix(const QList<Token> &tokens) {
|
||||||
QList<Token> output;
|
QList<Token> output;
|
||||||
QStack<Token> operatorStack;
|
QStack<Token> operatorStack;
|
||||||
for (Token token : tokens) {
|
for (Token token : tokens) {
|
||||||
|
@ -194,7 +179,7 @@ QList<Token> ParseUtil::generatePostfix(QList<Token> tokens) {
|
||||||
|
|
||||||
// Evaluate postfix expression.
|
// Evaluate postfix expression.
|
||||||
// https://en.wikipedia.org/wiki/Reverse_Polish_notation#Postfix_evaluation_algorithm
|
// https://en.wikipedia.org/wiki/Reverse_Polish_notation#Postfix_evaluation_algorithm
|
||||||
int ParseUtil::evaluatePostfix(QList<Token> postfix) {
|
int ParseUtil::evaluatePostfix(const QList<Token> &postfix) {
|
||||||
QStack<Token> stack;
|
QStack<Token> stack;
|
||||||
for (Token token : postfix) {
|
for (Token token : postfix) {
|
||||||
if (token.type == TokenClass::Operator && stack.size() > 1) {
|
if (token.type == TokenClass::Operator && stack.size() > 1) {
|
||||||
|
@ -228,7 +213,7 @@ int ParseUtil::evaluatePostfix(QList<Token> postfix) {
|
||||||
return stack.size() ? stack.pop().value.toInt(nullptr, 0) : 0;
|
return stack.size() ? stack.pop().value.toInt(nullptr, 0) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString ParseUtil::readCIncbin(QString filename, QString label) {
|
QString ParseUtil::readCIncbin(const QString &filename, const QString &label) {
|
||||||
QString path;
|
QString path;
|
||||||
|
|
||||||
if (label.isNull()) {
|
if (label.isNull()) {
|
||||||
|
@ -251,7 +236,10 @@ QString ParseUtil::readCIncbin(QString filename, QString label) {
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
QMap<QString, int> ParseUtil::readCDefines(QString filename, QStringList prefixes, QMap<QString, int> allDefines) {
|
QMap<QString, int> ParseUtil::readCDefines(const QString &filename,
|
||||||
|
const QStringList &prefixes,
|
||||||
|
QMap<QString, int> allDefines)
|
||||||
|
{
|
||||||
QMap<QString, int> filteredDefines;
|
QMap<QString, int> filteredDefines;
|
||||||
|
|
||||||
file = filename;
|
file = filename;
|
||||||
|
@ -280,7 +268,7 @@ QMap<QString, int> ParseUtil::readCDefines(QString filename, QStringList prefixe
|
||||||
QString name = match.captured("defineName");
|
QString name = match.captured("defineName");
|
||||||
QString expression = match.captured("defineValue");
|
QString expression = match.captured("defineValue");
|
||||||
if (expression == " ") continue;
|
if (expression == " ") continue;
|
||||||
int value = evaluateDefine(expression, &allDefines);
|
int value = evaluateDefine(expression, allDefines);
|
||||||
allDefines.insert(name, value);
|
allDefines.insert(name, value);
|
||||||
for (QString prefix : prefixes) {
|
for (QString prefix : prefixes) {
|
||||||
if (name.startsWith(prefix) || QRegularExpression(prefix).match(name).hasMatch()) {
|
if (name.startsWith(prefix) || QRegularExpression(prefix).match(name).hasMatch()) {
|
||||||
|
@ -291,7 +279,10 @@ QMap<QString, int> ParseUtil::readCDefines(QString filename, QStringList prefixe
|
||||||
return filteredDefines;
|
return filteredDefines;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParseUtil::readCDefinesSorted(QString filename, QStringList prefixes, QStringList* definesToSet, QMap<QString, int> knownDefines) {
|
QStringList ParseUtil::readCDefinesSorted(const QString &filename,
|
||||||
|
const QStringList &prefixes,
|
||||||
|
const QMap<QString, int> &knownDefines)
|
||||||
|
{
|
||||||
QMap<QString, int> defines = readCDefines(filename, prefixes, knownDefines);
|
QMap<QString, int> defines = readCDefines(filename, prefixes, knownDefines);
|
||||||
|
|
||||||
// The defines should to be sorted by their underlying value, not alphabetically.
|
// The defines should to be sorted by their underlying value, not alphabetically.
|
||||||
|
@ -300,10 +291,10 @@ void ParseUtil::readCDefinesSorted(QString filename, QStringList prefixes, QStri
|
||||||
for (QString defineName : defines.keys()) {
|
for (QString defineName : defines.keys()) {
|
||||||
definesInverse.insert(defines[defineName], defineName);
|
definesInverse.insert(defines[defineName], defineName);
|
||||||
}
|
}
|
||||||
*definesToSet = definesInverse.values();
|
return definesInverse.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList ParseUtil::readCArray(QString filename, QString label) {
|
QStringList ParseUtil::readCArray(const QString &filename, const QString &label) {
|
||||||
QStringList list;
|
QStringList list;
|
||||||
|
|
||||||
if (label.isNull()) {
|
if (label.isNull()) {
|
||||||
|
@ -329,7 +320,7 @@ QStringList ParseUtil::readCArray(QString filename, QString label) {
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
QMap<QString, QString> ParseUtil::readNamedIndexCArray(QString filename, QString label) {
|
QMap<QString, QString> ParseUtil::readNamedIndexCArray(const QString &filename, const QString &label) {
|
||||||
text = readTextFile(root + "/" + filename);
|
text = readTextFile(root + "/" + filename);
|
||||||
QMap<QString, QString> map;
|
QMap<QString, QString> map;
|
||||||
|
|
||||||
|
@ -388,16 +379,16 @@ QStringList ParseUtil::getLabelValues(const QList<QStringList> &list, const QStr
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ParseUtil::tryParseJsonFile(QJsonDocument *out, QString filepath) {
|
bool ParseUtil::tryParseJsonFile(QJsonDocument *out, const QString &filepath) {
|
||||||
QFile file(filepath);
|
QFile file(filepath);
|
||||||
if (!file.open(QIODevice::ReadOnly)) {
|
if (!file.open(QIODevice::ReadOnly)) {
|
||||||
logError(QString("Error: Could not open %1 for reading").arg(filepath));
|
logError(QString("Error: Could not open %1 for reading").arg(filepath));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray data = file.readAll();
|
const QByteArray data = file.readAll();
|
||||||
QJsonParseError parseError;
|
QJsonParseError parseError;
|
||||||
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &parseError);
|
const QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &parseError);
|
||||||
file.close();
|
file.close();
|
||||||
if (parseError.error != QJsonParseError::NoError) {
|
if (parseError.error != QJsonParseError::NoError) {
|
||||||
logError(QString("Error: Failed to parse json file %1: %2").arg(filepath).arg(parseError.errorString()));
|
logError(QString("Error: Failed to parse json file %1: %2").arg(filepath).arg(parseError.errorString()));
|
||||||
|
@ -408,7 +399,7 @@ bool ParseUtil::tryParseJsonFile(QJsonDocument *out, QString filepath) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ParseUtil::ensureFieldsExist(QJsonObject obj, QList<QString> fields) {
|
bool ParseUtil::ensureFieldsExist(const QJsonObject &obj, const QList<QString> &fields) {
|
||||||
for (QString field : fields) {
|
for (QString field : fields) {
|
||||||
if (!obj.contains(field)) {
|
if (!obj.contains(field)) {
|
||||||
logError(QString("JSON object is missing field '%1'.").arg(field));
|
logError(QString("JSON object is missing field '%1'.").arg(field));
|
||||||
|
@ -431,8 +422,8 @@ int ParseUtil::getScriptLineNumber(const QString &filePath, const QString &scrip
|
||||||
}
|
}
|
||||||
|
|
||||||
int ParseUtil::getRawScriptLineNumber(QString text, const QString &scriptLabel) {
|
int ParseUtil::getRawScriptLineNumber(QString text, const QString &scriptLabel) {
|
||||||
removeStringLiterals(text);
|
text = removeStringLiterals(text);
|
||||||
removeLineComments(text, "@");
|
text = removeLineComments(text, "@");
|
||||||
|
|
||||||
static const QRegularExpression re_incScriptLabel("\\b(?<label>[\\w_][\\w\\d_]*):{1,2}");
|
static const QRegularExpression re_incScriptLabel("\\b(?<label>[\\w_][\\w\\d_]*):{1,2}");
|
||||||
QRegularExpressionMatchIterator it = re_incScriptLabel.globalMatch(text);
|
QRegularExpressionMatchIterator it = re_incScriptLabel.globalMatch(text);
|
||||||
|
@ -446,8 +437,8 @@ int ParseUtil::getRawScriptLineNumber(QString text, const QString &scriptLabel)
|
||||||
}
|
}
|
||||||
|
|
||||||
int ParseUtil::getPoryScriptLineNumber(QString text, const QString &scriptLabel) {
|
int ParseUtil::getPoryScriptLineNumber(QString text, const QString &scriptLabel) {
|
||||||
removeStringLiterals(text);
|
text = removeStringLiterals(text);
|
||||||
removeLineComments(text, {"//", "#"});
|
text = removeLineComments(text, {"//", "#"});
|
||||||
|
|
||||||
static const QRegularExpression re_poryScriptLabel("\\b(script)(\\((global|local)\\))?\\s*\\b(?<label>[\\w_][\\w\\d_]*)");
|
static const QRegularExpression re_poryScriptLabel("\\b(script)(\\((global|local)\\))?\\s*\\b(?<label>[\\w_][\\w\\d_]*)");
|
||||||
QRegularExpressionMatchIterator it = re_poryScriptLabel.globalMatch(text);
|
QRegularExpressionMatchIterator it = re_poryScriptLabel.globalMatch(text);
|
||||||
|
@ -469,19 +460,19 @@ int ParseUtil::getPoryScriptLineNumber(QString text, const QString &scriptLabel)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString &ParseUtil::removeStringLiterals(QString &text) {
|
QString ParseUtil::removeStringLiterals(QString text) {
|
||||||
static const QRegularExpression re_string("\".*\"");
|
static const QRegularExpression re_string("\".*\"");
|
||||||
return text.remove(re_string);
|
return text.remove(re_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString &ParseUtil::removeLineComments(QString &text, const QString &commentSymbol) {
|
QString ParseUtil::removeLineComments(QString text, const QString &commentSymbol) {
|
||||||
const QRegularExpression re_lineComment(commentSymbol + "+.*");
|
const QRegularExpression re_lineComment(commentSymbol + "+.*");
|
||||||
return text.remove(re_lineComment);
|
return text.remove(re_lineComment);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString &ParseUtil::removeLineComments(QString &text, const QStringList &commentSymbols) {
|
QString ParseUtil::removeLineComments(QString text, const QStringList &commentSymbols) {
|
||||||
for (const auto &commentSymbol : commentSymbols)
|
for (const auto &commentSymbol : commentSymbols)
|
||||||
removeLineComments(text, commentSymbol);
|
text = removeLineComments(text, commentSymbol);
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -164,7 +164,7 @@ QMap<QString, bool> Project::getTopLevelMapFields() {
|
||||||
topLevelMapFields.insert("allow_escaping", true);
|
topLevelMapFields.insert("allow_escaping", true);
|
||||||
topLevelMapFields.insert("allow_running", true);
|
topLevelMapFields.insert("allow_running", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (projectConfig.getFloorNumberEnabled()) {
|
if (projectConfig.getFloorNumberEnabled()) {
|
||||||
topLevelMapFields.insert("floor_number", true);
|
topLevelMapFields.insert("floor_number", true);
|
||||||
}
|
}
|
||||||
|
@ -2112,11 +2112,10 @@ bool Project::readHealLocations() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Project::readItemNames() {
|
bool Project::readItemNames() {
|
||||||
itemNames.clear();
|
|
||||||
QStringList prefixes("\\bITEM_(?!(B_)?USE_)"); // Exclude ITEM_USE_ and ITEM_B_USE_ constants
|
QStringList prefixes("\\bITEM_(?!(B_)?USE_)"); // Exclude ITEM_USE_ and ITEM_B_USE_ constants
|
||||||
QString filename = "include/constants/items.h";
|
QString filename = "include/constants/items.h";
|
||||||
fileWatcher.addPath(root + "/" + filename);
|
fileWatcher.addPath(root + "/" + filename);
|
||||||
parser.readCDefinesSorted(filename, prefixes, &itemNames);
|
itemNames = parser.readCDefinesSorted(filename, prefixes);
|
||||||
if (itemNames.isEmpty()) {
|
if (itemNames.isEmpty()) {
|
||||||
logError(QString("Failed to read item constants from %1").arg(filename));
|
logError(QString("Failed to read item constants from %1").arg(filename));
|
||||||
return false;
|
return false;
|
||||||
|
@ -2131,11 +2130,10 @@ bool Project::readFlagNames() {
|
||||||
fileWatcher.addPath(root + "/" + opponentsFilename);
|
fileWatcher.addPath(root + "/" + opponentsFilename);
|
||||||
QMap<QString, int> maxTrainers = parser.readCDefines(opponentsFilename, QStringList() << "\\bMAX_");
|
QMap<QString, int> maxTrainers = parser.readCDefines(opponentsFilename, QStringList() << "\\bMAX_");
|
||||||
// Parse flags
|
// Parse flags
|
||||||
flagNames.clear();
|
|
||||||
QStringList prefixes("\\bFLAG_");
|
QStringList prefixes("\\bFLAG_");
|
||||||
QString flagsFilename = "include/constants/flags.h";
|
QString flagsFilename = "include/constants/flags.h";
|
||||||
fileWatcher.addPath(root + "/" + flagsFilename);
|
fileWatcher.addPath(root + "/" + flagsFilename);
|
||||||
parser.readCDefinesSorted(flagsFilename, prefixes, &flagNames, maxTrainers);
|
flagNames = parser.readCDefinesSorted(flagsFilename, prefixes, maxTrainers);
|
||||||
if (flagNames.isEmpty()) {
|
if (flagNames.isEmpty()) {
|
||||||
logError(QString("Failed to read flag constants from %1").arg(flagsFilename));
|
logError(QString("Failed to read flag constants from %1").arg(flagsFilename));
|
||||||
return false;
|
return false;
|
||||||
|
@ -2144,11 +2142,10 @@ bool Project::readFlagNames() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Project::readVarNames() {
|
bool Project::readVarNames() {
|
||||||
varNames.clear();
|
|
||||||
QStringList prefixes("\\bVAR_");
|
QStringList prefixes("\\bVAR_");
|
||||||
QString filename = "include/constants/vars.h";
|
QString filename = "include/constants/vars.h";
|
||||||
fileWatcher.addPath(root + "/" + filename);
|
fileWatcher.addPath(root + "/" + filename);
|
||||||
parser.readCDefinesSorted(filename, prefixes, &varNames);
|
varNames = parser.readCDefinesSorted(filename, prefixes);
|
||||||
if (varNames.isEmpty()) {
|
if (varNames.isEmpty()) {
|
||||||
logError(QString("Failed to read var constants from %1").arg(filename));
|
logError(QString("Failed to read var constants from %1").arg(filename));
|
||||||
return false;
|
return false;
|
||||||
|
@ -2157,11 +2154,10 @@ bool Project::readVarNames() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Project::readMovementTypes() {
|
bool Project::readMovementTypes() {
|
||||||
movementTypes.clear();
|
|
||||||
QStringList prefixes("\\bMOVEMENT_TYPE_");
|
QStringList prefixes("\\bMOVEMENT_TYPE_");
|
||||||
QString filename = "include/constants/event_object_movement.h";
|
QString filename = "include/constants/event_object_movement.h";
|
||||||
fileWatcher.addPath(root + "/" + filename);
|
fileWatcher.addPath(root + "/" + filename);
|
||||||
parser.readCDefinesSorted(filename, prefixes, &movementTypes);
|
movementTypes = parser.readCDefinesSorted(filename, prefixes);
|
||||||
if (movementTypes.isEmpty()) {
|
if (movementTypes.isEmpty()) {
|
||||||
logError(QString("Failed to read movement type constants from %1").arg(filename));
|
logError(QString("Failed to read movement type constants from %1").arg(filename));
|
||||||
return false;
|
return false;
|
||||||
|
@ -2181,11 +2177,10 @@ bool Project::readInitialFacingDirections() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Project::readMapTypes() {
|
bool Project::readMapTypes() {
|
||||||
mapTypes.clear();
|
|
||||||
QStringList prefixes("\\bMAP_TYPE_");
|
QStringList prefixes("\\bMAP_TYPE_");
|
||||||
QString filename = "include/constants/map_types.h";
|
QString filename = "include/constants/map_types.h";
|
||||||
fileWatcher.addPath(root + "/" + filename);
|
fileWatcher.addPath(root + "/" + filename);
|
||||||
parser.readCDefinesSorted(filename, prefixes, &mapTypes);
|
mapTypes = parser.readCDefinesSorted(filename, prefixes);
|
||||||
if (mapTypes.isEmpty()) {
|
if (mapTypes.isEmpty()) {
|
||||||
logError(QString("Failed to read map type constants from %1").arg(filename));
|
logError(QString("Failed to read map type constants from %1").arg(filename));
|
||||||
return false;
|
return false;
|
||||||
|
@ -2194,11 +2189,10 @@ bool Project::readMapTypes() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Project::readMapBattleScenes() {
|
bool Project::readMapBattleScenes() {
|
||||||
mapBattleScenes.clear();
|
|
||||||
QStringList prefixes("\\bMAP_BATTLE_SCENE_");
|
QStringList prefixes("\\bMAP_BATTLE_SCENE_");
|
||||||
QString filename = "include/constants/map_types.h";
|
QString filename = "include/constants/map_types.h";
|
||||||
fileWatcher.addPath(root + "/" + filename);
|
fileWatcher.addPath(root + "/" + filename);
|
||||||
parser.readCDefinesSorted("include/constants/map_types.h", prefixes, &mapBattleScenes);
|
mapBattleScenes = parser.readCDefinesSorted("include/constants/map_types.h", prefixes);
|
||||||
if (mapBattleScenes.isEmpty()) {
|
if (mapBattleScenes.isEmpty()) {
|
||||||
logError(QString("Failed to read map battle scene constants from %1").arg(filename));
|
logError(QString("Failed to read map battle scene constants from %1").arg(filename));
|
||||||
return false;
|
return false;
|
||||||
|
@ -2207,11 +2201,10 @@ bool Project::readMapBattleScenes() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Project::readWeatherNames() {
|
bool Project::readWeatherNames() {
|
||||||
weatherNames.clear();
|
|
||||||
QStringList prefixes("\\bWEATHER_");
|
QStringList prefixes("\\bWEATHER_");
|
||||||
QString filename = "include/constants/weather.h";
|
QString filename = "include/constants/weather.h";
|
||||||
fileWatcher.addPath(root + "/" + filename);
|
fileWatcher.addPath(root + "/" + filename);
|
||||||
parser.readCDefinesSorted(filename, prefixes, &weatherNames);
|
weatherNames = parser.readCDefinesSorted(filename, prefixes);
|
||||||
if (weatherNames.isEmpty()) {
|
if (weatherNames.isEmpty()) {
|
||||||
logError(QString("Failed to read weather constants from %1").arg(filename));
|
logError(QString("Failed to read weather constants from %1").arg(filename));
|
||||||
return false;
|
return false;
|
||||||
|
@ -2220,13 +2213,13 @@ bool Project::readWeatherNames() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Project::readCoordEventWeatherNames() {
|
bool Project::readCoordEventWeatherNames() {
|
||||||
if (!projectConfig.getEventWeatherTriggerEnabled()) return true;
|
if (!projectConfig.getEventWeatherTriggerEnabled())
|
||||||
|
return true;
|
||||||
|
|
||||||
coordEventWeatherNames.clear();
|
|
||||||
QStringList prefixes("\\bCOORD_EVENT_WEATHER_");
|
QStringList prefixes("\\bCOORD_EVENT_WEATHER_");
|
||||||
QString filename = "include/constants/weather.h";
|
QString filename = "include/constants/weather.h";
|
||||||
fileWatcher.addPath(root + "/" + filename);
|
fileWatcher.addPath(root + "/" + filename);
|
||||||
parser.readCDefinesSorted(filename, prefixes, &coordEventWeatherNames);
|
coordEventWeatherNames = parser.readCDefinesSorted(filename, prefixes);
|
||||||
if (coordEventWeatherNames.isEmpty()) {
|
if (coordEventWeatherNames.isEmpty()) {
|
||||||
logError(QString("Failed to read coord event weather constants from %1").arg(filename));
|
logError(QString("Failed to read coord event weather constants from %1").arg(filename));
|
||||||
return false;
|
return false;
|
||||||
|
@ -2235,13 +2228,13 @@ bool Project::readCoordEventWeatherNames() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Project::readSecretBaseIds() {
|
bool Project::readSecretBaseIds() {
|
||||||
if (!projectConfig.getEventSecretBaseEnabled()) return true;
|
if (!projectConfig.getEventSecretBaseEnabled())
|
||||||
|
return true;
|
||||||
|
|
||||||
secretBaseIds.clear();
|
|
||||||
QStringList prefixes("\\bSECRET_BASE_[A-Za-z0-9_]*_[0-9]+");
|
QStringList prefixes("\\bSECRET_BASE_[A-Za-z0-9_]*_[0-9]+");
|
||||||
QString filename = "include/constants/secret_bases.h";
|
QString filename = "include/constants/secret_bases.h";
|
||||||
fileWatcher.addPath(root + "/" + filename);
|
fileWatcher.addPath(root + "/" + filename);
|
||||||
parser.readCDefinesSorted(filename, prefixes, &secretBaseIds);
|
secretBaseIds = parser.readCDefinesSorted(filename, prefixes);
|
||||||
if (secretBaseIds.isEmpty()) {
|
if (secretBaseIds.isEmpty()) {
|
||||||
logError(QString("Failed to read secret base id constants from %1").arg(filename));
|
logError(QString("Failed to read secret base id constants from %1").arg(filename));
|
||||||
return false;
|
return false;
|
||||||
|
@ -2250,11 +2243,10 @@ bool Project::readSecretBaseIds() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Project::readBgEventFacingDirections() {
|
bool Project::readBgEventFacingDirections() {
|
||||||
bgEventFacingDirections.clear();
|
|
||||||
QStringList prefixes("\\bBG_EVENT_PLAYER_FACING_");
|
QStringList prefixes("\\bBG_EVENT_PLAYER_FACING_");
|
||||||
QString filename = "include/constants/event_bg.h";
|
QString filename = "include/constants/event_bg.h";
|
||||||
fileWatcher.addPath(root + "/" + filename);
|
fileWatcher.addPath(root + "/" + filename);
|
||||||
parser.readCDefinesSorted(filename, prefixes, &bgEventFacingDirections);
|
bgEventFacingDirections = parser.readCDefinesSorted(filename, prefixes);
|
||||||
if (bgEventFacingDirections.isEmpty()) {
|
if (bgEventFacingDirections.isEmpty()) {
|
||||||
logError(QString("Failed to read bg event facing direction constants from %1").arg(filename));
|
logError(QString("Failed to read bg event facing direction constants from %1").arg(filename));
|
||||||
return false;
|
return false;
|
||||||
|
@ -2263,11 +2255,10 @@ bool Project::readBgEventFacingDirections() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Project::readTrainerTypes() {
|
bool Project::readTrainerTypes() {
|
||||||
trainerTypes.clear();
|
|
||||||
QStringList prefixes("\\bTRAINER_TYPE_");
|
QStringList prefixes("\\bTRAINER_TYPE_");
|
||||||
QString filename = "include/constants/trainer_types.h";
|
QString filename = "include/constants/trainer_types.h";
|
||||||
fileWatcher.addPath(root + "/" + filename);
|
fileWatcher.addPath(root + "/" + filename);
|
||||||
parser.readCDefinesSorted(filename, prefixes, &trainerTypes);
|
trainerTypes = parser.readCDefinesSorted(filename, prefixes);
|
||||||
if (trainerTypes.isEmpty()) {
|
if (trainerTypes.isEmpty()) {
|
||||||
logError(QString("Failed to read trainer type constants from %1").arg(filename));
|
logError(QString("Failed to read trainer type constants from %1").arg(filename));
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue