Add support for Unicode character blocks

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman
2025-11-14 08:18:36 +01:00
parent 9c4caf506b
commit 1ba71443f5
9 changed files with 2974 additions and 2611 deletions

View File

@@ -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;