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