read multiple incbins and C arrays at once for situations where the same file could be opened many times
This commit is contained in:
parent
9cc55ef2f7
commit
6b47d350a0
3 changed files with 60 additions and 22 deletions
|
@ -13,8 +13,6 @@
|
|||
|
||||
|
||||
|
||||
extern QMap<QString, QString> gFileCache;
|
||||
|
||||
enum TokenClass {
|
||||
Number,
|
||||
Operator,
|
||||
|
@ -51,9 +49,11 @@ public:
|
|||
static int textFileLineCount(const QString &path);
|
||||
QList<QStringList> parseAsm(const QString &filename);
|
||||
int evaluateDefine(const QString&, const QMap<QString, int>&);
|
||||
QStringList readCArray(const QString &text, const QString &label);
|
||||
QStringList readCArray(const QString &filename, const QString &label);
|
||||
QMap<QString, QStringList> readCArrayMulti(const QString &filename);
|
||||
QMap<QString, QString> readNamedIndexCArray(const QString &text, const QString &label);
|
||||
QString readCIncbin(const QString &text, const QString &label);
|
||||
QMap<QString, QString> readCIncbinMulti(const QString &filepath);
|
||||
QStringList readCIncbinArray(const QString &filename, const QString &label);
|
||||
QMap<QString, int> readCDefines(const QString &filename, const QStringList &prefixes, QMap<QString, int> = { });
|
||||
QStringList readCDefinesSorted(const QString&, const QStringList&, const QMap<QString, int>& = { });
|
||||
|
|
|
@ -15,13 +15,9 @@ const QRegularExpression ParseUtil::re_poryScriptLabel("\\b(script)(\\((global|l
|
|||
const QRegularExpression ParseUtil::re_globalPoryScriptLabel("\\b(script)(\\((global)\\))?\\s*\\b(?<label>[\\w_][\\w\\d_]*)");
|
||||
const QRegularExpression ParseUtil::re_poryRawSection("\\b(raw)\\s*`(?<raw_script>[^`]*)");
|
||||
|
||||
QMap<QString, QString> gFileCache;
|
||||
|
||||
using OrderedJson = poryjson::Json;
|
||||
|
||||
ParseUtil::ParseUtil() {
|
||||
gFileCache.clear();
|
||||
}
|
||||
ParseUtil::ParseUtil() { }
|
||||
|
||||
void ParseUtil::set_root(const QString &dir) {
|
||||
this->root = dir;
|
||||
|
@ -58,10 +54,6 @@ QString ParseUtil::createErrorMessage(const QString &message, const QString &exp
|
|||
}
|
||||
|
||||
QString ParseUtil::readTextFile(const QString &path) {
|
||||
if (gFileCache.contains(path)) {
|
||||
return gFileCache[path];
|
||||
}
|
||||
|
||||
QFile file(path);
|
||||
if (!file.open(QIODevice::ReadOnly)) {
|
||||
logError(QString("Could not open '%1': ").arg(path) + file.errorString());
|
||||
|
@ -76,7 +68,6 @@ QString ParseUtil::readTextFile(const QString &path) {
|
|||
text += in.readLine() + '\n';
|
||||
}
|
||||
|
||||
gFileCache[path] = text;
|
||||
return text;
|
||||
}
|
||||
|
||||
|
@ -287,6 +278,25 @@ QString ParseUtil::readCIncbin(const QString &filename, const QString &label) {
|
|||
return path;
|
||||
}
|
||||
|
||||
QMap<QString, QString> ParseUtil::readCIncbinMulti(const QString &filepath) {
|
||||
QMap<QString, QString> incbinMap;
|
||||
|
||||
this->file = filepath;
|
||||
this->text = readTextFile(this->root + "/" + filepath);
|
||||
|
||||
static const QRegularExpression regex("(?<label>[A-Za-z0-9_]+)\\s*\\[?\\s*\\]?\\s*=\\s*INCBIN_[US][0-9][0-9]?\\(\\s*\\\"(?<path>[^\\\\\"]*)\\\"\\s*\\)");
|
||||
|
||||
QRegularExpressionMatchIterator iter = regex.globalMatch(this->text);
|
||||
while (iter.hasNext()) {
|
||||
QRegularExpressionMatch match = iter.next();
|
||||
QString label = match.captured("label");
|
||||
QString labelText = match.captured("path");
|
||||
incbinMap[label] = labelText;
|
||||
}
|
||||
|
||||
return incbinMap;
|
||||
}
|
||||
|
||||
QStringList ParseUtil::readCIncbinArray(const QString &filename, const QString &label) {
|
||||
QStringList paths;
|
||||
|
||||
|
@ -415,6 +425,35 @@ QStringList ParseUtil::readCArray(const QString &filename, const QString &label)
|
|||
return list;
|
||||
}
|
||||
|
||||
QMap<QString, QStringList> ParseUtil::readCArrayMulti(const QString &filename) {
|
||||
QMap<QString, QStringList> map;
|
||||
|
||||
this->file = filename;
|
||||
this->text = readTextFile(this->root + "/" + filename);
|
||||
|
||||
static const QRegularExpression regex(R"((?<label>\b[A-Za-z0-9_]+\b)\s*(\[[^\]]*\])?\s*=\s*\{(?<body>[^\}]*)\})");
|
||||
|
||||
QRegularExpressionMatchIterator iter = regex.globalMatch(this->text);
|
||||
|
||||
while (iter.hasNext()) {
|
||||
QRegularExpressionMatch match = iter.next();
|
||||
QString label = match.captured("label");
|
||||
QString body = match.captured("body");
|
||||
|
||||
QStringList list;
|
||||
QStringList split = body.split(',');
|
||||
for (QString item : split) {
|
||||
item = item.trimmed();
|
||||
static const QRegularExpression validChars("[^A-Za-z0-9_&()\\s]");
|
||||
if (!item.contains(validChars)) list.append(item);
|
||||
// do not print error info here because this is called dozens of times
|
||||
}
|
||||
map[label] = list;
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
QMap<QString, QString> ParseUtil::readNamedIndexCArray(const QString &filename, const QString &label) {
|
||||
this->text = readTextFile(this->root + "/" + filename);
|
||||
QMap<QString, QString> map;
|
||||
|
|
|
@ -1563,9 +1563,6 @@ void Project::saveTextFile(QString path, QString text) {
|
|||
QFile file(path);
|
||||
if (file.open(QIODevice::WriteOnly)) {
|
||||
file.write(text.toUtf8());
|
||||
if (gFileCache.contains(path)) {
|
||||
gFileCache[path] = text;
|
||||
}
|
||||
} else {
|
||||
logError(QString("Could not open '%1' for writing: ").arg(path) + file.errorString());
|
||||
}
|
||||
|
@ -1575,7 +1572,6 @@ void Project::appendTextFile(QString path, QString text) {
|
|||
QFile file(path);
|
||||
if (file.open(QIODevice::Append)) {
|
||||
file.write(text.toUtf8());
|
||||
gFileCache[path] += text;
|
||||
} else {
|
||||
logError(QString("Could not open '%1' for appending: ").arg(path) + file.errorString());
|
||||
}
|
||||
|
@ -1585,8 +1581,6 @@ void Project::deleteFile(QString path) {
|
|||
QFile file(path);
|
||||
if (file.exists() && !file.remove()) {
|
||||
logError(QString("Could not delete file '%1': ").arg(path) + file.errorString());
|
||||
} else {
|
||||
gFileCache.remove(path);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2406,6 +2400,10 @@ bool Project::readEventGraphics() {
|
|||
|
||||
QString filepath = projectConfig.getFilePath(ProjectFilePath::data_obj_event_gfx_info);
|
||||
const auto gfxInfos = parser.readCStructs(filepath, "", gfxInfoMemberMap);
|
||||
|
||||
QMap<QString, QStringList> picTables = parser.readCArrayMulti(projectConfig.getFilePath(ProjectFilePath::data_obj_event_pic_tables));
|
||||
QMap<QString, QString> graphicIncbins = parser.readCIncbinMulti(projectConfig.getFilePath(ProjectFilePath::data_obj_event_gfx));
|
||||
|
||||
for (QString gfxName : gfxNames) {
|
||||
EventGraphics * eventGraphics = new EventGraphics;
|
||||
|
||||
|
@ -2420,10 +2418,10 @@ bool Project::readEventGraphics() {
|
|||
QString dimensions_label = gfxInfoAttributes.value("oam");
|
||||
QString subsprites_label = gfxInfoAttributes.value("subspriteTables");
|
||||
|
||||
QString gfx_label = parser.readCArray(projectConfig.getFilePath(ProjectFilePath::data_obj_event_pic_tables), pic_label).value(0);
|
||||
QString gfx_label = picTables[pic_label].value(0);
|
||||
static const QRegularExpression re_parens("[\\(\\)]");
|
||||
gfx_label = gfx_label.section(re_parens, 1, 1);
|
||||
QString path = parser.readCIncbin(projectConfig.getFilePath(ProjectFilePath::data_obj_event_gfx), gfx_label);
|
||||
QString path = graphicIncbins[gfx_label];
|
||||
|
||||
if (!path.isNull()) {
|
||||
path = fixGraphicPath(path);
|
||||
|
@ -2461,8 +2459,9 @@ bool Project::readSpeciesIconPaths() {
|
|||
fileWatcher.addPath(root + "/" + srcfilename);
|
||||
fileWatcher.addPath(root + "/" + incfilename);
|
||||
QMap<QString, QString> monIconNames = parser.readNamedIndexCArray(srcfilename, "gMonIconTable");
|
||||
QMap<QString, QString> iconIncbins = parser.readCIncbinMulti(incfilename);
|
||||
for (QString species : monIconNames.keys()) {
|
||||
QString path = parser.readCIncbin(incfilename, monIconNames.value(species));
|
||||
QString path = iconIncbins[monIconNames.value(species)];
|
||||
speciesToIconPath.insert(species, root + "/" + path.replace("4bpp", "png"));
|
||||
}
|
||||
return true;
|
||||
|
|
Loading…
Reference in a new issue