int __fastcall nn::ui2d::ArcExtractor::ReadEntry(nn::ui2d::ArcExtractor *a1, int *a2, nn::ui2d::ArcEntry *a3, int a4)
{
unsigned int fileCount; // w10
int v5; // w8
bool v6; // w9
unsigned int v7; // w11
__int64 v9; // x20
__int64 v12; // x24
nn::ui2d::ArcEntry *v13; // x25
nn::ui2d::ArcExtractor::FATEntry *m_pFATEntries; // x10
unsigned int nameOffset; // w11
unsigned int v16; // w12
const char *m_pFNTBlock; // x8
__int64 v18; // x10
nn::util *v19; // x0
unsigned int hash; // w8
unsigned int v21; // w10
__int64 v22; // x9
const char *v23; // x10
char *v24; // x8
const char *v25; // x11
const char *v26; // x10
unsigned int v28; // w10
unsigned int v29; // w11
fileCount = a1->m_pFATBlockHeader->fileCount;
v5 = *a2;
v6 = a1->m_EndianType == 0;
v7 = bswap32(fileCount) >> 16;
LODWORD(v9) = 0;
if ( !a1->m_EndianType )
LOWORD(fileCount) = v7;
if ( a4 >= 1 && v5 < fileCount )
{
v9 = 0;
v12 = a4;
v13 = a3;
do
{
m_pFATEntries = a1->m_pFATEntries;
nameOffset = m_pFATEntries[v5].nameOffset;
v16 = bswap32(nameOffset);
if ( v6 )
nameOffset = v16;
if ( nameOffset )
{
m_pFNTBlock = a1->m_pFNTBlock;
v18 = nameOffset & 0xFFFFFF;
if ( &m_pFNTBlock[v18] <= a1->m_pDataBlock )
{
v22 = 0;
v23 = &m_pFNTBlock[(4 * v18)];
while ( 1 )
{
v24 = &v13->name[v22];
if ( !v23[v22] )
{
v26 = &v23[v22];
goto LABEL_28;
}
v25 = &v23[v22];
*v24 = v23[v22];
if ( !v23[v22 + 1] )
{
v26 = v25 + 1;
++v24;
goto LABEL_28;
}
v24[1] = v23[v22 + 1];
if ( !v25[2] )
{
v26 = v25 + 2;
v24 += 2;
goto LABEL_28;
}
v24[2] = v25[2];
if ( !v25[3] )
{
v26 = v25 + 3;
v24 += 3;
goto LABEL_28;
}
v24[3] = v25[3];
if ( !v25[4] )
break;
v22 += 5;
v24[4] = v25[4];
if ( v22 == 255 )
{
v26 = &v23[v22];
v24 = &v13->name[v22];
goto LABEL_28;
}
}
v26 = v25 + 4;
v24 += 4;
LABEL_28:
*v24 = 0;
while ( *v26++ )
;
}
else
{
a3[v9].name[0] = 0;
}
}
else
{
v19 = &a3[v9];
hash = m_pFATEntries[v5].hash;
v21 = bswap32(hash);
if ( v6 )
nn::util::SNPrintf(v19, 0x100, "%08x", v21);
else
nn::util::SNPrintf(v19, 0x100, "%08x", hash);
}
v28 = a1->m_pFATBlockHeader->fileCount;
v5 = *a2 + ++v9;
v6 = a1->m_EndianType == 0;
v29 = bswap32(v28) >> 16;
if ( !a1->m_EndianType )
LOWORD(v28) = v29;
if ( v9 >= v12 )
break;
++v13;
}
while ( v5 < v28 );
}
*a2 = v5;
return v9;
}