Add support for Unicode character blocks
Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
@@ -756,7 +756,32 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
ZRCola::DBSource::character_desc_idx idxChrDsc, idxChrDscSub;
|
||||
ZRCola::DBSource::character_bank chrs;
|
||||
|
||||
// Phase 1: Parse characters and build indexes.
|
||||
// Phase 1: Get character blocks.
|
||||
com_obj<ADORecordset> rs2;
|
||||
if (src.SelectCharacterBlocks(rs2)) {
|
||||
size_t count2 = src.GetRecordsetCount(rs2);
|
||||
if (count2 < 0xffffffff) { // 4G check (-1 is reserved for error condition)
|
||||
// Parse character blocks and build index and data.
|
||||
for (; !ZRCola::DBSource::IsEOF(rs2); rs2->MoveNext()) {
|
||||
// Read character block from the database.
|
||||
ZRCola::DBSource::chrblk cb;
|
||||
if (src.GetCharacterBlock(rs2, cb))
|
||||
chrs.idxChrBlk[cb.first] = std::move(cb.second);
|
||||
else
|
||||
has_errors = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
_ftprintf(stderr, wxT("%s: error ZCC0029: Error getting character block count from database or too many character blocks.\n"), (LPCTSTR)filenameIn.c_str());
|
||||
has_errors = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
_ftprintf(stderr, wxT("%s: error ZCC0028: Error getting character blocks from database. Please make sure the file is ZRCola.zrc compatible.\n"), (LPCTSTR)filenameIn.c_str());
|
||||
has_errors = true;
|
||||
}
|
||||
|
||||
// Phase 2: Parse characters and build indexes.
|
||||
for (; !ZRCola::DBSource::IsEOF(rs); rs->MoveNext()) {
|
||||
// Read character from the database.
|
||||
ZRCola::DBSource::character chr;
|
||||
@@ -766,33 +791,64 @@ int _tmain(int argc, _TCHAR *argv[])
|
||||
has_errors = true;
|
||||
}
|
||||
|
||||
// Phase 2: Build related character lists.
|
||||
// Phase 3: Build related character lists.
|
||||
chrs.build_related();
|
||||
|
||||
ZRCola::character_db db;
|
||||
{
|
||||
ZRCola::character_db db;
|
||||
|
||||
// Preallocate memory.
|
||||
db.idxChr.reserve(count);
|
||||
db.data .reserve(count*4);
|
||||
// Preallocate memory.
|
||||
db.idxChr.reserve(count);
|
||||
db.data.reserve(count * 4);
|
||||
|
||||
// Phase 3: Parse characters and build index and data.
|
||||
for (auto chr = chrs.cbegin(), chr_end = chrs.cend(); chr != chr_end; ++chr) {
|
||||
// Add character to index and data.
|
||||
db << *chr;
|
||||
// Phase 4: Parse characters and build index and data.
|
||||
for (auto chr = chrs.cbegin(), chr_end = chrs.cend(); chr != chr_end; ++chr) {
|
||||
// Add character to index and data.
|
||||
db << *chr;
|
||||
|
||||
// Add description (and keywords) to index.
|
||||
idxChrDsc .add_keywords(chr->second.terms, chr->first, 0);
|
||||
idxChrDscSub.add_keywords(chr->second.terms, chr->first, 3);
|
||||
// Add description (and keywords) to index.
|
||||
idxChrDsc.add_keywords(chr->second.terms, chr->first, 0);
|
||||
idxChrDscSub.add_keywords(chr->second.terms, chr->first, 3);
|
||||
|
||||
// Mark category used.
|
||||
categories_used.insert(chr->second.cat);
|
||||
// Mark category used.
|
||||
categories_used.insert(chr->second.cat);
|
||||
}
|
||||
|
||||
// Write characters to file.
|
||||
db.idxChr.sort();
|
||||
idxChrDsc.save(db.idxDsc);
|
||||
idxChrDscSub.save(db.idxDscSub);
|
||||
dst << ZRCola::character_rec(db);
|
||||
}
|
||||
|
||||
// Write characters to file.
|
||||
db.idxChr.sort();
|
||||
idxChrDsc .save(db.idxDsc );
|
||||
idxChrDscSub.save(db.idxDscSub);
|
||||
dst << ZRCola::character_rec(db);
|
||||
{
|
||||
ZRCola::chrblk_db db;
|
||||
|
||||
// Preallocate memory.
|
||||
db.idxChrId.reserve(chrs.idxChrBlk.size());
|
||||
db.idxRank.reserve(chrs.idxChrBlk.size());
|
||||
db.data.reserve(chrs.idxChrBlk.size() * 16);
|
||||
|
||||
// Phase 5: Parse character blocks and build index and data.
|
||||
for (auto& cb : chrs.idxChrBlk)
|
||||
{
|
||||
if (!cb.second.used) {
|
||||
// Skip unused character blocks.
|
||||
continue;
|
||||
}
|
||||
|
||||
if (build_pot)
|
||||
pot.insert(cb.second.name);
|
||||
|
||||
// Add character block to index and data.
|
||||
db << cb;
|
||||
}
|
||||
|
||||
// Write character blocks to file.
|
||||
db.idxChrId.sort();
|
||||
db.idxRank.sort();
|
||||
dst << ZRCola::chrblk_rec(db);
|
||||
}
|
||||
} else {
|
||||
_ftprintf(stderr, wxT("%s: error ZCC0017: Error getting character count from database or too many characters.\n"), (LPCTSTR)filenameIn.c_str());
|
||||
has_errors = true;
|
||||
|
||||
Reference in New Issue
Block a user