server-re/decomp/DBCServer_Release_x64/full/functions/0x1401c4220.c

1196 lines
38 KiB
C

/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c
* Ghidra 12.1.2 decompiler output for 0x1401c4220 FUN_1401c4220
* Pseudocode, not original source. */
int FUN_1401c4220(longlong *param_1,int param_2)
{
byte bVar1;
uint *puVar2;
uint uVar3;
char cVar4;
int iVar5;
int iVar6;
uint uVar7;
uint uVar8;
byte bVar9;
ushort uVar10;
uint uVar11;
uint uVar12;
uint uVar13;
longlong lVar14;
uint uVar15;
uint uVar16;
byte *pbVar17;
ulonglong uVar18;
undefined1 *puVar19;
undefined1 *puVar20;
byte *_Src;
uint uVar21;
ulonglong uVar22;
int 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) || (puVar2 = (uint *)param_1[5], puVar2 == (uint *)0x0)) ||
(param_1[2] == 0)) || ((*param_1 == 0 && ((int)param_1[1] != 0)))) {
return -2;
}
uVar16 = *puVar2;
uVar7 = puVar2[0x11];
uVar8 = puVar2[0x10];
if (uVar16 == 0xb) {
uVar16 = 0xc;
}
*puVar2 = uVar16;
uVar11 = *(uint *)(param_1 + 3);
puVar19 = (undefined1 *)param_1[2];
uVar15 = *(uint *)(param_1 + 1);
_Src = (byte *)*param_1;
local_res18 = 0;
local_res20 = uVar11;
local_60 = uVar11;
local_58 = puVar19;
local_5c = uVar15;
do {
if (0x1e < uVar16) {
return -2;
}
uVar22 = 0;
uVar21 = 0;
uVar13 = uVar15;
uVar12 = local_64;
switch(uVar16) {
case 0:
if (puVar2[2] == 0) {
*puVar2 = 0xc;
}
else {
for (; uVar7 < 0x10; uVar7 = uVar7 + 8) {
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
}
if (((puVar2[2] & 2) == 0) || (uVar8 != 0x8b1f)) {
puVar2[4] = 0;
if (*(longlong *)(puVar2 + 8) != 0) {
*(undefined4 *)(*(longlong *)(puVar2 + 8) + 0x40) = 0xffffffff;
}
if (((puVar2[2] & 1) == 0) ||
(uVar16 = (uVar8 & 0xff) * 0x100 + (uVar8 >> 8), uVar16 != (uVar16 / 0x1f) * 0x1f)) {
param_1[4] = (longlong)"incorrect header check";
*puVar2 = 0x1d;
}
else {
if (((byte)uVar8 & 0xf) != 8) goto LAB_1401c43bf;
uVar7 = uVar7 - 4;
uVar16 = (uVar8 >> 4 & 0xf) + 8;
if (puVar2[10] == 0) {
puVar2[10] = uVar16;
}
else if (puVar2[10] < uVar16) {
param_1[4] = (longlong)"invalid window size";
*puVar2 = 0x1d;
uVar8 = uVar8 >> 4;
break;
}
puVar2[5] = 1 << (sbyte)uVar16;
uVar16 = FUN_1401e5880(0,0,0);
puVar2[6] = uVar16;
*(uint *)((longlong)param_1 + 0x4c) = uVar16;
uVar7 = 0;
*puVar2 = ~(uVar8 >> 0xc) & 2 | 9;
uVar8 = 0;
puVar19 = local_58;
uVar11 = local_res20;
}
}
else {
uVar16 = FUN_1401c4210(0,0,0);
puVar2[6] = uVar16;
local_68 = 0x8b1f;
uVar16 = FUN_1401c3ef0(uVar16,&local_68,2);
uVar8 = 0;
uVar7 = 0;
puVar2[6] = uVar16;
*puVar2 = 1;
puVar19 = local_58;
uVar11 = local_res20;
}
}
break;
case 1:
for (; uVar7 < 0x10; uVar7 = uVar7 + 8) {
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
}
puVar2[4] = uVar8;
if ((char)uVar8 == '\b') {
if ((uVar8 & 0xe000) == 0) {
if (*(uint **)(puVar2 + 8) != (uint *)0x0) {
**(uint **)(puVar2 + 8) = uVar8 >> 8 & 1;
}
if ((puVar2[4] & 0x200) != 0) {
local_68 = (undefined2)uVar8;
uVar16 = FUN_1401c3ef0(puVar2[6],&local_68);
puVar2[6] = uVar16;
}
*puVar2 = 2;
uVar7 = uVar21;
uVar8 = uVar21;
do {
uVar13 = 0;
uVar12 = local_64;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar16 = uVar7 + 8;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
joined_r0x0001401c4506:
uVar7 = uVar16;
} while (uVar16 < 0x20);
if (*(longlong *)(puVar2 + 8) != 0) {
*(uint *)(*(longlong *)(puVar2 + 8) + 4) = uVar8;
}
if ((puVar2[4] & 0x200) != 0) {
local_68 = (undefined2)uVar8;
local_65 = (undefined1)(uVar8 >> 0x18);
local_66 = (undefined1)(uVar8 >> 0x10);
uVar16 = FUN_1401c3ef0(puVar2[6],&local_68);
puVar2[6] = uVar16;
}
*puVar2 = 3;
uVar7 = uVar21;
uVar8 = uVar21;
do {
uVar13 = 0;
uVar12 = local_64;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar16 = uVar7 + 8;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
joined_r0x0001401c4587:
uVar7 = uVar16;
} while (uVar16 < 0x10);
if (*(longlong *)(puVar2 + 8) != 0) {
*(uint *)(*(longlong *)(puVar2 + 8) + 8) = uVar8 & 0xff;
*(uint *)(*(longlong *)(puVar2 + 8) + 0xc) = uVar8 >> 8;
}
if ((puVar2[4] & 0x200) != 0) {
local_68 = (undefined2)uVar8;
uVar16 = FUN_1401c3ef0(puVar2[6],&local_68);
puVar2[6] = uVar16;
}
*puVar2 = 4;
uVar7 = uVar21;
uVar8 = uVar21;
goto switchD_1401c42e1_caseD_4;
}
param_1[4] = (longlong)"unknown header flags set";
*puVar2 = 0x1d;
}
else {
LAB_1401c43bf:
param_1[4] = (longlong)"unknown compression method";
*puVar2 = 0x1d;
}
break;
case 2:
uVar16 = uVar7;
goto joined_r0x0001401c4506;
case 3:
uVar16 = uVar7;
goto joined_r0x0001401c4587;
case 4:
switchD_1401c42e1_caseD_4:
if ((puVar2[4] & 0x400) == 0) {
uVar16 = uVar8;
if (*(longlong *)(puVar2 + 8) != 0) {
*(undefined8 *)(*(longlong *)(puVar2 + 8) + 0x10) = 0;
}
}
else {
for (; uVar7 < 0x10; uVar7 = uVar7 + 8) {
uVar13 = 0;
uVar12 = local_64;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
}
puVar2[0x12] = uVar8;
if (*(longlong *)(puVar2 + 8) != 0) {
*(uint *)(*(longlong *)(puVar2 + 8) + 0x18) = uVar8;
}
uVar7 = uVar21;
uVar16 = uVar21;
if ((puVar2[4] & 0x200) != 0) {
local_68 = (undefined2)uVar8;
uVar8 = FUN_1401c3ef0(puVar2[6],&local_68);
puVar2[6] = uVar8;
}
}
uVar8 = uVar16;
*puVar2 = 5;
case 5:
if ((puVar2[4] & 0x400) == 0) {
LAB_1401c4723:
puVar2[0x12] = 0;
*puVar2 = 6;
switchD_1401c42e1_caseD_6:
if ((puVar2[4] & 0x800) == 0) {
if (*(longlong *)(puVar2 + 8) != 0) {
*(undefined8 *)(*(longlong *)(puVar2 + 8) + 0x20) = 0;
}
LAB_1401c47ce:
puVar2[0x12] = 0;
*puVar2 = 7;
switchD_1401c42e1_caseD_7:
uVar22 = 0;
if ((puVar2[4] & 0x1000) == 0) {
if (*(longlong *)(puVar2 + 8) != 0) {
*(undefined8 *)(*(longlong *)(puVar2 + 8) + 0x30) = 0;
}
LAB_1401c486e:
*puVar2 = 8;
puVar19 = local_58;
uVar11 = local_res20;
switchD_1401c42e1_caseD_8:
if ((puVar2[4] & 0x200) != 0) {
for (; uVar7 < 0x10; uVar7 = uVar7 + 8) {
uVar13 = 0;
uVar12 = local_64;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
}
if (uVar8 != (ushort)puVar2[6]) {
param_1[4] = (longlong)"header crc mismatch";
*puVar2 = 0x1d;
break;
}
uVar7 = 0;
uVar8 = uVar7;
}
if (*(longlong *)(puVar2 + 8) != 0) {
*(uint *)(*(longlong *)(puVar2 + 8) + 0x3c) = (int)puVar2[4] >> 9 & 1;
*(undefined4 *)(*(longlong *)(puVar2 + 8) + 0x40) = 1;
}
uVar16 = FUN_1401c4210(0,0,0);
puVar2[6] = uVar16;
*(uint *)((longlong)param_1 + 0x4c) = uVar16;
LAB_1401c4909:
*puVar2 = 0xb;
puVar19 = local_58;
uVar11 = local_res20;
break;
}
pbVar17 = _Src;
uVar13 = uVar15;
uVar12 = local_64;
if (uVar15 != 0) {
do {
lVar14 = *(longlong *)(puVar2 + 8);
bVar1 = *pbVar17;
uVar16 = (int)uVar22 + 1;
uVar22 = (ulonglong)uVar16;
if (((lVar14 != 0) && (*(longlong *)(lVar14 + 0x30) != 0)) &&
(puVar2[0x12] < *(uint *)(lVar14 + 0x38))) {
*(byte *)((ulonglong)puVar2[0x12] + *(longlong *)(lVar14 + 0x30)) = bVar1;
puVar2[0x12] = puVar2[0x12] + 1;
}
} while ((bVar1 != 0) && (pbVar17 = pbVar17 + 1, uVar16 < uVar15));
if ((puVar2[4] & 0x200) != 0) {
if (_Src == (byte *)0x0) {
uVar11 = 0;
}
else {
uVar11 = FUN_1401c3ef0(puVar2[6],_Src);
}
puVar2[6] = uVar11;
}
uVar15 = uVar15 - uVar16;
_Src = _Src + uVar22;
uVar13 = uVar15;
uVar12 = local_64;
if (bVar1 == 0) goto LAB_1401c486e;
}
}
else {
pbVar17 = _Src;
uVar13 = uVar15;
uVar12 = local_64;
if (uVar15 != 0) {
do {
lVar14 = *(longlong *)(puVar2 + 8);
bVar1 = *pbVar17;
uVar13 = (int)uVar22 + 1;
uVar22 = (ulonglong)uVar13;
if (((lVar14 != 0) && (*(longlong *)(lVar14 + 0x20) != 0)) &&
(puVar2[0x12] < *(uint *)(lVar14 + 0x28))) {
*(byte *)((ulonglong)puVar2[0x12] + *(longlong *)(lVar14 + 0x20)) = bVar1;
puVar2[0x12] = puVar2[0x12] + 1;
}
} while ((bVar1 != 0) && (pbVar17 = pbVar17 + 1, uVar13 < uVar15));
if ((puVar2[4] & 0x200) != 0) {
if (_Src == (byte *)0x0) {
uVar16 = 0;
}
else {
uVar16 = FUN_1401c3ef0(puVar2[6],_Src);
}
puVar2[6] = uVar16;
}
uVar13 = uVar15 - uVar13;
_Src = _Src + uVar22;
uVar15 = uVar13;
uVar12 = local_64;
if (bVar1 == 0) goto LAB_1401c47ce;
}
}
}
else {
uVar16 = puVar2[0x12];
uVar11 = uVar16;
if (uVar15 < uVar16) {
uVar11 = uVar15;
}
uVar13 = uVar15;
if (uVar11 != 0) {
lVar14 = *(longlong *)(puVar2 + 8);
if ((lVar14 != 0) && (*(longlong *)(lVar14 + 0x10) != 0)) {
uVar16 = *(int *)(lVar14 + 0x18) - uVar16;
uVar12 = uVar11;
if (*(uint *)(lVar14 + 0x1c) < uVar11 + uVar16) {
uVar12 = *(uint *)(lVar14 + 0x1c) - uVar16;
}
memcpy((void *)((ulonglong)uVar16 + *(longlong *)(lVar14 + 0x10)),_Src,(ulonglong)uVar12
);
}
if ((puVar2[4] & 0x200) != 0) {
if (_Src != (byte *)0x0) {
uVar21 = FUN_1401c3ef0(puVar2[6],_Src);
}
puVar2[6] = uVar21;
}
uVar13 = uVar15 - uVar11;
_Src = _Src + uVar11;
puVar2[0x12] = puVar2[0x12] - uVar11;
}
uVar15 = uVar13;
uVar12 = local_64;
if (puVar2[0x12] == 0) goto LAB_1401c4723;
}
LAB_1401c4abe:
local_64 = uVar12;
uVar16 = local_60;
param_1[2] = (longlong)local_58;
*param_1 = (longlong)_Src;
*(uint *)(param_1 + 3) = local_res20;
*(uint *)(param_1 + 1) = uVar13;
puVar2[0x11] = uVar7;
puVar2[0x10] = uVar8;
if (((puVar2[0xb] == 0) && ((0x19 < (int)*puVar2 || (local_60 == *(uint *)(param_1 + 3))))) ||
(iVar5 = FUN_1401c3d90(param_1,local_60), iVar5 == 0)) {
uVar16 = uVar16 - (int)param_1[3];
local_5c = local_5c - (int)param_1[1];
*(int *)((longlong)param_1 + 0x1c) = *(int *)((longlong)param_1 + 0x1c) + uVar16;
*(int *)((longlong)param_1 + 0xc) = *(int *)((longlong)param_1 + 0xc) + local_5c;
puVar2[7] = puVar2[7] + uVar16;
if ((puVar2[2] != 0) && (uVar16 != 0)) {
if (puVar2[4] == 0) {
uVar8 = FUN_1401e5880(puVar2[6],param_1[2] - (ulonglong)uVar16);
}
else if (param_1[2] == (ulonglong)uVar16) {
uVar8 = 0;
}
else {
uVar8 = FUN_1401c3ef0();
}
puVar2[6] = uVar8;
*(uint *)((longlong)param_1 + 0x4c) = uVar8;
}
uVar8 = *puVar2;
if ((uVar8 == 0x13) || (uVar8 == 0xe)) {
iVar5 = 0x100;
}
else {
iVar5 = 0;
}
iVar6 = 0;
if (uVar8 == 0xb) {
iVar6 = 0x80;
}
*(uint *)(param_1 + 9) = iVar6 + iVar5 + (-(uint)(puVar2[1] != 0) & 0x40) + puVar2[0x11];
if (((local_5c != 0) || (uVar16 != 0)) && (param_2 != 4)) {
return local_res18;
}
if (local_res18 != 0) {
return local_res18;
}
return -5;
}
*puVar2 = 0x1e;
LAB_1401c4b19:
return -4;
case 6:
goto switchD_1401c42e1_caseD_6;
case 7:
goto switchD_1401c42e1_caseD_7;
case 8:
goto switchD_1401c42e1_caseD_8;
case 9:
for (; uVar7 < 0x20; uVar7 = uVar7 + 8) {
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
}
uVar16 = (uVar8 >> 8 & 0xff00) + ((uVar8 & 0xff00) + uVar8 * 0x10000) * 0x100 +
(uVar8 >> 0x18);
puVar2[6] = uVar16;
*(uint *)((longlong)param_1 + 0x4c) = uVar16;
*puVar2 = 10;
uVar7 = uVar21;
uVar8 = uVar21;
case 10:
if (puVar2[3] == 0) {
param_1[2] = (longlong)puVar19;
*(uint *)(param_1 + 3) = uVar11;
*param_1 = (longlong)_Src;
*(uint *)(param_1 + 1) = uVar15;
puVar2[0x10] = uVar8;
puVar2[0x11] = uVar7;
return 2;
}
uVar16 = FUN_1401e5880(0,0);
puVar2[6] = uVar16;
*(uint *)((longlong)param_1 + 0x4c) = uVar16;
*puVar2 = 0xb;
puVar19 = local_58;
uVar11 = local_res20;
switchD_1401c42e1_caseD_b:
uVar13 = uVar15;
uVar12 = local_64;
if ((param_2 != 5) && (param_2 != 6)) {
switchD_1401c42e1_caseD_c:
if (puVar2[1] == 0) {
for (; uVar12 = local_64, uVar7 < 3; uVar7 = uVar7 + 8) {
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
}
puVar2[1] = uVar8 & 1;
uVar16 = uVar8 >> 1 & 3;
if (uVar16 == 0) {
*puVar2 = 0xd;
}
else {
if (uVar16 != 1) {
if (uVar16 == 2) {
*puVar2 = 0x10;
uVar7 = uVar7 - 3;
uVar8 = uVar8 >> 3;
}
else {
if (uVar16 != 3) goto LAB_1401c4b45;
uVar7 = uVar7 - 3;
param_1[4] = (longlong)"invalid block type";
*puVar2 = 0x1d;
uVar8 = uVar8 >> 3;
}
break;
}
puVar2[0x1a] = 9;
puVar2[0x1b] = 5;
*(undefined **)(puVar2 + 0x16) = &DAT_14028a700;
*puVar2 = 0x13;
*(undefined **)(puVar2 + 0x18) = &DAT_14028af00;
if (param_2 == 6) {
uVar8 = uVar8 >> 3;
uVar7 = uVar7 - 3;
uVar13 = uVar15;
goto LAB_1401c4abe;
}
}
LAB_1401c4b45:
uVar7 = uVar7 - 3;
uVar8 = uVar8 >> 3;
}
else {
*puVar2 = 0x1a;
uVar16 = uVar7 & 7;
uVar7 = uVar7 - uVar16;
uVar8 = uVar8 >> (sbyte)uVar16;
}
break;
}
goto LAB_1401c4abe;
case 0xb:
goto switchD_1401c42e1_caseD_b;
case 0xc:
goto switchD_1401c42e1_caseD_c;
case 0xd:
uVar8 = uVar8 >> (sbyte)(uVar7 & 7);
for (uVar7 = uVar7 - (uVar7 & 7); uVar7 < 0x20; uVar7 = uVar7 + 8) {
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
}
if ((uVar8 & 0xffff) == ~uVar8 >> 0x10) {
puVar2[0x12] = uVar8 & 0xffff;
*puVar2 = 0xe;
uVar7 = uVar21;
uVar8 = uVar21;
uVar13 = uVar15;
if (param_2 != 6) goto switchD_1401c42e1_caseD_e;
goto LAB_1401c4abe;
}
param_1[4] = (longlong)"invalid stored block lengths";
*puVar2 = 0x1d;
break;
case 0xe:
switchD_1401c42e1_caseD_e:
*puVar2 = 0xf;
case 0xf:
uVar16 = puVar2[0x12];
if (uVar16 == 0) {
*puVar2 = 0xb;
break;
}
if (uVar15 < uVar16) {
uVar16 = uVar15;
}
if (uVar11 < uVar16) {
uVar16 = uVar11;
}
uVar22 = (ulonglong)uVar16;
uVar13 = uVar15;
if (uVar16 != 0) {
memcpy(puVar19,_Src,uVar22);
local_res20 = local_res20 - uVar16;
_Src = _Src + uVar22;
local_58 = local_58 + uVar22;
uVar15 = uVar15 - uVar16;
puVar2[0x12] = puVar2[0x12] - uVar16;
puVar19 = local_58;
uVar11 = local_res20;
break;
}
goto LAB_1401c4abe;
case 0x10:
for (; uVar7 < 0xe; uVar7 = uVar7 + 8) {
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
}
uVar7 = uVar7 - 0xe;
uVar21 = uVar8 >> 10;
uVar16 = (uVar8 & 0x1f) + 0x101;
uVar13 = (uVar8 >> 5 & 0x1f) + 1;
uVar8 = uVar8 >> 0xe;
puVar2[0x1d] = uVar16;
puVar2[0x1e] = uVar13;
puVar2[0x1c] = (uVar21 & 0xf) + 4;
if ((uVar16 < 0x11f) && (uVar13 < 0x1f)) {
puVar2[0x1f] = 0;
*puVar2 = 0x11;
goto switchD_1401c42e1_caseD_11;
}
param_1[4] = (longlong)"too many length or distance symbols";
*puVar2 = 0x1d;
break;
case 0x11:
switchD_1401c42e1_caseD_11:
if (puVar2[0x1f] < puVar2[0x1c]) {
do {
for (; uVar7 < 3; uVar7 = uVar7 + 8) {
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
}
uVar7 = uVar7 - 3;
uVar10 = (ushort)uVar8;
uVar8 = uVar8 >> 3;
*(ushort *)
((longlong)puVar2 +
(ulonglong)*(ushort *)(&DAT_14028af80 + (ulonglong)puVar2[0x1f] * 2) * 2 + 0x88) =
uVar10 & 7;
puVar2[0x1f] = puVar2[0x1f] + 1;
} while (puVar2[0x1f] < puVar2[0x1c]);
}
uVar16 = puVar2[0x1f];
while (uVar16 < 0x13) {
*(undefined2 *)
((longlong)puVar2 +
(ulonglong)*(ushort *)(&DAT_14028af80 + (ulonglong)puVar2[0x1f] * 2) * 2 + 0x88) = 0;
puVar2[0x1f] = puVar2[0x1f] + 1;
uVar16 = puVar2[0x1f];
}
*(uint **)(puVar2 + 0x20) = puVar2 + 0x152;
*(uint **)(puVar2 + 0x16) = puVar2 + 0x152;
puVar2[0x1a] = 7;
local_res18 = FUN_1401e97b0(0,puVar2 + 0x22,0x13,puVar2 + 0x20,puVar2 + 0x1a,puVar2 + 0xc2);
if (local_res18 == 0) {
puVar2[0x1f] = 0;
*puVar2 = 0x12;
uVar11 = local_res20;
goto switchD_1401c42e1_caseD_12;
}
param_1[4] = (longlong)"invalid code lengths set";
*puVar2 = 0x1d;
puVar19 = local_58;
uVar11 = local_res20;
break;
case 0x12:
switchD_1401c42e1_caseD_12:
puVar19 = local_58;
if (puVar2[0x1f] < puVar2[0x1e] + puVar2[0x1d]) {
do {
uVar12 = *(uint *)(*(longlong *)(puVar2 + 0x16) +
(ulonglong)((1 << ((byte)puVar2[0x1a] & 0x1f)) - 1U & uVar8) * 4);
uVar16 = uVar7;
local_64 = uVar12;
if (uVar7 < (uVar12 >> 8 & 0xff)) {
do {
uVar7 = uVar16;
uVar13 = 0;
uVar12 = local_64;
if (uVar15 == 0) goto LAB_1401c4abe;
uVar7 = uVar16 + 8;
uVar15 = uVar15 - 1;
uVar8 = uVar8 + ((uint)*_Src << ((byte)uVar16 & 0x1f));
_Src = _Src + 1;
uVar12 = *(uint *)(*(longlong *)(puVar2 + 0x16) +
(ulonglong)((1 << ((byte)puVar2[0x1a] & 0x1f)) - 1U & uVar8) * 4);
uVar16 = uVar7;
local_64 = uVar12;
} while (uVar7 < (uVar12 >> 8 & 0xff));
}
uVar10 = (ushort)(uVar12 >> 0x10);
local_64._1_1_ = (byte)(uVar12 >> 8);
local_64 = uVar12;
if (0xf < uVar10) {
if (uVar10 == 0x10) {
for (; uVar7 < local_64._1_1_ + 2; uVar7 = uVar7 + 8) {
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
}
uVar7 = uVar7 - local_64._1_1_;
uVar8 = uVar8 >> (local_64._1_1_ & 0x1f);
if (puVar2[0x1f] != 0) {
iVar5 = (uVar8 & 3) + 3;
uVar7 = uVar7 - 2;
uVar18 = (ulonglong)
*(ushort *)((longlong)puVar2 + (ulonglong)(puVar2[0x1f] - 1) * 2 + 0x88);
uVar8 = uVar8 >> 2;
goto LAB_1401c4fc0;
}
}
else {
if (uVar10 == 0x11) {
for (; uVar7 < local_64._1_1_ + 3; uVar7 = uVar7 + 8) {
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
}
iVar6 = -3;
uVar8 = uVar8 >> (local_64._1_1_ & 0x1f);
iVar5 = (uVar8 & 7) + 3;
uVar8 = uVar8 >> 3;
}
else {
for (; uVar7 < local_64._1_1_ + 7; uVar7 = uVar7 + 8) {
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
}
iVar6 = -7;
uVar8 = uVar8 >> (local_64._1_1_ & 0x1f);
iVar5 = (uVar8 & 0x7f) + 0xb;
uVar8 = uVar8 >> 7;
}
uVar7 = uVar7 + (iVar6 - (uint)local_64._1_1_);
uVar18 = uVar22;
LAB_1401c4fc0:
if (iVar5 + puVar2[0x1f] <= puVar2[0x1e] + puVar2[0x1d]) {
for (; iVar5 != 0; iVar5 = iVar5 + -1) {
*(short *)((longlong)puVar2 + (ulonglong)puVar2[0x1f] * 2 + 0x88) = (short)uVar18;
puVar2[0x1f] = puVar2[0x1f] + 1;
}
goto LAB_1401c4ff5;
}
}
param_1[4] = (longlong)"invalid bit length repeat";
*puVar2 = 0x1d;
goto LAB_1401c4918;
}
uVar16 = uVar7;
if (uVar7 < (uVar12 >> 8 & 0xff)) {
do {
uVar7 = uVar16;
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar7 = uVar16 + 8;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar16 & 0x1f));
uVar16 = uVar7;
} while (uVar7 < local_64._1_1_);
}
uVar8 = uVar8 >> (local_64._1_1_ & 0x1f);
uVar7 = uVar7 - local_64._1_1_;
*(ushort *)((longlong)puVar2 + (ulonglong)puVar2[0x1f] * 2 + 0x88) = uVar10;
puVar2[0x1f] = puVar2[0x1f] + 1;
LAB_1401c4ff5:
} while (puVar2[0x1f] < puVar2[0x1e] + puVar2[0x1d]);
}
if (*puVar2 != 0x1d) {
if ((short)puVar2[0xa2] == 0) {
param_1[4] = (longlong)"invalid code -- missing end-of-block";
*puVar2 = 0x1d;
}
else {
*(uint **)(puVar2 + 0x20) = puVar2 + 0x152;
*(uint **)(puVar2 + 0x16) = puVar2 + 0x152;
puVar2[0x1a] = 9;
local_res18 = FUN_1401e97b0(1,puVar2 + 0x22,puVar2[0x1d],puVar2 + 0x20,puVar2 + 0x1a,
puVar2 + 0xc2);
if (local_res18 == 0) {
*(undefined8 *)(puVar2 + 0x18) = *(undefined8 *)(puVar2 + 0x20);
puVar2[0x1b] = 6;
local_res18 = FUN_1401e97b0(2,(longlong)puVar2 + (ulonglong)puVar2[0x1d] * 2 + 0x88,
puVar2[0x1e],puVar2 + 0x20,puVar2 + 0x1b,puVar2 + 0xc2);
puVar19 = local_58;
if (local_res18 == 0) {
*puVar2 = 0x13;
uVar11 = local_res20;
uVar13 = uVar15;
uVar12 = local_64;
if (param_2 != 6) goto switchD_1401c42e1_caseD_13;
goto LAB_1401c4abe;
}
param_1[4] = (longlong)"invalid distances set";
*puVar2 = 0x1d;
uVar11 = local_res20;
}
else {
param_1[4] = (longlong)"invalid literal/lengths set";
*puVar2 = 0x1d;
puVar19 = local_58;
uVar11 = local_res20;
}
}
}
break;
case 0x13:
switchD_1401c42e1_caseD_13:
*puVar2 = 0x14;
case 0x14:
if ((5 < uVar15) && (0x101 < uVar11)) {
param_1[2] = (longlong)puVar19;
*(uint *)(param_1 + 3) = uVar11;
*param_1 = (longlong)_Src;
*(uint *)(param_1 + 1) = uVar15;
puVar2[0x10] = uVar8;
puVar2[0x11] = uVar7;
FUN_1401e7fd0(param_1,local_60);
local_58 = (undefined1 *)param_1[2];
local_res20 = *(uint *)(param_1 + 3);
_Src = (byte *)*param_1;
uVar15 = *(uint *)(param_1 + 1);
uVar7 = puVar2[0x11];
puVar19 = local_58;
uVar8 = puVar2[0x10];
uVar11 = local_res20;
if (*puVar2 == 0xb) {
puVar2[0x6f7] = 0xffffffff;
}
break;
}
puVar2[0x6f7] = 0;
uVar12 = *(uint *)(*(longlong *)(puVar2 + 0x16) +
(ulonglong)((1 << ((byte)puVar2[0x1a] & 0x1f)) - 1U & uVar8) * 4);
uVar16 = uVar7;
if (uVar7 < (uVar12 >> 8 & 0xff)) {
do {
uVar7 = uVar16;
uVar13 = 0;
uVar12 = local_64;
if (uVar15 == 0) goto LAB_1401c4abe;
uVar7 = uVar16 + 8;
uVar15 = uVar15 - 1;
uVar8 = uVar8 + ((uint)*_Src << ((byte)uVar16 & 0x1f));
_Src = _Src + 1;
uVar12 = *(uint *)(*(longlong *)(puVar2 + 0x16) +
(ulonglong)((1 << ((byte)puVar2[0x1a] & 0x1f)) - 1U & uVar8) * 4);
uVar16 = uVar7;
} while (uVar7 < (uVar12 >> 8 & 0xff));
}
cVar4 = (char)uVar12;
uVar16 = uVar12;
if ((cVar4 != '\0') && ((uVar12 & 0xf0) == 0)) {
bVar1 = (byte)(uVar12 >> 8);
uVar16 = *(uint *)(*(longlong *)(puVar2 + 0x16) +
(ulonglong)
((((1 << (cVar4 + bVar1 & 0x1f)) - 1U & uVar8) >> (bVar1 & 0x1f)) +
(uVar12 >> 0x10)) * 4);
if (uVar7 < (uVar16 >> 8 & 0xff) + (uVar12 >> 8 & 0xff)) {
do {
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
uVar8 = uVar8 + ((uint)*_Src << ((byte)uVar7 & 0x1f));
uVar7 = uVar7 + 8;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar16 = *(uint *)(*(longlong *)(puVar2 + 0x16) +
(ulonglong)
((((1 << (cVar4 + bVar1 & 0x1f)) - 1U & uVar8) >> (bVar1 & 0x1f)) +
(uVar12 >> 0x10)) * 4);
} while (uVar7 < (uVar16 >> 8 & 0xff) + (uint)bVar1);
}
uVar8 = uVar8 >> (bVar1 & 0x1f);
uVar7 = uVar7 - bVar1;
puVar2[0x6f7] = (uint)bVar1;
local_64 = uVar12;
}
uVar11 = uVar16 >> 8 & 0xff;
puVar2[0x6f7] = puVar2[0x6f7] + uVar11;
uVar8 = uVar8 >> ((byte)(uVar16 >> 8) & 0x1f);
uVar7 = uVar7 - uVar11;
puVar2[0x12] = uVar16 >> 0x10;
puVar19 = local_58;
if ((char)uVar16 == '\0') {
*puVar2 = 0x19;
uVar11 = local_res20;
break;
}
if ((uVar16 & 0x20) != 0) {
puVar2[0x6f7] = 0xffffffff;
goto LAB_1401c4909;
}
if ((uVar16 & 0x40) != 0) {
param_1[4] = (longlong)"invalid literal/length code";
*puVar2 = 0x1d;
uVar11 = local_res20;
break;
}
*puVar2 = 0x15;
puVar2[0x14] = uVar16 & 0xf;
switchD_1401c42e1_caseD_15:
uVar16 = puVar2[0x14];
if (uVar16 != 0) {
uVar11 = uVar7;
if (uVar7 < uVar16) {
do {
uVar13 = 0;
uVar12 = local_64;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar11 = uVar7 + 8;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f));
uVar7 = uVar11;
} while (uVar11 < puVar2[0x14]);
}
uVar7 = uVar11 - uVar16;
uVar11 = (1 << ((byte)uVar16 & 0x1f)) - 1U & uVar8;
uVar8 = uVar8 >> ((byte)uVar16 & 0x1f);
puVar2[0x12] = puVar2[0x12] + uVar11;
puVar2[0x6f7] = puVar2[0x6f7] + uVar16;
}
*puVar2 = 0x16;
puVar2[0x6f8] = puVar2[0x12];
switchD_1401c42e1_caseD_16:
uVar12 = *(uint *)(*(longlong *)(puVar2 + 0x18) +
(ulonglong)((1 << ((byte)puVar2[0x1b] & 0x1f)) - 1U & uVar8) * 4);
uVar16 = uVar7;
if (uVar7 < (uVar12 >> 8 & 0xff)) {
do {
uVar7 = uVar16;
uVar13 = 0;
uVar12 = local_64;
if (uVar15 == 0) goto LAB_1401c4abe;
uVar7 = uVar16 + 8;
uVar15 = uVar15 - 1;
uVar8 = uVar8 + ((uint)*_Src << ((byte)uVar16 & 0x1f));
_Src = _Src + 1;
uVar12 = *(uint *)(*(longlong *)(puVar2 + 0x18) +
(ulonglong)((1 << ((byte)puVar2[0x1b] & 0x1f)) - 1U & uVar8) * 4);
uVar16 = uVar7;
} while (uVar7 < (uVar12 >> 8 & 0xff));
}
uVar16 = uVar12;
if ((uVar12 & 0xf0) == 0) {
bVar1 = (byte)(uVar12 >> 8);
uVar16 = *(uint *)(*(longlong *)(puVar2 + 0x18) +
(ulonglong)
((((1 << ((char)uVar12 + bVar1 & 0x1f)) - 1U & uVar8) >> (bVar1 & 0x1f)) +
(uVar12 >> 0x10)) * 4);
if (uVar7 < (uVar16 >> 8 & 0xff) + (uVar12 >> 8 & 0xff)) {
do {
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
uVar8 = uVar8 + ((uint)*_Src << ((byte)uVar7 & 0x1f));
uVar7 = uVar7 + 8;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar16 = *(uint *)(*(longlong *)(puVar2 + 0x18) +
(ulonglong)
((((1 << ((char)uVar12 + bVar1 & 0x1f)) - 1U & uVar8) >>
(bVar1 & 0x1f)) + (uVar12 >> 0x10)) * 4);
} while (uVar7 < (uVar16 >> 8 & 0xff) + (uint)bVar1);
}
uVar8 = uVar8 >> (bVar1 & 0x1f);
uVar7 = uVar7 - bVar1;
puVar2[0x6f7] = puVar2[0x6f7] + (uint)bVar1;
local_64 = uVar12;
}
uVar11 = uVar16 >> 8 & 0xff;
puVar2[0x6f7] = puVar2[0x6f7] + uVar11;
uVar8 = uVar8 >> ((byte)(uVar16 >> 8) & 0x1f);
uVar7 = uVar7 - uVar11;
puVar19 = local_58;
if ((uVar16 & 0x40) != 0) {
param_1[4] = (longlong)"invalid distance code";
*puVar2 = 0x1d;
uVar11 = local_res20;
break;
}
*puVar2 = 0x17;
puVar2[0x13] = uVar16 >> 0x10;
puVar2[0x14] = uVar16 & 0xf;
uVar11 = local_res20;
switchD_1401c42e1_caseD_17:
uVar16 = puVar2[0x14];
if (uVar16 != 0) {
uVar21 = uVar7;
if (uVar7 < uVar16) {
do {
uVar7 = uVar21;
uVar13 = 0;
uVar12 = local_64;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
uVar7 = uVar21 + 8;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar21 & 0x1f));
uVar21 = uVar7;
} while (uVar7 < puVar2[0x14]);
}
uVar7 = uVar7 - uVar16;
uVar12 = (1 << ((byte)uVar16 & 0x1f)) - 1U & uVar8;
uVar8 = uVar8 >> ((byte)uVar16 & 0x1f);
puVar2[0x13] = puVar2[0x13] + uVar12;
puVar2[0x6f7] = puVar2[0x6f7] + uVar16;
}
*puVar2 = 0x18;
switchD_1401c42e1_caseD_18:
uVar13 = uVar15;
uVar12 = local_64;
if (uVar11 != 0) {
uVar16 = puVar2[0x13];
if (local_60 - uVar11 < uVar16) {
uVar16 = uVar16 - (local_60 - uVar11);
if ((puVar2[0xc] < uVar16) && (puVar2[0x6f6] != 0)) {
param_1[4] = (longlong)"invalid distance too far back";
*puVar2 = 0x1d;
break;
}
uVar13 = puVar2[0xd];
if (uVar13 < uVar16) {
uVar16 = uVar16 - uVar13;
uVar13 = puVar2[0xb] - uVar16;
}
else {
uVar13 = uVar13 - uVar16;
}
uVar12 = puVar2[0x12];
lVar14 = (ulonglong)uVar13 + *(longlong *)(puVar2 + 0xe);
if (uVar12 < uVar16) goto LAB_1401c5615;
}
else {
lVar14 = (longlong)puVar19 - (ulonglong)uVar16;
uVar12 = puVar2[0x12];
LAB_1401c5615:
uVar16 = uVar12;
uVar12 = uVar16;
}
if (uVar11 < uVar16) {
uVar16 = uVar11;
}
local_res20 = uVar11 - uVar16;
puVar2[0x12] = uVar12 - uVar16;
puVar20 = puVar19;
do {
local_58 = puVar20 + 1;
uVar16 = uVar16 - 1;
*puVar20 = puVar20[lVar14 - (longlong)puVar19];
puVar20 = local_58;
} while (uVar16 != 0);
puVar19 = local_58;
uVar11 = local_res20;
if (puVar2[0x12] == 0) {
*puVar2 = 0x14;
}
break;
}
goto LAB_1401c4abe;
case 0x15:
goto switchD_1401c42e1_caseD_15;
case 0x16:
goto switchD_1401c42e1_caseD_16;
case 0x17:
goto switchD_1401c42e1_caseD_17;
case 0x18:
goto switchD_1401c42e1_caseD_18;
case 0x19:
if (uVar11 == 0) goto LAB_1401c4abe;
local_58 = puVar19 + 1;
local_res20 = uVar11 - 1;
*puVar19 = (char)puVar2[0x12];
*puVar2 = 0x14;
puVar19 = local_58;
uVar11 = local_res20;
break;
case 0x1a:
uVar16 = uVar7;
uVar3 = uVar8;
if (puVar2[2] != 0) {
for (; uVar16 < 0x20; uVar16 = uVar16 + 8) {
uVar7 = uVar16;
uVar8 = uVar3;
uVar13 = 0;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
bVar9 = (byte)uVar16;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar3 = uVar3 + ((uint)bVar1 << (bVar9 & 0x1f));
}
uVar8 = local_60 - uVar11;
*(int *)((longlong)param_1 + 0x1c) = *(int *)((longlong)param_1 + 0x1c) + uVar8;
puVar2[7] = puVar2[7] + uVar8;
if (uVar8 != 0) {
if (puVar2[4] == 0) {
uVar7 = FUN_1401e5880(puVar2[6],(longlong)puVar19 - (longlong)(ulonglong)uVar8);
puVar19 = local_58;
uVar11 = local_res20;
}
else {
uVar7 = uVar21;
if (puVar19 != (undefined1 *)(ulonglong)uVar8) {
uVar7 = FUN_1401c3ef0(puVar2[6]);
puVar19 = local_58;
uVar11 = local_res20;
}
}
puVar2[6] = uVar7;
*(uint *)((longlong)param_1 + 0x4c) = uVar7;
}
uVar12 = uVar3;
if (puVar2[4] == 0) {
uVar12 = ((uVar3 & 0xff00) + uVar3 * 0x10000) * 0x100 + (uVar3 >> 8 & 0xff00) +
(uVar3 >> 0x18);
}
uVar7 = uVar21;
uVar8 = uVar21;
local_60 = uVar11;
if (uVar12 != puVar2[6]) {
param_1[4] = (longlong)"incorrect data check";
*puVar2 = 0x1d;
uVar7 = uVar16;
uVar8 = uVar3;
break;
}
}
*puVar2 = 0x1b;
case 0x1b:
if ((puVar2[2] != 0) && (uVar16 = uVar7, uVar3 = uVar8, puVar2[4] != 0)) {
for (; uVar16 < 0x20; uVar16 = uVar16 + 8) {
uVar7 = uVar16;
uVar8 = uVar3;
uVar13 = 0;
uVar12 = local_64;
if (uVar15 == 0) goto LAB_1401c4abe;
bVar1 = *_Src;
bVar9 = (byte)uVar16;
uVar15 = uVar15 - 1;
_Src = _Src + 1;
uVar3 = uVar3 + ((uint)bVar1 << (bVar9 & 0x1f));
}
uVar7 = uVar21;
uVar8 = uVar21;
if (uVar3 != puVar2[7]) {
param_1[4] = (longlong)"incorrect length check";
*puVar2 = 0x1d;
uVar7 = uVar16;
uVar8 = uVar3;
break;
}
}
*puVar2 = 0x1c;
switchD_1401c42e1_caseD_1c:
local_res18 = 1;
uVar13 = uVar15;
uVar12 = local_64;
goto LAB_1401c4abe;
case 0x1c:
goto switchD_1401c42e1_caseD_1c;
case 0x1d:
local_res18 = -3;
goto LAB_1401c4abe;
case 0x1e:
goto LAB_1401c4b19;
}
LAB_1401c4918:
uVar16 = *puVar2;
} while( true );
}