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;
}