Most remaining level editor work

This commit is contained in:
elasota
2020-03-01 17:01:35 -05:00
parent abd4f1a978
commit 7b27d6c6b5
48 changed files with 1211 additions and 945 deletions

View File

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