int FUN_00405914(int *param_1,uint param_2,int param_3)
{
uint uVar1;
int iVar2;
undefined4 *puVar3;
char *pcVar4;
uint uVar5;
if ((param_3 == 0) || (param_2 == 0)) {
return param_1[1];
}
if ((char)param_1[5] == '\0') {
uVar5 = (int)param_1 + 0xbU & 3;
uVar1 = (uint)(param_1 + 2) & 3;
uVar5 = (*(int *)(((int)param_1 + 0xbU) - uVar5) << (3 - uVar5) * 8 |
(uint)param_1 & 0xffffffffU >> (uVar5 + 1) * 8) & -1 << (4 - uVar1) * 8 |
*(uint *)((int)(param_1 + 2) - uVar1) >> uVar1 * 8;
if (param_2 <= uVar5 - param_1[3]) goto LAB_00405a44;
iVar2 = FUN_0048470c(uVar5 + 0x100);
if (iVar2 != 0) {
FUN_00483c90(iVar2,*param_1,param_1[3]);
*param_1 = iVar2;
param_1[1] = iVar2 + param_1[3];
param_1[2] = param_1[2] + 0x100;
*(undefined1 *)(param_1 + 5) = 1;
goto LAB_00405a44;
}
puVar3 = (undefined4 *)FUN_0047082c(4);
pcVar4 = "memory allocate error";
uVar5 = 0;
LAB_00405abc:
*puVar3 = pcVar4;
FUN_00472734(puVar3,&PTR_PTR_FUN_004af2b0,0);
}
else {
LAB_00405a44:
if (param_2 <= (uint)(param_1[2] - param_1[3])) goto LAB_00405b08;
uVar5 = param_2;
if (param_2 < 0x100) {
uVar5 = 0x100;
}
iVar2 = FUN_00485290(*param_1,uVar5 + param_1[3]);
*param_1 = iVar2;
if (iVar2 == 0) {
puVar3 = (undefined4 *)FUN_0047082c(4);
pcVar4 = "Realloc error";
goto LAB_00405abc;
}
}
param_1[2] = uVar5 + param_1[3];
param_1[1] = *param_1 + param_1[3];
LAB_00405b08:
FUN_00483c90(param_1[1],param_3,param_2);
param_1[1] = param_1[1] + param_2;
param_1[3] = param_2 + param_1[3];
param_1[4] = param_1[1] - *param_1;
return param_1[1] - param_2;
}