/* WARNING: Removing unreachable block (ram,0x00404068) */
/* WARNING: Removing unreachable block (ram,0x004041b0) */
undefined4 get_chr_from_file(char *param_1,char param_2,ushort *param_3,undefined4 param_4)
{
uint uVar1;
bool bVar2;
uint uVar3;
ushort uVar4;
char *__ptr;
FILE *__stream;
size_t sVar5;
uint uVar6;
uint uVar7;
uint uVar8;
uint uVar9;
int iVar10;
int iVar11;
int iVar12;
uint uVar13;
int iVar14;
uint uVar15;
uint uVar16;
undefined4 uVar17;
uint uVar18;
uint uVar19;
uint uVar20;
uint uVar21;
if (((param_1 == (char *)0x0) || (param_3 == (ushort *)0x0)) ||
(__ptr = (char *)malloc(10), __ptr == (char *)0x0)) { //possible issue identified - semgrep
__stream = (FILE *)0x0;
LAB_00404428:
uVar17 = 0xffffffff;
goto LAB_0040442c;
}
__stream = fopen(param_1,"rb") //possible issue identified - semgrep
if (((((__stream == (FILE *)0x0) || (sVar5 = fread(__ptr,10,1,__stream), sVar5 == 0)) || //possible issue identified - semgrep
((*__ptr != -2 || ((__ptr[1] != '5' || (__ptr[2] != '0')))))) || (__ptr[3] != '9')) ||
(__ptr[4] != '9')) goto LAB_00404484;
uVar4 = *(ushort *)(__ptr + 6);
__ptr = (char *)realloc(__ptr,uVar4 + 9) //possible issue identified - semgrep
if (__ptr == (char *)0x0) goto LAB_00404428;
fseek(__stream,0,2);
uVar6 = ftell(__stream);
if (uVar6 < *(ushort *)(__ptr + 6) + 9) {
LAB_00404484:
uVar17 = 0xffffffff;
}
else {
fseek(__stream,0,0);
sVar5 = fread(__ptr,uVar4 + 9,1,__stream) //possible issue identified - semgrep
if (sVar5 != 1) goto LAB_00404484;
iVar11 = (int)(char)(param_2 - 0x21U & (char)~((char)(param_2 - 0x21U) >> 7) >> 7);
uVar18 = 0;
uVar6 = 0;
for (iVar12 = 0; iVar12 < (int)(uint)*(ushort *)(__ptr + 6); iVar12 = iVar12 + 1) {
if (iVar12 == iVar11) {
uVar6 = uVar18;
}
uVar18 = uVar18 + (byte)__ptr[iVar12 + 9] & 0xffff;
}
uVar7 = uVar6 >> 3;
uVar9 = uVar6 + (byte)__ptr[iVar11 + 9] & 0xffff;
uVar20 = uVar9 >> 3;
uVar9 = uVar9 + uVar20 * -8 & 0xffff;
iVar11 = alloc_image(param_3,(uint)(byte)__ptr[iVar11 + 9],__ptr[8]);
if (iVar11 != 0) goto LAB_00404484;
uVar21 = (uVar20 - uVar7) + 1 & 0xffff;
fseek(__stream,uVar7 + 1,1);
for (uVar20 = 0; uVar19 = 0, (int)uVar20 < (int)(uint)(byte)__ptr[8]; uVar20 = uVar20 + 1) {
for (iVar11 = 0; iVar11 < (int)uVar21; iVar11 = iVar11 + 1) {
uVar8 = fgetc(__stream) //possible issue identified - semgrep
uVar15 = uVar6 + uVar7 * -8 & 0xffff;
if (iVar11 != 0) {
uVar15 = 0;
}
bVar2 = uVar9 < uVar15;
uVar16 = uVar9;
if (iVar11 != uVar21 - 1) {
uVar16 = 8;
bVar2 = 8 < uVar15;
}
if (!bVar2) {
uVar13 = 7 - uVar15;
iVar12 = ((uVar19 & 0xffff) + (uVar20 & 0xffff) * (uint)*param_3) * 3;
iVar14 = 0;
while( true ) {
uVar1 = uVar13 & 0x1f;
iVar10 = iVar14 + uVar15;
uVar3 = uVar13 & 0x1f;
iVar14 = iVar14 + 1;
uVar13 = uVar13 - 1;
if ((int)uVar16 <= iVar10) break;
if ((int)(1 << uVar1 & uVar8 & 0xff) >> uVar3 != 0) {
*(char *)(*(int *)(param_3 + 2) + iVar12) = (char)param_4;
*(char *)(*(int *)(param_3 + 2) + iVar12 + 1) = (char)((uint)param_4 >> 8);
*(char *)(*(int *)(param_3 + 2) + iVar12 + 2) = (char)((uint)param_4 >> 0x10);
}
iVar12 = iVar12 + 3;
}
}
uVar19 = uVar19 + (uVar16 - uVar15);
}
fseek(__stream,(uVar18 >> 3) - uVar21 & 0xffff,1);
}
uVar17 = 0;
}
free(__ptr);
LAB_0040442c:
if (__stream != (FILE *)0x0) {
fclose(__stream);
}
return uVar17;
}