mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-09-23 14:53:52 +00:00
Import indexed strings as text files
This commit is contained in:
@@ -342,25 +342,62 @@ PLError_t AEProcessAppleEvent(EventRecord *evt)
|
||||
void GetIndString(unsigned char *str, int stringsID, int fnameIndex)
|
||||
{
|
||||
if (fnameIndex < 1)
|
||||
{
|
||||
str[0] = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
THandle<uint8_t> istrRes = PortabilityLayer::ResourceManager::GetInstance()->GetAppResource('STR#', stringsID).StaticCast<uint8_t>();
|
||||
if (istrRes && *istrRes)
|
||||
{
|
||||
const uint8_t *contentsBytes = *istrRes;
|
||||
const BEUInt16_t *pArraySize = reinterpret_cast<const BEUInt16_t*>(contentsBytes);
|
||||
const uint8_t *endPos = contentsBytes + istrRes.MMBlock()->m_size;
|
||||
const uint8_t *lineStart = contentsBytes;
|
||||
const uint8_t *lineEnd = contentsBytes;
|
||||
|
||||
const uint16_t arraySize = *pArraySize;
|
||||
for (;;)
|
||||
{
|
||||
if (contentsBytes == endPos)
|
||||
{
|
||||
if (fnameIndex == 1)
|
||||
{
|
||||
lineEnd = contentsBytes;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
str[0] = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (fnameIndex > static_cast<int>(arraySize))
|
||||
return;
|
||||
const uint8_t lchar = contentsBytes[0];
|
||||
|
||||
const uint8_t *strStart = contentsBytes + 2;
|
||||
for (int i = 1; i < fnameIndex; i++)
|
||||
strStart += (*strStart) + 1;
|
||||
if (lchar == '\n')
|
||||
{
|
||||
if (fnameIndex == 1)
|
||||
{
|
||||
lineEnd = contentsBytes;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
fnameIndex--;
|
||||
contentsBytes++;
|
||||
lineStart = lineEnd = contentsBytes;
|
||||
}
|
||||
}
|
||||
else
|
||||
contentsBytes++;
|
||||
}
|
||||
|
||||
str[0] = strStart[0];
|
||||
memcpy(str + 1, strStart + 1, *strStart);
|
||||
ptrdiff_t strLength = lineEnd - lineStart;
|
||||
if (strLength < 0 || strLength > 255)
|
||||
strLength = 255;
|
||||
|
||||
str[0] = static_cast<uint8_t>(strLength);
|
||||
|
||||
memcpy(str + 1, lineStart, strLength);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -308,6 +308,8 @@ namespace PortabilityLayer
|
||||
extension = ".bmp";
|
||||
validationRule = ResourceValidationRules::kBMP;
|
||||
}
|
||||
else if (resTypeID == ResTypeID('STR#'))
|
||||
extension = ".txt";
|
||||
|
||||
char resourceFile[64];
|
||||
|
||||
|
@@ -719,6 +719,46 @@ bool ImportSound(std::vector<uint8_t> &outWAV, const void *inData, size_t inSize
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ImportIndexedString(std::vector<uint8_t> &outTXT, const void *inData, size_t inSize)
|
||||
{
|
||||
size_t remainingSize = inSize;
|
||||
const uint8_t *inBytes = static_cast<const uint8_t*>(inData);
|
||||
|
||||
if (remainingSize < 2)
|
||||
return false;
|
||||
|
||||
const size_t arraySize = (inBytes[0] << 8) + inBytes[1];
|
||||
|
||||
inBytes += 2;
|
||||
remainingSize -= 2;
|
||||
|
||||
for (size_t i = 0; i < arraySize; i++)
|
||||
{
|
||||
if (remainingSize < 1)
|
||||
return false;
|
||||
|
||||
uint8_t strLength = *inBytes;
|
||||
|
||||
inBytes++;
|
||||
remainingSize--;
|
||||
|
||||
if (strLength > remainingSize)
|
||||
return false;
|
||||
|
||||
if (i != 0)
|
||||
outTXT.push_back('\n');
|
||||
|
||||
for (size_t j = 0; j < strLength; j++)
|
||||
{
|
||||
outTXT.push_back(*inBytes);
|
||||
inBytes++;
|
||||
remainingSize--;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
if (argc != 4)
|
||||
@@ -765,6 +805,7 @@ int main(int argc, const char **argv)
|
||||
const PortabilityLayer::ResTypeID pictTypeID = PortabilityLayer::ResTypeID('PICT');
|
||||
const PortabilityLayer::ResTypeID dateTypeID = PortabilityLayer::ResTypeID('Date');
|
||||
const PortabilityLayer::ResTypeID sndTypeID = PortabilityLayer::ResTypeID('snd ');
|
||||
const PortabilityLayer::ResTypeID indexStringTypeID = PortabilityLayer::ResTypeID('STR#');
|
||||
|
||||
for (size_t tlIndex = 0; tlIndex < typeListCount; tlIndex++)
|
||||
{
|
||||
@@ -813,6 +854,17 @@ int main(int argc, const char **argv)
|
||||
if (ImportSound(entry.m_contents, resData, resSize))
|
||||
contents.push_back(entry);
|
||||
}
|
||||
else if (typeList.m_resType == indexStringTypeID)
|
||||
{
|
||||
PlannedEntry entry;
|
||||
char resName[256];
|
||||
sprintf_s(resName, "%s/%i.txt", resTag.m_id, static_cast<int>(res.m_resID));
|
||||
|
||||
entry.m_name = resName;
|
||||
|
||||
if (ImportIndexedString(entry.m_contents, resData, resSize))
|
||||
contents.push_back(entry);
|
||||
}
|
||||
else
|
||||
{
|
||||
PlannedEntry entry;
|
||||
|
Reference in New Issue
Block a user