mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-12-14 12:09:36 +00:00
Most remaining level editor work
This commit is contained in:
@@ -137,21 +137,21 @@ namespace PortabilityLayer
|
||||
|
||||
// -1 = path precedes item, 1 = path succeeds item
|
||||
if (delta < 0)
|
||||
{
|
||||
lastFileExclusive = midFile;
|
||||
midFile = (firstFile + lastFileExclusive) / 2;
|
||||
}
|
||||
else if (delta > 0)
|
||||
{
|
||||
const bool isPathPrefix = ((itemNameLength > prefixLen) && !memcmp(prefix, itemPath, prefixLen));
|
||||
if (isPathPrefix)
|
||||
return true;
|
||||
else
|
||||
{
|
||||
firstFile = midFile + 1;
|
||||
lastFileExclusive = midFile;
|
||||
midFile = (firstFile + lastFileExclusive) / 2;
|
||||
}
|
||||
}
|
||||
else if (delta > 0)
|
||||
{
|
||||
firstFile = midFile + 1;
|
||||
midFile = (firstFile + lastFileExclusive) / 2;
|
||||
}
|
||||
else //if(delta == 0)
|
||||
{
|
||||
// Found the directory
|
||||
@@ -163,6 +163,40 @@ namespace PortabilityLayer
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ZipFileProxy::FindFirstWithPrefix(const char *prefix, size_t &outFileIndex) const
|
||||
{
|
||||
size_t prefixLen = strlen(prefix);
|
||||
|
||||
// Could do binary search, but it's much more complicated in this case, just do linear scan...
|
||||
for (size_t i = 0; i < m_numFiles; i++)
|
||||
{
|
||||
const UnalignedPtr<PortabilityLayer::ZipCentralDirectoryFileHeader> itemPtr = m_sortedFiles[i];
|
||||
const PortabilityLayer::ZipCentralDirectoryFileHeader item = itemPtr.Get();
|
||||
|
||||
const uint16_t itemNameLength = item.m_fileNameLength;
|
||||
const char *itemPath = GetZipItemName(itemPtr);
|
||||
|
||||
const int delta = ZipDirectorySearchPredicateResolved(prefix, itemPath, itemNameLength);
|
||||
if (delta == 0)
|
||||
continue;
|
||||
|
||||
if (delta < 0)
|
||||
{
|
||||
const bool isPathPrefix = ((itemNameLength > prefixLen) && !memcmp(prefix, itemPath, prefixLen));
|
||||
|
||||
if (isPathPrefix)
|
||||
{
|
||||
outFileIndex = i;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ZipFileProxy::LoadFile(size_t index, void *outBuffer)
|
||||
{
|
||||
ZipCentralDirectoryFileHeader centralDirHeader = m_sortedFiles[index].Get();
|
||||
@@ -203,6 +237,15 @@ namespace PortabilityLayer
|
||||
return m_sortedFiles[index].Get().m_uncompressedSize;
|
||||
}
|
||||
|
||||
void ZipFileProxy::GetFileName(size_t index, const char *&outName, size_t &outLength) const
|
||||
{
|
||||
const UnalignedPtr<PortabilityLayer::ZipCentralDirectoryFileHeader> itemPtr = m_sortedFiles[index];
|
||||
const PortabilityLayer::ZipCentralDirectoryFileHeader item = itemPtr.Get();
|
||||
|
||||
outLength = item.m_fileNameLength;
|
||||
outName = GetZipItemName(itemPtr);
|
||||
}
|
||||
|
||||
ZipFileProxy *ZipFileProxy::Create(IOStream *stream)
|
||||
{
|
||||
MemoryManager *mm = MemoryManager::GetInstance();
|
||||
|
||||
Reference in New Issue
Block a user