DictionaryReader::DictionaryReader(IBitStream *bstr) : _bstr(bstr), _isSupported(true), _decoderLoaded(false) { _bstr->readSome(&_header, sizeof(LSDHeader)); if (strcmp("LingVo", _header.magic) != 0) throw NotLSDException(); if (_header.version == 0x142001 || _header.version == 0x152001) { _decoder.reset(new UserDictionaryDecoder()); } else if (_header.version == 0x141004) { _decoder.reset(new SystemDictionaryDecoder(false)); } else if (_header.version == 0x145001 || _header.version == 0x155001) { _decoder.reset(new AbbreviationDictionaryDecoder()); } else if (_header.version == 0x151005) { _decoder.reset(new SystemDictionaryDecoder(true)); } else { _isSupported = false; return; } uint8_t nameLen; bstr->readSome(&nameLen, 1); _name = readUnicodeString(bstr, nameLen, false); auto firstHeading = readUnicodeString(bstr, bstr->read(8), false); (void)firstHeading; auto lastHeading = readUnicodeString(bstr, bstr->read(8), false); (void)lastHeading; auto capitals = readUnicodeString(bstr, reverse32(bstr->read(32)), false); (void)capitals; uint16_t iconLen; bstr->readSome(&iconLen, 2); _icon.resize(iconLen); bstr->readSome(&_icon[0], iconLen); bstr->seek(bstr->tell() + 4); // checksum bstr->readSome(&_pagesEnd, 4); bstr->readSome(&_overlayData, 4); }
void UserDictionaryDecoder::Read(IBitStream *bstr) { int len = bstr->read(32); _prefix = readUnicodeString(bstr, len, true); _articleSymbols = readSymbols(bstr); _headingSymbols = readSymbols(bstr); _ltArticles.Read(*bstr); _ltHeadings.Read(*bstr); _ltPrefixLengths.Read(*bstr); _ltPostfixLengths.Read(*bstr); _huffman1Number = bstr->read(32); _huffman2Number = bstr->read(32); }
cString basicInput::readUnicodeNullString(const uint numberOfCharacter /* = MAX_CHAR */) { cString ret(nil, t_min(numberOfCharacter, (uint)cString::DefaultStringPage)); readUnicodeString(ret, 0, numberOfCharacter); return ret; }