uint FUN_00403a20(uint param_1,int param_2,uint param_3)

{
  uint *puVar1;
  int iVar2;
  uint uVar3;
  uint *puVar4;
  uint uVar5;
  uint local_a8 [32];
  
  uVar5 = 1 << (param_1 & 0x1f);
  puVar4 = local_a8 + (param_1 >> 5);
  uVar3 = 0;
  puVar1 = local_a8;
  do {
    do {
      do {
        *puVar1 = 0;
        puVar1 = puVar1 + 1;
      } while (puVar1 != (uint *)&stack0xffffffd8);
      *puVar4 = *puVar4 | uVar5;
      iVar2 = FUN_0047f0b0(param_1 + 1,local_a8,0,0,0);
      puVar1 = local_a8;
    } while ((iVar2 < 0) || ((uVar5 & *puVar4) == 0));
    iVar2 = FUN_0047f050(param_1,param_2 + uVar3,param_3 - uVar3);
    if (iVar2 < 1) {
      return uVar3;
    }
    uVar3 = uVar3 + iVar2;
    if (*(char *)(param_2 + uVar3 + -1) == '\0') {
      return uVar3;
    }
  } while (param_3 < uVar3);
  return uVar3;
}