server-re/decomp/MessageServer_Release_x64/full/functions/0x1400f6e30.c

1208 lines
40 KiB
C

/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1
* Ghidra 12.1.2 decompiler output for 0x1400f6e30 FUN_1400f6e30
* Pseudocode, not original source. */
ulonglong FUN_1400f6e30(longlong *param_1,int param_2)
{
uint *puVar1;
uint uVar2;
char cVar3;
int iVar4;
uint uVar5;
uint uVar6;
undefined8 uVar7;
byte bVar8;
ushort uVar9;
uint uVar10;
uint uVar11;
int iVar12;
uint uVar13;
longlong lVar14;
uint *puVar15;
uint uVar16;
uint uVar17;
uint *puVar18;
ulonglong uVar19;
undefined1 *puVar20;
undefined1 *puVar21;
uint uVar22;
ulonglong uVar23;
uint local_res18;
uint local_res20;
undefined2 local_68;
undefined1 local_66;
undefined1 local_65;
undefined4 local_64;
uint local_60;
uint local_5c;
undefined1 *local_58;
if ((((param_1 == (longlong *)0x0) || (puVar1 = (uint *)param_1[5], puVar1 == (uint *)0x0)) ||
(param_1[2] == 0)) || ((*param_1 == 0 && ((int)param_1[1] != 0)))) {
return 0xfffffffe;
}
uVar17 = *puVar1;
uVar5 = puVar1[0x11];
uVar6 = puVar1[0x10];
if (uVar17 == 0xb) {
uVar17 = 0xc;
}
*puVar1 = uVar17;
uVar10 = *(uint *)(param_1 + 3);
puVar20 = (undefined1 *)param_1[2];
uVar16 = *(uint *)(param_1 + 1);
puVar15 = (uint *)*param_1;
local_res18 = 0;
local_res20 = uVar10;
local_60 = uVar10;
local_58 = puVar20;
local_5c = uVar16;
do {
if (0x1e < uVar17) {
return 0xfffffffe;
}
uVar23 = 0;
uVar13 = 0;
uVar11 = local_64;
switch(uVar17) {
case 0:
if (puVar1[2] == 0) {
*puVar1 = 0xc;
}
else {
for (; uVar5 < 0x10; uVar5 = uVar5 + 8) {
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar17 = *puVar15;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar17 << ((byte)uVar5 & 0x1f));
}
if (((puVar1[2] & 2) == 0) || (uVar6 != 0x8b1f)) {
puVar1[4] = 0;
if (*(longlong *)(puVar1 + 8) != 0) {
*(undefined4 *)(*(longlong *)(puVar1 + 8) + 0x40) = 0xffffffff;
}
if (((puVar1[2] & 1) == 0) ||
(uVar17 = (uVar6 & 0xff) * 0x100 + (uVar6 >> 8), uVar17 != (uVar17 / 0x1f) * 0x1f)) {
param_1[4] = (longlong)"incorrect header check";
*puVar1 = 0x1d;
}
else {
if (((byte)uVar6 & 0xf) != 8) goto LAB_1400f6fcf;
uVar5 = uVar5 - 4;
uVar17 = (uVar6 >> 4 & 0xf) + 8;
if (puVar1[10] == 0) {
puVar1[10] = uVar17;
}
else if (puVar1[10] < uVar17) {
param_1[4] = (longlong)"invalid window size";
*puVar1 = 0x1d;
uVar6 = uVar6 >> 4;
break;
}
puVar1[5] = 1 << (sbyte)uVar17;
uVar17 = FUN_1400fe5a0(0,(byte *)0x0,0);
puVar1[6] = uVar17;
*(uint *)((longlong)param_1 + 0x4c) = uVar17;
uVar5 = 0;
*puVar1 = ~(uVar6 >> 0xc) & 2 | 9;
uVar6 = 0;
puVar20 = local_58;
uVar10 = local_res20;
}
}
else {
uVar17 = FUN_1400f6e20(0,(uint *)0x0,0);
puVar1[6] = uVar17;
local_68 = 0x8b1f;
uVar17 = FUN_1400f6b00(uVar17,(uint *)&local_68,2);
uVar6 = 0;
uVar5 = 0;
puVar1[6] = uVar17;
*puVar1 = 1;
puVar20 = local_58;
uVar10 = local_res20;
}
}
break;
case 1:
for (; uVar5 < 0x10; uVar5 = uVar5 + 8) {
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar17 = *puVar15;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar17 << ((byte)uVar5 & 0x1f));
}
puVar1[4] = uVar6;
if ((char)uVar6 == '\b') {
if ((uVar6 & 0xe000) == 0) {
if (*(uint **)(puVar1 + 8) != (uint *)0x0) {
**(uint **)(puVar1 + 8) = uVar6 >> 8 & 1;
}
if ((puVar1[4] & 0x200) != 0) {
local_68 = (undefined2)uVar6;
uVar17 = FUN_1400f6b00(puVar1[6],(uint *)&local_68,2);
puVar1[6] = uVar17;
}
*puVar1 = 2;
uVar5 = uVar13;
uVar6 = uVar13;
do {
uVar2 = 0;
uVar11 = local_64;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar10 = *puVar15;
uVar17 = uVar5 + 8;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar10 << ((byte)uVar5 & 0x1f));
joined_r0x0001400f7116:
uVar5 = uVar17;
} while (uVar17 < 0x20);
if (*(longlong *)(puVar1 + 8) != 0) {
*(uint *)(*(longlong *)(puVar1 + 8) + 4) = uVar6;
}
if ((puVar1[4] & 0x200) != 0) {
local_68 = (undefined2)uVar6;
local_65 = (undefined1)(uVar6 >> 0x18);
local_66 = (undefined1)(uVar6 >> 0x10);
uVar17 = FUN_1400f6b00(puVar1[6],(uint *)&local_68,4);
puVar1[6] = uVar17;
}
*puVar1 = 3;
uVar5 = uVar13;
uVar6 = uVar13;
do {
uVar2 = 0;
uVar11 = local_64;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar10 = *puVar15;
uVar17 = uVar5 + 8;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar10 << ((byte)uVar5 & 0x1f));
joined_r0x0001400f7197:
uVar5 = uVar17;
} while (uVar17 < 0x10);
if (*(longlong *)(puVar1 + 8) != 0) {
*(uint *)(*(longlong *)(puVar1 + 8) + 8) = uVar6 & 0xff;
*(uint *)(*(longlong *)(puVar1 + 8) + 0xc) = uVar6 >> 8;
}
if ((puVar1[4] & 0x200) != 0) {
local_68 = (undefined2)uVar6;
uVar17 = FUN_1400f6b00(puVar1[6],(uint *)&local_68,2);
puVar1[6] = uVar17;
}
*puVar1 = 4;
uVar5 = uVar13;
uVar6 = uVar13;
goto switchD_1400f6ef1_caseD_4;
}
param_1[4] = (longlong)"unknown header flags set";
*puVar1 = 0x1d;
}
else {
LAB_1400f6fcf:
param_1[4] = (longlong)"unknown compression method";
*puVar1 = 0x1d;
}
break;
case 2:
uVar17 = uVar5;
goto joined_r0x0001400f7116;
case 3:
uVar17 = uVar5;
goto joined_r0x0001400f7197;
case 4:
switchD_1400f6ef1_caseD_4:
if ((puVar1[4] & 0x400) == 0) {
uVar17 = uVar6;
if (*(longlong *)(puVar1 + 8) != 0) {
*(undefined8 *)(*(longlong *)(puVar1 + 8) + 0x10) = 0;
}
}
else {
for (; uVar5 < 0x10; uVar5 = uVar5 + 8) {
uVar2 = 0;
uVar11 = local_64;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar17 = *puVar15;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar17 << ((byte)uVar5 & 0x1f));
}
puVar1[0x12] = uVar6;
if (*(longlong *)(puVar1 + 8) != 0) {
*(uint *)(*(longlong *)(puVar1 + 8) + 0x18) = uVar6;
}
uVar5 = uVar13;
uVar17 = uVar13;
if ((puVar1[4] & 0x200) != 0) {
local_68 = (undefined2)uVar6;
uVar6 = FUN_1400f6b00(puVar1[6],(uint *)&local_68,2);
puVar1[6] = uVar6;
}
}
uVar6 = uVar17;
*puVar1 = 5;
case 5:
if ((puVar1[4] & 0x400) == 0) {
LAB_1400f7333:
puVar1[0x12] = 0;
*puVar1 = 6;
switchD_1400f6ef1_caseD_6:
if ((puVar1[4] & 0x800) == 0) {
if (*(longlong *)(puVar1 + 8) != 0) {
*(undefined8 *)(*(longlong *)(puVar1 + 8) + 0x20) = 0;
}
LAB_1400f73de:
puVar1[0x12] = 0;
*puVar1 = 7;
switchD_1400f6ef1_caseD_7:
uVar23 = 0;
if ((puVar1[4] & 0x1000) == 0) {
if (*(longlong *)(puVar1 + 8) != 0) {
*(undefined8 *)(*(longlong *)(puVar1 + 8) + 0x30) = 0;
}
LAB_1400f747e:
*puVar1 = 8;
puVar20 = local_58;
uVar10 = local_res20;
switchD_1400f6ef1_caseD_8:
if ((puVar1[4] & 0x200) != 0) {
for (; uVar5 < 0x10; uVar5 = uVar5 + 8) {
uVar2 = 0;
uVar11 = local_64;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar17 = *puVar15;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar17 << ((byte)uVar5 & 0x1f));
}
if (uVar6 != (ushort)puVar1[6]) {
param_1[4] = (longlong)"header crc mismatch";
*puVar1 = 0x1d;
break;
}
uVar5 = 0;
uVar6 = uVar5;
}
if (*(longlong *)(puVar1 + 8) != 0) {
*(uint *)(*(longlong *)(puVar1 + 8) + 0x3c) = (int)puVar1[4] >> 9 & 1;
*(undefined4 *)(*(longlong *)(puVar1 + 8) + 0x40) = 1;
}
uVar17 = FUN_1400f6e20(0,(uint *)0x0,0);
puVar1[6] = uVar17;
*(uint *)((longlong)param_1 + 0x4c) = uVar17;
LAB_1400f7519:
*puVar1 = 0xb;
puVar20 = local_58;
uVar10 = local_res20;
break;
}
puVar18 = puVar15;
uVar2 = uVar16;
uVar11 = local_64;
if (uVar16 != 0) {
do {
lVar14 = *(longlong *)(puVar1 + 8);
cVar3 = (char)*puVar18;
uVar17 = (int)uVar23 + 1;
uVar23 = (ulonglong)uVar17;
if (((lVar14 != 0) && (*(longlong *)(lVar14 + 0x30) != 0)) &&
(puVar1[0x12] < *(uint *)(lVar14 + 0x38))) {
*(char *)((ulonglong)puVar1[0x12] + *(longlong *)(lVar14 + 0x30)) = cVar3;
puVar1[0x12] = puVar1[0x12] + 1;
}
} while ((cVar3 != '\0') && (puVar18 = (uint *)((longlong)puVar18 + 1), uVar17 < uVar16)
);
if ((puVar1[4] & 0x200) != 0) {
if (puVar15 == (uint *)0x0) {
uVar10 = 0;
}
else {
uVar10 = FUN_1400f6b00(puVar1[6],puVar15,uVar17);
}
puVar1[6] = uVar10;
}
uVar16 = uVar16 - uVar17;
puVar15 = (uint *)((longlong)puVar15 + uVar23);
uVar2 = uVar16;
uVar11 = local_64;
if (cVar3 == '\0') goto LAB_1400f747e;
}
}
else {
puVar18 = puVar15;
uVar2 = uVar16;
uVar11 = local_64;
if (uVar16 != 0) {
do {
lVar14 = *(longlong *)(puVar1 + 8);
cVar3 = (char)*puVar18;
uVar17 = (int)uVar23 + 1;
uVar23 = (ulonglong)uVar17;
if (((lVar14 != 0) && (*(longlong *)(lVar14 + 0x20) != 0)) &&
(puVar1[0x12] < *(uint *)(lVar14 + 0x28))) {
*(char *)((ulonglong)puVar1[0x12] + *(longlong *)(lVar14 + 0x20)) = cVar3;
puVar1[0x12] = puVar1[0x12] + 1;
}
} while ((cVar3 != '\0') && (puVar18 = (uint *)((longlong)puVar18 + 1), uVar17 < uVar16)
);
if ((puVar1[4] & 0x200) != 0) {
if (puVar15 == (uint *)0x0) {
uVar10 = 0;
}
else {
uVar10 = FUN_1400f6b00(puVar1[6],puVar15,uVar17);
}
puVar1[6] = uVar10;
}
uVar16 = uVar16 - uVar17;
puVar15 = (uint *)((longlong)puVar15 + uVar23);
uVar2 = uVar16;
uVar11 = local_64;
if (cVar3 == '\0') goto LAB_1400f73de;
}
}
}
else {
uVar17 = puVar1[0x12];
uVar10 = uVar17;
if (uVar16 < uVar17) {
uVar10 = uVar16;
}
if (uVar10 != 0) {
lVar14 = *(longlong *)(puVar1 + 8);
if ((lVar14 != 0) && (*(longlong *)(lVar14 + 0x10) != 0)) {
uVar17 = *(int *)(lVar14 + 0x18) - uVar17;
uVar11 = uVar10;
if (*(uint *)(lVar14 + 0x1c) < uVar10 + uVar17) {
uVar11 = *(uint *)(lVar14 + 0x1c) - uVar17;
}
memcpy((void *)((ulonglong)uVar17 + *(longlong *)(lVar14 + 0x10)),puVar15,
(ulonglong)uVar11);
}
if ((puVar1[4] & 0x200) != 0) {
if (puVar15 != (uint *)0x0) {
uVar13 = FUN_1400f6b00(puVar1[6],puVar15,uVar10);
}
puVar1[6] = uVar13;
}
uVar16 = uVar16 - uVar10;
puVar15 = (uint *)((longlong)puVar15 + (ulonglong)uVar10);
puVar1[0x12] = puVar1[0x12] - uVar10;
}
uVar2 = uVar16;
uVar11 = local_64;
if (puVar1[0x12] == 0) goto LAB_1400f7333;
}
LAB_1400f76ca:
local_64 = uVar11;
uVar16 = uVar2;
uVar23 = (ulonglong)local_res18;
LAB_1400f76ce:
uVar17 = local_60;
param_1[2] = (longlong)local_58;
*param_1 = (longlong)puVar15;
*(uint *)(param_1 + 3) = local_res20;
*(uint *)(param_1 + 1) = uVar16;
puVar1[0x11] = uVar5;
puVar1[0x10] = uVar6;
if (((puVar1[0xb] == 0) && ((0x19 < (int)*puVar1 || (local_60 == *(uint *)(param_1 + 3))))) ||
(uVar7 = FUN_1400f69a0((longlong)param_1,local_60), (int)uVar7 == 0)) {
uVar17 = uVar17 - (int)param_1[3];
local_5c = local_5c - (int)param_1[1];
*(int *)((longlong)param_1 + 0x1c) = *(int *)((longlong)param_1 + 0x1c) + uVar17;
*(int *)((longlong)param_1 + 0xc) = *(int *)((longlong)param_1 + 0xc) + local_5c;
puVar1[7] = puVar1[7] + uVar17;
if ((puVar1[2] != 0) && (uVar17 != 0)) {
if (puVar1[4] == 0) {
uVar6 = FUN_1400fe5a0(puVar1[6],(byte *)(param_1[2] - (ulonglong)uVar17),uVar17);
}
else {
puVar15 = (uint *)(param_1[2] - (ulonglong)uVar17);
if (puVar15 == (uint *)0x0) {
uVar6 = 0;
}
else {
uVar6 = FUN_1400f6b00(puVar1[6],puVar15,uVar17);
}
}
puVar1[6] = uVar6;
*(uint *)((longlong)param_1 + 0x4c) = uVar6;
}
uVar6 = *puVar1;
if ((uVar6 == 0x13) || (uVar6 == 0xe)) {
iVar12 = 0x100;
}
else {
iVar12 = 0;
}
iVar4 = 0;
if (uVar6 == 0xb) {
iVar4 = 0x80;
}
*(uint *)(param_1 + 9) = iVar4 + iVar12 + (-(uint)(puVar1[1] != 0) & 0x40) + puVar1[0x11];
if (((local_5c != 0) || (uVar17 != 0)) && (param_2 != 4)) {
return uVar23;
}
if ((int)uVar23 != 0) {
return uVar23;
}
return 0xfffffffb;
}
*puVar1 = 0x1e;
LAB_1400f7729:
return 0xfffffffc;
case 6:
goto switchD_1400f6ef1_caseD_6;
case 7:
goto switchD_1400f6ef1_caseD_7;
case 8:
goto switchD_1400f6ef1_caseD_8;
case 9:
for (; uVar5 < 0x20; uVar5 = uVar5 + 8) {
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar17 = *puVar15;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar17 << ((byte)uVar5 & 0x1f));
}
uVar17 = (uVar6 >> 8 & 0xff00) + ((uVar6 & 0xff00) + uVar6 * 0x10000) * 0x100 +
(uVar6 >> 0x18);
puVar1[6] = uVar17;
*(uint *)((longlong)param_1 + 0x4c) = uVar17;
*puVar1 = 10;
uVar5 = uVar13;
uVar6 = uVar13;
case 10:
if (puVar1[3] == 0) {
param_1[2] = (longlong)puVar20;
*(uint *)(param_1 + 3) = uVar10;
*param_1 = (longlong)puVar15;
*(uint *)(param_1 + 1) = uVar16;
puVar1[0x10] = uVar6;
puVar1[0x11] = uVar5;
return 2;
}
uVar17 = FUN_1400fe5a0(0,(byte *)0x0,0);
puVar1[6] = uVar17;
*(uint *)((longlong)param_1 + 0x4c) = uVar17;
*puVar1 = 0xb;
puVar20 = local_58;
uVar10 = local_res20;
switchD_1400f6ef1_caseD_b:
uVar2 = uVar16;
uVar11 = local_64;
if ((param_2 != 5) && (param_2 != 6)) {
switchD_1400f6ef1_caseD_c:
if (puVar1[1] == 0) {
for (; uVar11 = local_64, uVar5 < 3; uVar5 = uVar5 + 8) {
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar17 = *puVar15;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar17 << ((byte)uVar5 & 0x1f));
}
puVar1[1] = uVar6 & 1;
uVar17 = uVar6 >> 1 & 3;
if (uVar17 == 0) {
*puVar1 = 0xd;
}
else {
if (uVar17 != 1) {
if (uVar17 == 2) {
*puVar1 = 0x10;
uVar5 = uVar5 - 3;
uVar6 = uVar6 >> 3;
}
else {
if (uVar17 != 3) goto LAB_1400f7755;
uVar5 = uVar5 - 3;
param_1[4] = (longlong)"invalid block type";
*puVar1 = 0x1d;
uVar6 = uVar6 >> 3;
}
break;
}
puVar1[0x1a] = 9;
puVar1[0x1b] = 5;
*(undefined **)(puVar1 + 0x16) = &DAT_14014b0d0;
*puVar1 = 0x13;
*(undefined **)(puVar1 + 0x18) = &DAT_14014b8d0;
if (param_2 == 6) {
uVar6 = uVar6 >> 3;
uVar5 = uVar5 - 3;
uVar2 = uVar16;
goto LAB_1400f76ca;
}
}
LAB_1400f7755:
uVar5 = uVar5 - 3;
uVar6 = uVar6 >> 3;
}
else {
*puVar1 = 0x1a;
uVar17 = uVar5 & 7;
uVar5 = uVar5 - uVar17;
uVar6 = uVar6 >> (sbyte)uVar17;
}
break;
}
goto LAB_1400f76ca;
case 0xb:
goto switchD_1400f6ef1_caseD_b;
case 0xc:
goto switchD_1400f6ef1_caseD_c;
case 0xd:
uVar6 = uVar6 >> (sbyte)(uVar5 & 7);
for (uVar5 = uVar5 - (uVar5 & 7); uVar5 < 0x20; uVar5 = uVar5 + 8) {
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar17 = *puVar15;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar17 << ((byte)uVar5 & 0x1f));
}
if ((uVar6 & 0xffff) == ~uVar6 >> 0x10) {
puVar1[0x12] = uVar6 & 0xffff;
*puVar1 = 0xe;
uVar5 = uVar13;
uVar6 = uVar13;
uVar2 = uVar16;
if (param_2 == 6) goto LAB_1400f76ca;
goto switchD_1400f6ef1_caseD_e;
}
param_1[4] = (longlong)"invalid stored block lengths";
*puVar1 = 0x1d;
break;
case 0xe:
switchD_1400f6ef1_caseD_e:
*puVar1 = 0xf;
case 0xf:
uVar17 = puVar1[0x12];
if (uVar17 == 0) {
*puVar1 = 0xb;
break;
}
if (uVar16 < uVar17) {
uVar17 = uVar16;
}
if (uVar10 < uVar17) {
uVar17 = uVar10;
}
uVar23 = (ulonglong)uVar17;
uVar2 = uVar16;
if (uVar17 != 0) {
memcpy(puVar20,puVar15,uVar23);
local_res20 = local_res20 - uVar17;
puVar15 = (uint *)((longlong)puVar15 + uVar23);
local_58 = local_58 + uVar23;
uVar16 = uVar16 - uVar17;
puVar1[0x12] = puVar1[0x12] - uVar17;
puVar20 = local_58;
uVar10 = local_res20;
break;
}
goto LAB_1400f76ca;
case 0x10:
for (; uVar5 < 0xe; uVar5 = uVar5 + 8) {
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar17 = *puVar15;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar17 << ((byte)uVar5 & 0x1f));
}
uVar5 = uVar5 - 0xe;
uVar22 = uVar6 >> 10;
uVar17 = (uVar6 & 0x1f) + 0x101;
uVar13 = (uVar6 >> 5 & 0x1f) + 1;
uVar6 = uVar6 >> 0xe;
puVar1[0x1d] = uVar17;
puVar1[0x1e] = uVar13;
puVar1[0x1c] = (uVar22 & 0xf) + 4;
if ((uVar17 < 0x11f) && (uVar13 < 0x1f)) {
puVar1[0x1f] = 0;
*puVar1 = 0x11;
goto switchD_1400f6ef1_caseD_11;
}
param_1[4] = (longlong)"too many length or distance symbols";
*puVar1 = 0x1d;
break;
case 0x11:
switchD_1400f6ef1_caseD_11:
if (puVar1[0x1f] < puVar1[0x1c]) {
do {
for (; uVar5 < 3; uVar5 = uVar5 + 8) {
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar17 = *puVar15;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar17 << ((byte)uVar5 & 0x1f));
}
uVar5 = uVar5 - 3;
uVar9 = (ushort)uVar6;
uVar6 = uVar6 >> 3;
*(ushort *)
((longlong)puVar1 +
(ulonglong)*(ushort *)(&DAT_14014b950 + (ulonglong)puVar1[0x1f] * 2) * 2 + 0x88) =
uVar9 & 7;
puVar1[0x1f] = puVar1[0x1f] + 1;
} while (puVar1[0x1f] < puVar1[0x1c]);
}
uVar17 = puVar1[0x1f];
while (uVar17 < 0x13) {
*(undefined2 *)
((longlong)puVar1 +
(ulonglong)*(ushort *)(&DAT_14014b950 + (ulonglong)puVar1[0x1f] * 2) * 2 + 0x88) = 0;
puVar1[0x1f] = puVar1[0x1f] + 1;
uVar17 = puVar1[0x1f];
}
*(uint **)(puVar1 + 0x20) = puVar1 + 0x152;
*(uint **)(puVar1 + 0x16) = puVar1 + 0x152;
puVar1[0x1a] = 7;
uVar7 = FUN_1401024d0(0,(ushort *)(puVar1 + 0x22),0x13,(longlong *)(puVar1 + 0x20),
puVar1 + 0x1a,(undefined *)(puVar1 + 0xc2));
local_res18 = (uint)uVar7;
if (local_res18 == 0) {
puVar1[0x1f] = 0;
*puVar1 = 0x12;
uVar10 = local_res20;
goto switchD_1400f6ef1_caseD_12;
}
param_1[4] = (longlong)"invalid code lengths set";
*puVar1 = 0x1d;
puVar20 = local_58;
uVar10 = local_res20;
break;
case 0x12:
switchD_1400f6ef1_caseD_12:
puVar20 = local_58;
if (puVar1[0x1f] < puVar1[0x1e] + puVar1[0x1d]) {
do {
uVar11 = *(uint *)(*(longlong *)(puVar1 + 0x16) +
(ulonglong)((1 << ((byte)puVar1[0x1a] & 0x1f)) - 1U & uVar6) * 4);
uVar17 = uVar5;
local_64 = uVar11;
if (uVar5 < (uVar11 >> 8 & 0xff)) {
do {
uVar5 = uVar17;
uVar2 = 0;
uVar11 = local_64;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar5 = uVar17 + 8;
uVar16 = uVar16 - 1;
uVar6 = uVar6 + ((uint)(byte)*puVar15 << ((byte)uVar17 & 0x1f));
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar11 = *(uint *)(*(longlong *)(puVar1 + 0x16) +
(ulonglong)((1 << ((byte)puVar1[0x1a] & 0x1f)) - 1U & uVar6) * 4);
uVar17 = uVar5;
local_64 = uVar11;
} while (uVar5 < (uVar11 >> 8 & 0xff));
}
uVar9 = (ushort)(uVar11 >> 0x10);
local_64._1_1_ = (byte)(uVar11 >> 8);
local_64 = uVar11;
if (0xf < uVar9) {
if (uVar9 == 0x10) {
for (; uVar5 < local_64._1_1_ + 2; uVar5 = uVar5 + 8) {
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar17 = *puVar15;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar17 << ((byte)uVar5 & 0x1f));
}
uVar5 = uVar5 - local_64._1_1_;
uVar6 = uVar6 >> (local_64._1_1_ & 0x1f);
if (puVar1[0x1f] != 0) {
iVar12 = (uVar6 & 3) + 3;
uVar5 = uVar5 - 2;
uVar19 = (ulonglong)
*(ushort *)((longlong)puVar1 + (ulonglong)(puVar1[0x1f] - 1) * 2 + 0x88);
uVar6 = uVar6 >> 2;
goto LAB_1400f7bd0;
}
}
else {
if (uVar9 == 0x11) {
for (; uVar5 < local_64._1_1_ + 3; uVar5 = uVar5 + 8) {
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar17 = *puVar15;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar17 << ((byte)uVar5 & 0x1f));
}
iVar4 = -3;
uVar6 = uVar6 >> (local_64._1_1_ & 0x1f);
iVar12 = (uVar6 & 7) + 3;
uVar6 = uVar6 >> 3;
}
else {
for (; uVar5 < local_64._1_1_ + 7; uVar5 = uVar5 + 8) {
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar17 = *puVar15;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar17 << ((byte)uVar5 & 0x1f));
}
iVar4 = -7;
uVar6 = uVar6 >> (local_64._1_1_ & 0x1f);
iVar12 = (uVar6 & 0x7f) + 0xb;
uVar6 = uVar6 >> 7;
}
uVar5 = uVar5 + (iVar4 - (uint)local_64._1_1_);
uVar19 = uVar23;
LAB_1400f7bd0:
if (iVar12 + puVar1[0x1f] <= puVar1[0x1e] + puVar1[0x1d]) {
for (; iVar12 != 0; iVar12 = iVar12 + -1) {
*(short *)((longlong)puVar1 + (ulonglong)puVar1[0x1f] * 2 + 0x88) = (short)uVar19;
puVar1[0x1f] = puVar1[0x1f] + 1;
}
goto LAB_1400f7c05;
}
}
param_1[4] = (longlong)"invalid bit length repeat";
*puVar1 = 0x1d;
goto LAB_1400f7528;
}
uVar17 = uVar5;
if (uVar5 < (uVar11 >> 8 & 0xff)) {
do {
uVar5 = uVar17;
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar13 = *puVar15;
uVar5 = uVar17 + 8;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar13 << ((byte)uVar17 & 0x1f));
uVar17 = uVar5;
} while (uVar5 < local_64._1_1_);
}
uVar6 = uVar6 >> (local_64._1_1_ & 0x1f);
uVar5 = uVar5 - local_64._1_1_;
*(ushort *)((longlong)puVar1 + (ulonglong)puVar1[0x1f] * 2 + 0x88) = uVar9;
puVar1[0x1f] = puVar1[0x1f] + 1;
LAB_1400f7c05:
} while (puVar1[0x1f] < puVar1[0x1e] + puVar1[0x1d]);
}
if (*puVar1 != 0x1d) {
if ((short)puVar1[0xa2] == 0) {
param_1[4] = (longlong)"invalid code -- missing end-of-block";
*puVar1 = 0x1d;
}
else {
*(uint **)(puVar1 + 0x20) = puVar1 + 0x152;
*(uint **)(puVar1 + 0x16) = puVar1 + 0x152;
puVar1[0x1a] = 9;
uVar7 = FUN_1401024d0(1,(ushort *)(puVar1 + 0x22),puVar1[0x1d],(longlong *)(puVar1 + 0x20)
,puVar1 + 0x1a,(undefined *)(puVar1 + 0xc2));
local_res18 = (uint)uVar7;
if (local_res18 == 0) {
*(undefined8 *)(puVar1 + 0x18) = *(undefined8 *)(puVar1 + 0x20);
puVar1[0x1b] = 6;
uVar23 = FUN_1401024d0(2,(ushort *)
((longlong)puVar1 + (ulonglong)puVar1[0x1d] * 2 + 0x88),
puVar1[0x1e],(longlong *)(puVar1 + 0x20),puVar1 + 0x1b,
(undefined *)(puVar1 + 0xc2));
local_res18 = (uint)uVar23;
uVar23 = uVar23 & 0xffffffff;
puVar20 = local_58;
if (local_res18 == 0) {
*puVar1 = 0x13;
uVar10 = local_res20;
if (param_2 != 6) goto switchD_1400f6ef1_caseD_13;
goto LAB_1400f76ce;
}
param_1[4] = (longlong)"invalid distances set";
*puVar1 = 0x1d;
uVar10 = local_res20;
}
else {
param_1[4] = (longlong)"invalid literal/lengths set";
*puVar1 = 0x1d;
puVar20 = local_58;
uVar10 = local_res20;
}
}
}
break;
case 0x13:
switchD_1400f6ef1_caseD_13:
*puVar1 = 0x14;
case 0x14:
if ((5 < uVar16) && (0x101 < uVar10)) {
param_1[2] = (longlong)puVar20;
*(uint *)(param_1 + 3) = uVar10;
*param_1 = (longlong)puVar15;
*(uint *)(param_1 + 1) = uVar16;
puVar1[0x10] = uVar6;
puVar1[0x11] = uVar5;
FUN_140100cf0(param_1,local_60);
local_58 = (undefined1 *)param_1[2];
local_res20 = *(uint *)(param_1 + 3);
puVar15 = (uint *)*param_1;
uVar16 = *(uint *)(param_1 + 1);
uVar5 = puVar1[0x11];
puVar20 = local_58;
uVar6 = puVar1[0x10];
uVar10 = local_res20;
if (*puVar1 == 0xb) {
puVar1[0x6f7] = 0xffffffff;
}
break;
}
puVar1[0x6f7] = 0;
uVar11 = *(uint *)(*(longlong *)(puVar1 + 0x16) +
(ulonglong)((1 << ((byte)puVar1[0x1a] & 0x1f)) - 1U & uVar6) * 4);
uVar17 = uVar5;
if (uVar5 < (uVar11 >> 8 & 0xff)) {
do {
uVar5 = uVar17;
uVar2 = 0;
uVar11 = local_64;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar5 = uVar17 + 8;
uVar16 = uVar16 - 1;
uVar6 = uVar6 + ((uint)(byte)*puVar15 << ((byte)uVar17 & 0x1f));
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar11 = *(uint *)(*(longlong *)(puVar1 + 0x16) +
(ulonglong)((1 << ((byte)puVar1[0x1a] & 0x1f)) - 1U & uVar6) * 4);
uVar17 = uVar5;
} while (uVar5 < (uVar11 >> 8 & 0xff));
}
cVar3 = (char)uVar11;
uVar17 = uVar11;
if ((cVar3 != '\0') && ((uVar11 & 0xf0) == 0)) {
bVar8 = (byte)(uVar11 >> 8);
uVar17 = *(uint *)(*(longlong *)(puVar1 + 0x16) +
(ulonglong)
((((1 << (cVar3 + bVar8 & 0x1f)) - 1U & uVar6) >> (bVar8 & 0x1f)) +
(uVar11 >> 0x10)) * 4);
if (uVar5 < (uVar17 >> 8 & 0xff) + (uVar11 >> 8 & 0xff)) {
do {
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar6 = uVar6 + ((uint)(byte)*puVar15 << ((byte)uVar5 & 0x1f));
uVar5 = uVar5 + 8;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar17 = *(uint *)(*(longlong *)(puVar1 + 0x16) +
(ulonglong)
((((1 << (cVar3 + bVar8 & 0x1f)) - 1U & uVar6) >> (bVar8 & 0x1f)) +
(uVar11 >> 0x10)) * 4);
} while (uVar5 < (uVar17 >> 8 & 0xff) + (uint)bVar8);
}
uVar6 = uVar6 >> (bVar8 & 0x1f);
uVar5 = uVar5 - bVar8;
puVar1[0x6f7] = (uint)bVar8;
local_64 = uVar11;
}
uVar10 = uVar17 >> 8 & 0xff;
puVar1[0x6f7] = puVar1[0x6f7] + uVar10;
uVar6 = uVar6 >> ((byte)(uVar17 >> 8) & 0x1f);
uVar5 = uVar5 - uVar10;
puVar1[0x12] = uVar17 >> 0x10;
puVar20 = local_58;
if ((char)uVar17 == '\0') {
*puVar1 = 0x19;
uVar10 = local_res20;
break;
}
if ((uVar17 & 0x20) != 0) {
puVar1[0x6f7] = 0xffffffff;
goto LAB_1400f7519;
}
if ((uVar17 & 0x40) != 0) {
param_1[4] = (longlong)"invalid literal/length code";
*puVar1 = 0x1d;
uVar10 = local_res20;
break;
}
*puVar1 = 0x15;
puVar1[0x14] = uVar17 & 0xf;
switchD_1400f6ef1_caseD_15:
uVar17 = puVar1[0x14];
if (uVar17 != 0) {
uVar10 = uVar5;
if (uVar5 < uVar17) {
do {
uVar2 = 0;
uVar11 = local_64;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar11 = *puVar15;
uVar10 = uVar5 + 8;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar11 << ((byte)uVar5 & 0x1f));
uVar5 = uVar10;
} while (uVar10 < puVar1[0x14]);
}
uVar5 = uVar10 - uVar17;
uVar10 = (1 << ((byte)uVar17 & 0x1f)) - 1U & uVar6;
uVar6 = uVar6 >> ((byte)uVar17 & 0x1f);
puVar1[0x12] = puVar1[0x12] + uVar10;
puVar1[0x6f7] = puVar1[0x6f7] + uVar17;
}
*puVar1 = 0x16;
puVar1[0x6f8] = puVar1[0x12];
switchD_1400f6ef1_caseD_16:
uVar11 = *(uint *)(*(longlong *)(puVar1 + 0x18) +
(ulonglong)((1 << ((byte)puVar1[0x1b] & 0x1f)) - 1U & uVar6) * 4);
uVar17 = uVar5;
if (uVar5 < (uVar11 >> 8 & 0xff)) {
do {
uVar5 = uVar17;
uVar2 = 0;
uVar11 = local_64;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar5 = uVar17 + 8;
uVar16 = uVar16 - 1;
uVar6 = uVar6 + ((uint)(byte)*puVar15 << ((byte)uVar17 & 0x1f));
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar11 = *(uint *)(*(longlong *)(puVar1 + 0x18) +
(ulonglong)((1 << ((byte)puVar1[0x1b] & 0x1f)) - 1U & uVar6) * 4);
uVar17 = uVar5;
} while (uVar5 < (uVar11 >> 8 & 0xff));
}
uVar17 = uVar11;
if ((uVar11 & 0xf0) == 0) {
bVar8 = (byte)(uVar11 >> 8);
uVar17 = *(uint *)(*(longlong *)(puVar1 + 0x18) +
(ulonglong)
((((1 << ((char)uVar11 + bVar8 & 0x1f)) - 1U & uVar6) >> (bVar8 & 0x1f)) +
(uVar11 >> 0x10)) * 4);
if (uVar5 < (uVar17 >> 8 & 0xff) + (uVar11 >> 8 & 0xff)) {
do {
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar6 = uVar6 + ((uint)(byte)*puVar15 << ((byte)uVar5 & 0x1f));
uVar5 = uVar5 + 8;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar17 = *(uint *)(*(longlong *)(puVar1 + 0x18) +
(ulonglong)
((((1 << ((char)uVar11 + bVar8 & 0x1f)) - 1U & uVar6) >>
(bVar8 & 0x1f)) + (uVar11 >> 0x10)) * 4);
} while (uVar5 < (uVar17 >> 8 & 0xff) + (uint)bVar8);
}
uVar6 = uVar6 >> (bVar8 & 0x1f);
uVar5 = uVar5 - bVar8;
puVar1[0x6f7] = puVar1[0x6f7] + (uint)bVar8;
local_64 = uVar11;
}
uVar10 = uVar17 >> 8 & 0xff;
puVar1[0x6f7] = puVar1[0x6f7] + uVar10;
uVar6 = uVar6 >> ((byte)(uVar17 >> 8) & 0x1f);
uVar5 = uVar5 - uVar10;
puVar20 = local_58;
if ((uVar17 & 0x40) != 0) {
param_1[4] = (longlong)"invalid distance code";
*puVar1 = 0x1d;
uVar10 = local_res20;
break;
}
*puVar1 = 0x17;
puVar1[0x13] = uVar17 >> 0x10;
puVar1[0x14] = uVar17 & 0xf;
uVar10 = local_res20;
switchD_1400f6ef1_caseD_17:
uVar17 = puVar1[0x14];
if (uVar17 != 0) {
uVar13 = uVar5;
if (uVar5 < uVar17) {
do {
uVar5 = uVar13;
uVar2 = 0;
uVar11 = local_64;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar11 = *puVar15;
uVar5 = uVar13 + 8;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar6 = uVar6 + ((uint)(byte)uVar11 << ((byte)uVar13 & 0x1f));
uVar13 = uVar5;
} while (uVar5 < puVar1[0x14]);
}
uVar5 = uVar5 - uVar17;
uVar11 = (1 << ((byte)uVar17 & 0x1f)) - 1U & uVar6;
uVar6 = uVar6 >> ((byte)uVar17 & 0x1f);
puVar1[0x13] = puVar1[0x13] + uVar11;
puVar1[0x6f7] = puVar1[0x6f7] + uVar17;
}
*puVar1 = 0x18;
switchD_1400f6ef1_caseD_18:
uVar2 = uVar16;
uVar11 = local_64;
if (uVar10 != 0) {
uVar17 = puVar1[0x13];
if (local_60 - uVar10 < uVar17) {
uVar17 = uVar17 - (local_60 - uVar10);
if ((puVar1[0xc] < uVar17) && (puVar1[0x6f6] != 0)) {
param_1[4] = (longlong)"invalid distance too far back";
*puVar1 = 0x1d;
break;
}
uVar13 = puVar1[0xd];
if (uVar13 < uVar17) {
uVar17 = uVar17 - uVar13;
uVar13 = puVar1[0xb] - uVar17;
}
else {
uVar13 = uVar13 - uVar17;
}
uVar11 = puVar1[0x12];
lVar14 = (ulonglong)uVar13 + *(longlong *)(puVar1 + 0xe);
if (uVar11 < uVar17) goto LAB_1400f8225;
}
else {
lVar14 = (longlong)puVar20 - (ulonglong)uVar17;
uVar11 = puVar1[0x12];
LAB_1400f8225:
uVar17 = uVar11;
uVar11 = uVar17;
}
if (uVar10 < uVar17) {
uVar17 = uVar10;
}
local_res20 = uVar10 - uVar17;
puVar1[0x12] = uVar11 - uVar17;
puVar21 = puVar20;
do {
local_58 = puVar21 + 1;
uVar17 = uVar17 - 1;
*puVar21 = puVar21[lVar14 - (longlong)puVar20];
puVar21 = local_58;
} while (uVar17 != 0);
puVar20 = local_58;
uVar10 = local_res20;
if (puVar1[0x12] == 0) {
*puVar1 = 0x14;
}
break;
}
goto LAB_1400f76ca;
case 0x15:
goto switchD_1400f6ef1_caseD_15;
case 0x16:
goto switchD_1400f6ef1_caseD_16;
case 0x17:
goto switchD_1400f6ef1_caseD_17;
case 0x18:
goto switchD_1400f6ef1_caseD_18;
case 0x19:
uVar2 = uVar16;
if (uVar10 != 0) {
local_58 = puVar20 + 1;
local_res20 = uVar10 - 1;
*puVar20 = (char)puVar1[0x12];
*puVar1 = 0x14;
puVar20 = local_58;
uVar10 = local_res20;
break;
}
goto LAB_1400f76ca;
case 0x1a:
uVar17 = uVar5;
uVar22 = uVar6;
if (puVar1[2] != 0) {
for (; uVar17 < 0x20; uVar17 = uVar17 + 8) {
uVar5 = uVar17;
uVar6 = uVar22;
uVar2 = 0;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar6 = *puVar15;
bVar8 = (byte)uVar17;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar22 = uVar22 + ((uint)(byte)uVar6 << (bVar8 & 0x1f));
}
uVar6 = local_60 - uVar10;
*(int *)((longlong)param_1 + 0x1c) = *(int *)((longlong)param_1 + 0x1c) + uVar6;
puVar1[7] = puVar1[7] + uVar6;
if (uVar6 != 0) {
if (puVar1[4] == 0) {
uVar5 = FUN_1400fe5a0(puVar1[6],puVar20 + -(ulonglong)uVar6,uVar6);
puVar20 = local_58;
uVar10 = local_res20;
}
else {
uVar5 = uVar13;
if ((uint *)(puVar20 + -(ulonglong)uVar6) != (uint *)0x0) {
uVar5 = FUN_1400f6b00(puVar1[6],(uint *)(puVar20 + -(ulonglong)uVar6),uVar6);
puVar20 = local_58;
uVar10 = local_res20;
}
}
puVar1[6] = uVar5;
*(uint *)((longlong)param_1 + 0x4c) = uVar5;
}
uVar11 = uVar22;
if (puVar1[4] == 0) {
uVar11 = ((uVar22 & 0xff00) + uVar22 * 0x10000) * 0x100 + (uVar22 >> 8 & 0xff00) +
(uVar22 >> 0x18);
}
uVar5 = uVar13;
uVar6 = uVar13;
local_60 = uVar10;
if (uVar11 != puVar1[6]) {
param_1[4] = (longlong)"incorrect data check";
*puVar1 = 0x1d;
uVar5 = uVar17;
uVar6 = uVar22;
break;
}
}
*puVar1 = 0x1b;
case 0x1b:
if ((puVar1[2] != 0) && (uVar17 = uVar5, uVar22 = uVar6, puVar1[4] != 0)) {
for (; uVar17 < 0x20; uVar17 = uVar17 + 8) {
uVar5 = uVar17;
uVar6 = uVar22;
uVar2 = 0;
uVar11 = local_64;
if (uVar16 == 0) goto LAB_1400f76ca;
uVar6 = *puVar15;
bVar8 = (byte)uVar17;
uVar16 = uVar16 - 1;
puVar15 = (uint *)((longlong)puVar15 + 1);
uVar22 = uVar22 + ((uint)(byte)uVar6 << (bVar8 & 0x1f));
}
uVar5 = uVar13;
uVar6 = uVar13;
if (uVar22 != puVar1[7]) {
param_1[4] = (longlong)"incorrect length check";
*puVar1 = 0x1d;
uVar5 = uVar17;
uVar6 = uVar22;
break;
}
}
*puVar1 = 0x1c;
switchD_1400f6ef1_caseD_1c:
uVar23 = 1;
goto LAB_1400f76ce;
case 0x1c:
goto switchD_1400f6ef1_caseD_1c;
case 0x1d:
uVar23 = 0xfffffffd;
goto LAB_1400f76ce;
case 0x1e:
goto LAB_1400f7729;
}
LAB_1400f7528:
uVar17 = *puVar1;
} while( true );
}