/* WARNING: Type propagation algorithm not settling */

ushort * FUN_0047ce1c(uint param_1,ushort *param_2,ushort *param_3,undefined4 *param_4)

{
  byte bVar1;
  ushort uVar2;
  undefined4 *puVar3;
  uint uVar4;
  ushort *puVar5;
  byte *in_t0;
  uint uVar6;
  ushort *puVar7;
  
  uVar4 = param_1 & 0xff;
  if (uVar4 == 0x50) {
    puVar3 = (undefined4 *)((uint)((int)param_3 + 3) & 0xfffffffc);
    in_t0 = (byte *)*puVar3;
    puVar5 = (ushort *)(puVar3 + 1);
    goto LAB_0047cfa4;
  }
  puVar5 = param_3;
  switch(param_1 & 0xf) {
  case 0:
  case 3:
  case 0xb:
    in_t0 = *(byte **)param_3;
    puVar5 = param_3 + 2;
    break;
  case 1:
    in_t0 = (byte *)0x0;
    uVar6 = 0;
    do {
      uVar2 = *puVar5;
      puVar5 = (ushort *)((int)puVar5 + 1);
      in_t0 = (byte *)((uint)in_t0 | ((byte)uVar2 & 0x7f) << (uVar6 & 0x1f));
      uVar6 = uVar6 + 7;
    } while ((char)(byte)uVar2 < '\0');
    break;
  case 2:
    in_t0 = (byte *)(uint)*param_3;
    goto LAB_0047cf3c;
  case 4:
  case 0xc:
    in_t0 = *(byte **)param_3;
    puVar5 = param_3 + 4;
    break;
  default:
    puVar7 = param_3;
    FUN_00485c50();
    puVar5 = param_3;
    param_3 = puVar7;
    break;
  case 9:
    in_t0 = (byte *)0x0;
    uVar6 = 0;
    do {
      bVar1 = (byte)*puVar5;
      puVar5 = (ushort *)((int)puVar5 + 1);
      in_t0 = (byte *)((uint)in_t0 | (bVar1 & 0x7f) << (uVar6 & 0x1f));
      uVar6 = uVar6 + 7;
    } while ((char)bVar1 < '\0');
    if ((uVar6 < 0x20) && ((bVar1 & 0x40) != 0)) {
      in_t0 = (byte *)(-1 << (uVar6 & 0x1f) | (uint)in_t0);
    }
    break;
  case 10:
    in_t0 = (byte *)(int)(short)*param_3;
LAB_0047cf3c:
    puVar5 = param_3 + 1;
  }
  if (in_t0 != (byte *)0x0) {
    if ((uVar4 & 0x70) == 0x10) {
      param_2 = param_3;
    }
    in_t0 = in_t0 + (int)param_2;
    if ((char)uVar4 < '\0') {
      in_t0 = *(byte **)in_t0;
    }
  }
LAB_0047cfa4:
  *param_4 = in_t0;
  return puVar5;
}