handle_compress
0x0028e000 · 944 bytes · __regparm3
_ZL15handle_compressP9bz_stream.isra.2
Decompiled
undefined (1 param)
/* handle_compress(bz_stream*) [clone .isra.2] */
bool __regparm3 handle_compress(bz_stream *param_1)
{
uint uVar1;
bool bVar2;
byte bVar3;
bool bVar4;
bool bVar5;
int iVar6;
int iVar7;
int *piVar8;
uint uVar9;
bVar2 = false;
iVar6 = *(int *)(param_1 + 8);
bVar5 = false;
do {
while (iVar6 != 1) {
if (iVar6 == 2) {
iVar7 = *(int *)(param_1 + 4);
iVar6 = *(int *)(param_1 + 0x44);
goto LAB_0028e0ea;
}
}
bVar3 = 0;
bVar4 = bVar2;
LAB_0028e030:
iVar6 = *(int *)param_1;
while (*(int *)(iVar6 + 0x14) != 0) {
if (*(int *)(param_1 + 0x4c) <= *(int *)(param_1 + 0x50)) {
iVar7 = *(int *)(param_1 + 4);
goto joined_r0x0028e25f;
}
**(undefined1 **)(iVar6 + 0x10) =
*(undefined1 *)(*(int *)(param_1 + 0x2c) + *(int *)(param_1 + 0x50));
*(int *)(param_1 + 0x50) = *(int *)(param_1 + 0x50) + 1;
*(int *)(*(int *)param_1 + 0x14) = *(int *)(*(int *)param_1 + 0x14) + -1;
*(int *)(*(int *)param_1 + 0x10) = *(int *)(*(int *)param_1 + 0x10) + 1;
*(int *)(*(int *)param_1 + 0x18) = *(int *)(*(int *)param_1 + 0x18) + 1;
iVar6 = *(int *)param_1;
if (*(int *)(iVar6 + 0x18) == 0) {
*(int *)(iVar6 + 0x1c) = *(int *)(iVar6 + 0x1c) + 1;
bVar3 = 1;
goto LAB_0028e030;
}
bVar3 = 1;
}
bVar2 = (bool)(bVar4 | bVar3);
if (*(int *)(param_1 + 0x50) < *(int *)(param_1 + 0x4c)) goto LAB_0028e284;
iVar7 = *(int *)(param_1 + 4);
joined_r0x0028e25f:
if (((iVar7 == 4) && (bVar2 = (bool)(bVar4 | bVar3), *(int *)(param_1 + 0xc) == 0)) &&
((0xff < *(uint *)(param_1 + 0x34) || (*(int *)(param_1 + 0x38) < 1)))) goto LAB_0028e284;
bVar2 = (bool)(bVar4 | bVar3);
*(undefined4 *)(param_1 + 0x44) = 0;
iVar6 = 0;
*(undefined4 *)(param_1 + 0x4c) = 0;
*(undefined4 *)(param_1 + 0x50) = 0;
*(undefined4 *)(param_1 + 0x260) = 0xffffffff;
do {
param_1[iVar6 + 0x58] = (bz_stream)0x0;
iVar6 = iVar6 + 1;
} while (iVar6 != 0x100);
*(int *)(param_1 + 0x26c) = *(int *)(param_1 + 0x26c) + 1;
iVar6 = 0;
*(undefined4 *)(param_1 + 8) = 2;
if (iVar7 == 3) {
if ((*(int *)(param_1 + 0xc) == 0) &&
((0xff < *(uint *)(param_1 + 0x34) || (*(int *)(param_1 + 0x38) < 1)))) goto LAB_0028e284;
LAB_0028e0f3:
if ((*(int *)(param_1 + 0x48) <= iVar6) || (piVar8 = *(int **)param_1, piVar8[1] == 0))
goto LAB_0028e1f4;
if (*(int *)(param_1 + 0xc) != 0) {
do {
uVar9 = (uint)*(byte *)*piVar8;
uVar1 = *(uint *)(param_1 + 0x34);
if (uVar9 == uVar1) {
if (*(int *)(param_1 + 0x38) == 0xff) {
LAB_0028e1d8:
add_pair_to_block((EState *)param_1);
piVar8 = *(int **)param_1;
LAB_0028e131:
*(uint *)(param_1 + 0x34) = uVar9;
*(undefined4 *)(param_1 + 0x38) = 1;
}
else {
*(int *)(param_1 + 0x38) = *(int *)(param_1 + 0x38) + 1;
}
}
else {
if (*(int *)(param_1 + 0x38) != 1) {
if (uVar1 < 0x100) goto LAB_0028e1d8;
goto LAB_0028e131;
}
*(uint *)(param_1 + 0x260) =
*(int *)(param_1 + 0x260) << 8 ^
*(uint *)(BZ2_crc32Table + (uVar1 & 0xff ^ *(uint *)(param_1 + 0x260) >> 0x18) * 4)
;
param_1[uVar1 + 0x58] = (bz_stream)0x1;
*(char *)(*(int *)(param_1 + 0x24) + iVar6) = (char)uVar1;
*(int *)(param_1 + 0x44) = *(int *)(param_1 + 0x44) + 1;
*(uint *)(param_1 + 0x34) = uVar9;
piVar8 = *(int **)param_1;
}
*piVar8 = *piVar8 + 1;
*(int *)(*(int *)param_1 + 4) = *(int *)(*(int *)param_1 + 4) + -1;
*(int *)(*(int *)param_1 + 8) = *(int *)(*(int *)param_1 + 8) + 1;
if (*(int *)(*(int *)param_1 + 8) == 0) {
piVar8 = (int *)(*(int *)param_1 + 0xc);
*piVar8 = *piVar8 + 1;
}
iVar7 = *(int *)(param_1 + 0xc);
iVar6 = *(int *)(param_1 + 0x44);
*(int *)(param_1 + 0xc) = iVar7 + -1;
} while (((iVar6 < *(int *)(param_1 + 0x48)) && (piVar8 = *(int **)param_1, piVar8[1] != 0))
&& (iVar7 + -1 != 0));
bVar3 = 1;
goto LAB_0028e1eb;
}
LAB_0028e1fb:
if (*(uint *)(param_1 + 0x34) < 0x100) {
add_pair_to_block((EState *)param_1);
}
*(undefined4 *)(param_1 + 0x34) = 0x100;
*(undefined4 *)(param_1 + 0x38) = 0;
BZ2_compressBlock((EState *)param_1,*(int *)(param_1 + 4) == 4);
*(undefined4 *)(param_1 + 8) = 1;
bVar3 = 0;
bVar4 = bVar2;
goto LAB_0028e030;
}
LAB_0028e0ea:
if (iVar7 != 2) goto LAB_0028e0f3;
bVar3 = 0;
while ((iVar6 < *(int *)(param_1 + 0x48) && (piVar8 = *(int **)param_1, piVar8[1] != 0))) {
uVar9 = (uint)*(byte *)*piVar8;
uVar1 = *(uint *)(param_1 + 0x34);
if (uVar9 == uVar1) {
if (*(int *)(param_1 + 0x38) == 0xff) {
LAB_0028e360:
add_pair_to_block((EState *)param_1);
piVar8 = *(int **)param_1;
LAB_0028e2c1:
*(uint *)(param_1 + 0x34) = uVar9;
*(undefined4 *)(param_1 + 0x38) = 1;
}
else {
*(int *)(param_1 + 0x38) = *(int *)(param_1 + 0x38) + 1;
}
}
else {
if (*(int *)(param_1 + 0x38) != 1) {
if (uVar1 < 0x100) goto LAB_0028e360;
goto LAB_0028e2c1;
}
*(uint *)(param_1 + 0x260) =
*(int *)(param_1 + 0x260) << 8 ^
*(uint *)(BZ2_crc32Table + (uVar1 & 0xff ^ *(uint *)(param_1 + 0x260) >> 0x18) * 4);
param_1[uVar1 + 0x58] = (bz_stream)0x1;
*(char *)(*(int *)(param_1 + 0x24) + iVar6) = (char)uVar1;
*(int *)(param_1 + 0x44) = *(int *)(param_1 + 0x44) + 1;
*(uint *)(param_1 + 0x34) = uVar9;
piVar8 = *(int **)param_1;
}
*piVar8 = *piVar8 + 1;
*(int *)(*(int *)param_1 + 4) = *(int *)(*(int *)param_1 + 4) + -1;
*(int *)(*(int *)param_1 + 8) = *(int *)(*(int *)param_1 + 8) + 1;
if (*(int *)(*(int *)param_1 + 8) == 0) {
piVar8 = (int *)(*(int *)param_1 + 0xc);
*piVar8 = *piVar8 + 1;
}
iVar6 = *(int *)(param_1 + 0x44);
bVar3 = 1;
}
LAB_0028e1eb:
bVar5 = (bool)(bVar5 | bVar3);
if (*(int *)(param_1 + 4) != 2) {
LAB_0028e1f4:
if (*(int *)(param_1 + 0xc) == 0) goto LAB_0028e1fb;
}
if (*(int *)(param_1 + 0x48) <= *(int *)(param_1 + 0x44)) {
BZ2_compressBlock((EState *)param_1,'\0');
*(undefined4 *)(param_1 + 8) = 1;
bVar3 = 0;
bVar4 = bVar2;
goto LAB_0028e030;
}
if (*(int *)(*(int *)param_1 + 4) == 0) {
LAB_0028e284:
return bVar2 || bVar5;
}
iVar6 = *(int *)(param_1 + 8);
} while( true );
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.