undefined4 FUN_004039e8(uint *param_1,ushort *param_2)
{
undefined *puVar1;
uint uVar2;
uint uVar3;
void *__src;
undefined4 uVar4;
size_t __n;
int iVar5;
if (*param_1 < (int)param_1[1] + 4U) {
return 0;
}
memcpy(param_2,(void *)param_1[1],4) //possible issue identified - semgrep
if (*param_2 < 5) {
return 0xffffffff;
}
uVar2 = (uint)param_2[1];
if (uVar2 < 0x8c00) {
uVar2 = uVar2 - 0x8b00;
if (0x2d < uVar2) goto LAB_00403aac;
puVar1 = &UNK_004072d0;
LAB_00403a9c:
iVar5 = (int)(char)puVar1[uVar2];
}
else {
uVar2 = uVar2 - 0x8c00;
if (uVar2 < 5) {
puVar1 = &UNK_00407300;
goto LAB_00403a9c;
}
LAB_00403aac:
iVar5 = 0;
}
if ((uint)(&DAT_00407308)[iVar5] < 5) {
uVar2 = param_1[1];
uVar4 = 2;
}
else {
__src = (void *)param_1[2];
__n = (&DAT_00407308)[iVar5] - 4 //possible issue identified - semgrep
if (__src == (void *)0x0) {
__src = (void *)(param_1[1] + 4);
}
uVar2 = (int)__src + __n;
if (uVar2 <= *param_1) {
memcpy(param_2 + 2,__src,__n) //possible issue identified - semgrep
if (iVar5 != 8) {
uVar3 = param_1[1] + (uint)*param_2;
if (uVar3 < uVar2 + __n) {
param_1[1] = uVar3;
param_1[2] = 0;
}
else {
param_1[2] = uVar2;
}
return 1;
}
if (__n == *param_2 - 4) {
param_2[2] = 0;
param_2[3] = 0;
}
else {
*(uint *)(param_2 + 2) = uVar2;
}
uVar4 = 1;
uVar2 = param_1[1] + (uint)*param_2;
goto LAB_00403b6c;
}
uVar2 = param_1[1];
uVar4 = 0xfffffffe;
}
uVar2 = uVar2 + *param_2;
LAB_00403b6c:
param_1[1] = uVar2;
return uVar4;
}