diff options
Diffstat (limited to 'CPP/7zip/Archive/Chm')
-rw-r--r-- | CPP/7zip/Archive/Chm/ChmHandler.cpp | 42 | ||||
-rw-r--r-- | CPP/7zip/Archive/Chm/ChmIn.cpp | 15 | ||||
-rw-r--r-- | CPP/7zip/Archive/Chm/ChmIn.h | 14 |
3 files changed, 40 insertions, 31 deletions
diff --git a/CPP/7zip/Archive/Chm/ChmHandler.cpp b/CPP/7zip/Archive/Chm/ChmHandler.cpp index 3e29fd00..2a72e8e9 100644 --- a/CPP/7zip/Archive/Chm/ChmHandler.cpp +++ b/CPP/7zip/Archive/Chm/ChmHandler.cpp @@ -101,6 +101,7 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val { COM_TRY_BEGIN NCOM::CPropVariant prop; + if (m_Database.NewFormat) { switch (propID) @@ -112,12 +113,15 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val prop.Detach(value); return S_OK; } - int entryIndex; + + unsigned entryIndex; if (m_Database.LowLevel) entryIndex = index; else entryIndex = m_Database.Indices[index]; + const CItem &item = m_Database.Items[entryIndex]; + switch (propID) { case kpidPath: @@ -161,6 +165,7 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val #endif } + prop.Detach(value); return S_OK; COM_TRY_END @@ -244,9 +249,9 @@ public: UInt64 m_PosInFolder; UInt64 m_PosInSection; const CRecordVector<bool> *m_ExtractStatuses; - int m_StartIndex; - int m_CurrentIndex; - int m_NumFiles; + unsigned m_StartIndex; + unsigned m_CurrentIndex; + unsigned m_NumFiles; private: const CFilesDatabase *m_Database; @@ -298,7 +303,7 @@ HRESULT CChmFolderOutStream::WriteEmptyFiles() { if (m_FileIsOpen) return S_OK; - for (;m_CurrentIndex < m_NumFiles; m_CurrentIndex++) + for (; m_CurrentIndex < m_NumFiles; m_CurrentIndex++) { UInt64 fileSize = m_Database->GetFileSize(m_StartIndex + m_CurrentIndex); if (fileSize != 0) @@ -368,7 +373,7 @@ HRESULT CChmFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *proce // return E_FAIL; } - int fullIndex = m_StartIndex + m_CurrentIndex; + unsigned fullIndex = m_StartIndex + m_CurrentIndex; m_RemainFileSize = m_Database->GetFileSize(fullIndex); UInt64 fileOffset = m_Database->GetFileOffset(fullIndex); if (fileOffset < m_PosInSection) @@ -408,7 +413,7 @@ HRESULT CChmFolderOutStream::FlushCorrupted(UInt64 maxSize) { const UInt32 kBufferSize = (1 << 10); Byte buffer[kBufferSize]; - for (int i = 0; i < kBufferSize; i++) + for (unsigned i = 0; i < kBufferSize; i++) buffer[i] = 0; if (maxSize > m_FolderSize) maxSize = m_FolderSize; @@ -531,9 +536,8 @@ STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, for (i = 0; i < numItems; i++) { UInt32 index = allFilesMode ? i : indices[i]; - int entryIndex = m_Database.Indices[index]; - const CItem &item = m_Database.Items[entryIndex]; - UInt64 sectionIndex = item.Section; + const CItem &item = m_Database.Items[m_Database.Indices[index]]; + const UInt64 sectionIndex = item.Section; if (item.IsDir() || item.Size == 0) continue; if (sectionIndex == 0) @@ -567,14 +571,17 @@ STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, CByteBuffer packBuf; - for (i = 0; i < numItems;) + for (i = 0;;) { RINOK(extractCallback->SetCompleted(¤tTotalSize)); + + if (i >= numItems) + break; + UInt32 index = allFilesMode ? i : indices[i]; i++; - int entryIndex = m_Database.Indices[index]; - const CItem &item = m_Database.Items[entryIndex]; - UInt64 sectionIndex = item.Section; + const CItem &item = m_Database.Items[m_Database.Indices[index]]; + const UInt64 sectionIndex = item.Section; Int32 askMode= testMode ? NExtract::NAskMode::kTest : NExtract::NAskMode::kExtract; @@ -645,7 +652,7 @@ STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, UInt64 folderIndex = m_Database.GetFolder(index); - UInt64 compressedPos = m_Database.ContentOffset + section.Offset; + const UInt64 compressedPos = m_Database.ContentOffset + section.Offset; RINOK(lzxDecoderSpec->SetParams_and_Alloc(lzxInfo.GetNumDictBits())); const CItem *lastItem = &item; @@ -673,9 +680,8 @@ STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, { for (; i < numItems; i++) { - UInt32 nextIndex = allFilesMode ? i : indices[i]; - int entryIndex = m_Database.Indices[nextIndex]; - const CItem &nextItem = m_Database.Items[entryIndex]; + const UInt32 nextIndex = allFilesMode ? i : indices[i]; + const CItem &nextItem = m_Database.Items[m_Database.Indices[nextIndex]]; if (nextItem.Section != sectionIndex) break; UInt64 nextFolderIndex = m_Database.GetFolder(nextIndex); diff --git a/CPP/7zip/Archive/Chm/ChmIn.cpp b/CPP/7zip/Archive/Chm/ChmIn.cpp index d7556b89..6bdf2af4 100644 --- a/CPP/7zip/Archive/Chm/ChmIn.cpp +++ b/CPP/7zip/Archive/Chm/ChmIn.cpp @@ -656,7 +656,7 @@ static AString GetSectionPrefix(const AString &name) #define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; } -static int CompareFiles(const int *p1, const int *p2, void *param) +static int CompareFiles(const unsigned *p1, const unsigned *p2, void *param) { const CObjectVector<CItem> &items = *(const CObjectVector<CItem> *)param; const CItem &item1 = items[*p1]; @@ -731,7 +731,7 @@ HRESULT CInArchive::OpenHighLevel(IInStream *inStream, CFilesDatabase &database) RINOK(DecompressStream(inStream, database, kNameList)); /* UInt16 length = */ ReadUInt16(); UInt16 numSections = ReadUInt16(); - for (int i = 0; i < numSections; i++) + for (unsigned i = 0; i < numSections; i++) { CSectionInfo section; UInt16 nameLen = ReadUInt16(); @@ -766,10 +766,10 @@ HRESULT CInArchive::OpenHighLevel(IInStream *inStream, CFilesDatabase &database) RINOK(DecompressStream(inStream, database, transformPrefix + kTransformList)); if ((_chunkSize & 0xF) != 0) return S_FALSE; - int numGuids = (int)(_chunkSize / 0x10); + unsigned numGuids = (unsigned)(_chunkSize / 0x10); if (numGuids < 1) return S_FALSE; - for (int i = 0; i < numGuids; i++) + for (unsigned i = 0; i < numGuids; i++) { CMethodInfo method; ReadGUID(method.Guid); @@ -803,14 +803,17 @@ HRESULT CInArchive::OpenHighLevel(IInStream *inStream, CFilesDatabase &database) return S_FALSE; { - int n = GetLog(ReadUInt32()); + // There is bug in VC6, if we use function call as parameter for inline function + UInt32 val32 = ReadUInt32(); + int n = GetLog(val32); if (n < 0 || n > 16) return S_FALSE; li.ResetIntervalBits = n; } { - int n = GetLog(ReadUInt32()); + UInt32 val32 = ReadUInt32(); + int n = GetLog(val32); if (n < 0 || n > 16) return S_FALSE; li.WindowSizeBits = n; diff --git a/CPP/7zip/Archive/Chm/ChmIn.h b/CPP/7zip/Archive/Chm/ChmIn.h index dc5e8263..60852852 100644 --- a/CPP/7zip/Archive/Chm/ChmIn.h +++ b/CPP/7zip/Archive/Chm/ChmIn.h @@ -177,25 +177,25 @@ class CFilesDatabase: public CDatabase { public: bool LowLevel; - CRecordVector<int> Indices; + CUIntVector Indices; CObjectVector<CSectionInfo> Sections; - UInt64 GetFileSize(int fileIndex) const { return Items[Indices[fileIndex]].Size; } - UInt64 GetFileOffset(int fileIndex) const { return Items[Indices[fileIndex]].Offset; } + UInt64 GetFileSize(unsigned fileIndex) const { return Items[Indices[fileIndex]].Size; } + UInt64 GetFileOffset(unsigned fileIndex) const { return Items[Indices[fileIndex]].Offset; } - UInt64 GetFolder(int fileIndex) const + UInt64 GetFolder(unsigned fileIndex) const { const CItem &item = Items[Indices[fileIndex]]; - const CSectionInfo §ion = Sections[(int)item.Section]; + const CSectionInfo §ion = Sections[(unsigned)item.Section]; if (section.IsLzx()) return section.Methods[0].LzxInfo.GetFolder(item.Offset); return 0; } - UInt64 GetLastFolder(int fileIndex) const + UInt64 GetLastFolder(unsigned fileIndex) const { const CItem &item = Items[Indices[fileIndex]]; - const CSectionInfo §ion = Sections[(int)item.Section]; + const CSectionInfo §ion = Sections[(unsigned)item.Section]; if (section.IsLzx()) return section.Methods[0].LzxInfo.GetFolder(item.Offset + item.Size - 1); return 0; |