git-svn-id: svn://db.shs.com.ru/pip@557 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
72
utils/resources_compiler/generator.cpp
Normal file
72
utils/resources_compiler/generator.cpp
Normal file
@@ -0,0 +1,72 @@
|
||||
#include "generator.h"
|
||||
#include "piresourcesstorage.h"
|
||||
|
||||
typedef PIPair<PIString, PIString> SSPair;
|
||||
|
||||
bool generate(PIFile & file, const PIVector<ParserSection> & files) {
|
||||
if (!file.isOpened()) return false;
|
||||
PIString fcname = file.fileInfo().baseName().replaceAll(".", "_").replaceAll("/", "_")
|
||||
.replaceAll(":", "_").replaceAll("-", "_");//.toUpperCase() + "_H";
|
||||
PIString icname = "_PIRC_" + fcname + "_Initializer_";
|
||||
PIString dataname = "_pirc_" + fcname + "_data_";
|
||||
PIString descname = "_pirc_" + fcname + "_desc_";
|
||||
PIVector<PIResourcesStorage::__RCEntry> fv;
|
||||
piForeachC (ParserSection & s, files) {
|
||||
piForeachC (SSPair & p, s.files) {
|
||||
PIFile f;
|
||||
if (!f.open(p.second, PIIODevice::ReadOnly)) continue;
|
||||
fv << PIResourcesStorage::__RCEntry(s.name, p.first, p.second);
|
||||
}
|
||||
}
|
||||
if (fv.isEmpty()) return false;
|
||||
file << "#include \"piresourcesstorage.h\"\n\nstatic const uchar " << dataname << "[] = {\n";
|
||||
bool first = true;
|
||||
int rcnt = -1;
|
||||
llong curoff = 0, curfile = 0;
|
||||
piForeach (PIResourcesStorage::__RCEntry & e, fv) {
|
||||
e.offset = curoff;
|
||||
PIFile f;
|
||||
f.open(e.file, PIIODevice::ReadOnly);
|
||||
PIByteArray readed;
|
||||
curfile = 0;
|
||||
while (!f.isEnd()) {
|
||||
readed = f.read(4096);
|
||||
curfile += readed.size_s();
|
||||
for (int i = 0; i < readed.size_s(); ++i) {
|
||||
if (!first)
|
||||
file << ',';
|
||||
first = false;
|
||||
if (++rcnt >= 32) {
|
||||
file << '\n';
|
||||
rcnt = 0;
|
||||
}
|
||||
file << int(readed[i]);
|
||||
}
|
||||
}
|
||||
e.size = curfile;
|
||||
curoff += curfile;
|
||||
}
|
||||
file << "\n};\n";
|
||||
PIByteArray dba;
|
||||
dba << fv;
|
||||
file << "\nstatic const uchar " << descname << "[] = {\n";
|
||||
first = true;
|
||||
rcnt = -1;
|
||||
for (int i = 0; i < dba.size_s(); ++i) {
|
||||
if (!first)
|
||||
file << ',';
|
||||
first = false;
|
||||
if (++rcnt >= 32) {
|
||||
file << '\n';
|
||||
rcnt = 0;
|
||||
}
|
||||
file << int(dba[i]);
|
||||
}
|
||||
file << "\n};\n";
|
||||
file << "\nclass " << icname << " {\n";
|
||||
file << "public:\n\t" << icname << "() {\n";
|
||||
file << "\t\tPIResourcesStorage::instance()->registerSection(" << dataname << ", " << descname << ", sizeof(" << descname << "));\n";
|
||||
file << "\t}\n";
|
||||
file << "} _pirc_" << fcname << "_initializer_;\n";
|
||||
return true;
|
||||
}
|
||||
Reference in New Issue
Block a user